اطلاعیه

Collapse
No announcement yet.

مشکل با USART1 میکرو atmega128

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با USART1 میکرو atmega128

    با سلام
    من برای ارتباط سریالم میخوام از یوزارت1 میکروی مگا128 استفاده کنم. میدونم که نمیشه از توابع کتابخانه stdio.h برای این منظور استفاده کرد.
    روی یوزارت0 هم برنامه و همه چیز درست جواب میده. ولی یوزارت 1 رو نه
    روی یوزارت1 هم تایع putchar1 درست جواب میده ولی getchar1 حتی یه کاراکتر و هم درست دریافت نمیکنه
    ممنون میشم راهنماییم کنید
    یک سوال دیگه هم دارم از وقفه ی کدویزارد استفاده کردم. این تابع getchar1 همونجوری که اسمش میگه کاراکتر میگیره فقط و باید این کاراکترها ادغام بشند ؟
    من به خاطر وجود سنسور sht11 مجبورم حداکثر روی فرکانس 3مگ بمونم و همین سرعت انتقال دیتا رو پایین میاره و مجبور شدم همه ی داده هام رو توی یه رشته ادغام کنم و فقط یه رشته ارسال بشه. اگر از getchar استفاده کنم یعنی تاخیر خیلییی زیاد. درسته ؟ :surprised:
    راه حلی براش نیست ؟
    کد داخلی توابع puts و scanf چی هستن؟ نمیشه دستی نوشتشون ؟
    کد:
    void Send_Packet(void)
    {    
      
      UCSR1B=0x48; // TXCIE & TXEN == 1
      PORTD.4 =1; // Transfer Enable
      delay_ms(100);
    
      putchar1(Packet);
      
    }
    
    void Get_Sample(void)
    {
      UCSR1B=0x90; // RXCIE & RXEN == 1
      PORTD.4 =0; // Reciever Enable
      delay_ms(100);
    
      getchar1();
    }
    و این هم توابع خود کدویزارد که نمایش داده ی ارسال شده در تابع getchar1 قرار دارد.
    کد:
    // USART1 Receiver interrupt service routine
    interrupt [USART1_RXC] void usart1_rx_isr(void)
    {
    char status,data;
    status=UCSR1A;
    data=UDR1;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rx_buffer1[rx_wr_index1++]=data;
    #if RX_BUFFER_SIZE1 == 256
      // special case for receiver buffer size=256
      if (++rx_counter1 == 0) rx_buffer_overflow1=1;
    #else
      if (rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
      if (++rx_counter1 == RX_BUFFER_SIZE1)
       {
       rx_counter1=0;
       rx_buffer_overflow1=1;
       }
    #endif
      }
    }
    
    // Get a character from the USART1 Receiver buffer
    #pragma used+
    char str[10];
    char getchar1(void)
    {
    char data;
    while (rx_counter1==0);
    data=rx_buffer1[rx_rd_index1++];
    #if RX_BUFFER_SIZE1 != 256
    if (rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
    #endif
    #asm("cli")
    --rx_counter1;
    #asm("sei")
      itoa(data,str);
      glcd_outtextxy(40,100,str);
      glcd_clear(); 
    return data;
    }
    #pragma used-
    // USART1 Transmitter buffer
    #define TX_BUFFER_SIZE1 32
    char tx_buffer1[TX_BUFFER_SIZE1];
    
    #if TX_BUFFER_SIZE1 <= 256
    unsigned char tx_wr_index1,tx_rd_index1,tx_counter1;
    #else
    unsigned int tx_wr_index1,tx_rd_index1,tx_counter1;
    #endif
    
    // USART1 Transmitter interrupt service routine
    interrupt [USART1_TXC] void usart1_tx_isr(void)
    {
    if (tx_counter1)
      {
      --tx_counter1;
      UDR1=tx_buffer1[tx_rd_index1++];
    #if TX_BUFFER_SIZE1 != 256
      if (tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0;
    #endif
      }
    }
    
    // Write a character to the USART1 Transmitter buffer
    #pragma used+
    void putchar1(char c)
    {
    while (tx_counter1 == TX_BUFFER_SIZE1);
    #asm("cli")
    if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
      {
      tx_buffer1[tx_wr_index1++]=c;
    #if TX_BUFFER_SIZE1 != 256
      if (tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0;
    #endif
      ++tx_counter1;
      }
    else
      UDR1=c; 
      delay_ms(800);
    #asm("sei")
    }
    #pragma used-

    #2
    پاسخ : مشکل با USART1 میکرو atmega128

    کسی نظری نداره ؟

    دیدگاه


      #3
      پاسخ : مشکل با USART1 میکرو atmega128

      من هم این مشکلو دارم...
      بچه میگن باید توی اتمل استودیو کار کنی تا جواب مطلوب بگیری...

      دیدگاه


        #4
        پاسخ : مشکل با USART1 میکرو atmega128

        نوشته اصلی توسط Amir.H.A
        من هم این مشکلو دارم...
        بچه میگن باید توی اتمل استودیو کار کنی تا جواب مطلوب بگیری...
        جواب مطلوب یعنی چی ؟ اونجا هم یک کاراکتر یک کاراکتر مجبوریم دیتا ارسال و دریافت کنیم ؟

        دیدگاه


          #5
          پاسخ : مشکل با USART1 میکرو atmega128


          اگر از getchar استفاده کنم یعنی تاخیر خیلییی زیاد. درسته ؟
          بله! تا دیتایی نیاد میکرو هیچ کاری نمیکنه!
          راه حلی براش نیست ؟
          استفاده از وقفه
          کد داخلی توابع puts و scanf چی هستن؟ نمیشه دستی نوشتشون ؟
          این دستورات مجموعه ایی از مایکرو های پیچیده هستند...
          میتونی دستی بنویسیشون... ولی اعصاب و حوصله فولادین میخواد!
          در محل نصب کد ویژن کتابخانه stdio رو سرچ کن... محتوای توش در دسترسه!

          جواب مطلوب یعنی چی ؟ اونجا هم یک کاراکتر یک کاراکتر مجبوریم دیتا ارسال و دریافت کنیم ؟
          در اونجا میتونی جدا جدا کاراکتر و یا رشته بگیری و بفرستی...
          ضمناً رشته مجموعه ای از کاراکتر ها است. یعنی عبارت "HELLO!" خودش 6 تا کاراگتره!

          دیدگاه

          لطفا صبر کنید...
          X