اطلاعیه

Collapse
No announcement yet.

مشکل با usart و rs232

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

    مشکل با usart و rs232

    با سلام
    یه برنامه ناشیانه read & write نوشتم که مشکل داره مشکل اینجاست که اگه اون تابع send data رو پاک کنم برنامه خوندن از سریال درست کار میکنه اما وقتی این تابع که بیاد تو کار نه خوندن داریم نه نوشتن.هدف ارتباط با پورت سریال هست
    با تشکر از دوستان

    کد:
    #include <mega8.h>
    #include <stdio.h> 
    #include <delay.h>
    #include <alcd.h>
    #include <ctype.h>
    volatile char data,get;
    volatile unsigned char v1=19;
    interrupt [USART_RXC] void USART_RX_Complete(void)
    {
     data=UDR;
      get=toascii(data); 
          if(get==8)
          {
          lcd_clear();
          }
          lcd_putchar(data);
    } 
     
    void Send_Data(unsigned char data8)
    {   
    while(!(UCSRA & (1<<TXC)));
    UDR=data8;
    } 
    
    void main(void)
    {  
    UCSRA=0x00;
    UCSRB=0x18;                                          
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x67;
    delay_ms(1000);
    Send_Data(v1);
    #asm("sei");
    lcd_init(16);
    while (1)
       {    
          
        
         
    
       }
    }

    یا مثلا این یکی وقتی printf رو اضافه کنم دریافت دیگه کار نمیکنه

    کد:
    #include <mega8.h>
    #include <stdio.h> 
    #include <delay.h>
    #include <alcd.h>
    #include <ctype.h>
    volatile char data,get;
    volatile unsigned char v1=19;
    interrupt [USART_RXC] void USART_RX_Complete(void)
    {
     data=UDR;
      get=toascii(data); 
          if(get==8)
          {
          lcd_clear();
          }
          lcd_putchar(data);
    } 
    
    void main(void)
    {  
    UCSRA=0x00;
    UCSRB=0x18;                                              
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x67;
    delay_ms(1000);
    printf("sadeq");
    #asm("sei");
    lcd_init(16);
    while (1)
       {
       }
    }
    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

    #2
    پاسخ : مشکل با usart و rs232

    یک اشتباه کوچولو توی نوشتن تابع زیر داری :mrgreen:
    کد:
    void Send_Data(unsigned char data8)
    {   
    while(!(UCSRA & (1<<TXC)));
    UDR=data8;
    }
    شما وقتی به رجیستر UDR مقدار ندادی نمیتونی از رجیستر UCSRA اطلاعات درستی برای وضعیت ارسال بگیری
    کد را اینطور بنویس :
    کد:
    void Send_Data(unsigned char data)
    {   
    UDR=data;
    while(!(UCSRA & (1<<TXC)));
    }
    -----------------------------------------------------------
    یا مثلا این یکی وقتی printf رو اضافه کنم دریافت دیگه کار نمیکنه
    کد مشکلی نداره شاید رجیستر ها درست تنظیم نیستند :arrow:
    موفق باشید
    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

    دیدگاه


      #3
      پاسخ : مشکل با usart و rs232

      رجیسترهای سریال را هم اشتباه مقدار دادی :NO:
      دیتاشیت را بخون :read:
      وقفه دریافت اصلاً فعال نیست!
      بیت 7 رجیستر UCSRB را set کن
      کد:
      UCSRB=0x98;
      امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

      دیدگاه


        #4
        پاسخ : مشکل با usart و rs232

        سلام مهندس دستت مرسی
        برا printf جواب داد اما اون تابع رو سوتی دادم ولی نمی فهمم کجاست

        کد:
        #include <mega8.h>
        #include <stdio.h> 
        #include <delay.h>
        #include <alcd.h>
        #include <ctype.h>
        volatile char data,get;
        volatile unsigned char v1=19;/*v2=3;v3=5,v4=10;*/ 
        interrupt [USART_RXC] void USART_RX_Complete(void)
        {
         data=UDR;
          get=toascii(data); 
              if(get==8)
              {
              lcd_clear();
              }
              lcd_putchar(data);
        } 
         
        void Send_Data(unsigned char data8)
        {
         
        
        UDR=data8;  
        while(!(UCSRA & (1<<TXC))); 
        
        } 
        
        void main(void)
        {  
        UCSRA=0x00;
        UCSRB=0x98;                                           
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x67;
        delay_ms(1000);
        Send_Data(v1);
         /* printf("sadeq");*/
         #asm("sei");
        lcd_init(16);
        
        while (1)
           { 
           
             
        
           }
        }
        چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

        دیدگاه


          #5
          پاسخ : مشکل با usart و rs232

          برنامه شما به لحاظ کدنویسی برای ارتباط سریال مشکلی نداره ؛ فقط یک نکته را باید رعایت کنید:
          [glow=red,2,300]در روال وقفه هیچگاه ، هیچگونه تابعی را فراخوان نکنید [/glow]
          شما از دوتا تابع lcd_clear و lcd_putchar استفاده کردید که دریافت را دچار مشکل میکنه :biggrin:
          کد:
          interrupt [USART_RXC] void USART_RX_Complete(void)
          {
           data=UDR;
            get=toascii(data); 
                if(get==8)
                {
                lcd_clear();
                }
                lcd_putchar(data);
          }
          توابع را حذف کن و تست کن
          موفق باشید
          امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

          دیدگاه


            #6
            پاسخ : مشکل با usart و rs232

            سلامی دوباره
            خیلی گلی مهندس :nice:
            میخاستم یه متغییر رو ارسال کنم که با این printf نمیشه.اینو تست کردم نشد :
            کد:
            printf("%c",v1);
            با این یکی هم تست کردم اینم نشد.
            کد:
            puts(str);
            این یکی فقط این طور جواب میده،که متغییر نیست
            کد:
            volatile unsigned char str[]="sadeq";
            puts(str);
            بنظرتون چیکار کنم :rolleyes:
            چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

            دیدگاه


              #7
              پاسخ : مشکل با usart و rs232

              ممنون ، شما لطف دارید :redface:
              --------------------------------
              برای ارسال یک بایت از تابع putchar استفاده کنید:
              کد:
              char BYTE = 'A';
              putchar(BYTE);
              موفق باشید
              امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه


                #8
                پاسخ : مشکل با usart و rs232

                نمیفرسته مهندس
                (متغییر میخام بفرستم)
                کد:
                volatile unsigned char v1=19;
                putchar(v1);
                چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                دیدگاه


                  #9
                  پاسخ : مشکل با usart و rs232

                  مشکل جای دیگه ای هست ، مثالی هم که من زدم متغیر میفرسته!
                  با چی خروجی را میبینی ؟
                  کد:
                  volatile unsigned char v1=0x39;
                  putchar(v1);
                  کد بالا کرکتر "9" یعنی کد اسکی 0x39 را میفرسته :agree:
                  اگه جواب نگرفتی کل برنامه ات را بذار تا عیبش را پیدا کنم
                  به ریزه کاری ها خیلی دقت کن مثل همون تابع Send_Data که یک جابجایی کوچولو مشکلش را حل کرد

                  موفق باشید
                  امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                  دیدگاه


                    #10
                    پاسخ : مشکل با usart و rs232

                    سلام اینجوری که خیلی سخت میشه.ینی هرچی میخای بفرستی به هگز تبدیل کنی :question:
                    اون تابع send که درست نشد.اون تابع کلا برنامه رو فلج میکنه. :eek:
                    که v1=10 منظور یک عدد حقیقی هست
                    avr studio توابع بهتری نداره ازش استفاده کنم؟

                    کد:
                    #include <mega8.h>
                    #include <stdio.h> 
                    #include <delay.h>
                    #include <alcd.h>
                    #include <ctype.h>
                    volatile char data,get;
                    volatile unsigned char v1=10;
                    interrupt [USART_RXC] void USART_RX_Complete(void)
                    {
                     data=UDR;
                      get=toascii(data); 
                          if(get==8)
                          {
                          lcd_clear();
                          }
                          lcd_putchar(data);
                    } 
                    void main(void)
                    {  
                    UCSRA=0x00;
                    UCSRB=0x98;                                           
                    UCSRC=0x86;
                    UBRRH=0x00;
                    UBRRL=0x67;
                    delay_ms(1000);
                    putchar(v1);
                     #asm("sei");
                    lcd_init(16);
                    
                    while (1)
                       { 
                       
                         
                    
                       }
                    }
                    چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                    دیدگاه


                      #11
                      پاسخ : مشکل با usart و rs232

                      مشخصه که با مبنای اعداد مشکل داری. مهم مقدار هست نه نحوه نوشتن (مثلاً من دوست دارم باینری بنویسم و یا هگز)
                      ببین دوست من ؛ موقعی که من بخوام کرکتر A را ارسال کنم باید کد اسکی اون را ارسال کنم
                      کد اسکی (ASCII) چیست ؟ : http://en.wikipedia.org/wiki/ASCII
                      طبق جدول اسکی کد کرکتر "A" میشه 0x41 که معادل 65 دسیمال هست. و یا کرکتر "9" که میشه 0x39 که معادلش 57 دسیمال هست :arrow:
                      ------------------------------------------
                      اون تابع send که درست نشد.اون تابع کلا برنامه رو فلج میکنه
                      من تا توابع را تست نکنم در تالار قرار نمیدم ، تابع هیچ مشکلی نداره

                      ----------------------------------------
                      که v1=10 منظور یک عدد حقیقی هست
                      ارسال یک موضوعه ؛ دریافت یک موضوع دیگه.
                      شما مقدار 10 دسیمال را ارسال میکنی، با چی دریافت میکنی ؟ قبلاً پرسیدم جواب ندادی ، لطفاً سوالات را کامل جواب بده تا درست راهنمایی کنم
                      امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                      دیدگاه


                        #12
                        پاسخ : مشکل با usart و rs232

                        سلام مهندس جان جان
                        کد اسکی میدونم چیه.من میخاستم مقدار 10(عدد 10 نه باینری ) رو بفرستم.اون طرف گیرنده لب ویو هست .که در پست اول گفتم پورت سریال :bye
                        با این اوصاف باید ابتدا متغییرمون به کد اسکی تبدیل بشه بعدش ارسال بشه.مثلا بخایم sadeq رو بفرستیم باید تک تک کارکتر ها رو به صورت جدا هگز و ارسال بشن.بخاطر همین مسئله دردسر هم زیاد میشه(خصوصا لب ویو)
                        بابت اون تابع سند هم واقعا برنامه فلج میشه :eek: نمیدونم چرا :question:

                        کد:
                        #include <mega8.h>
                        #include <stdio.h> 
                        #include <delay.h>
                        #include <alcd.h>
                        #include <ctype.h>
                        volatile char data,get;
                        volatile unsigned char v1=19;/*v2=3;v3=5,v4=10;*/ 
                        interrupt [USART_RXC] void USART_RX_Complete(void)
                        {
                         data=UDR;
                          get=toascii(data); 
                              if(get==8)
                              {
                              lcd_clear();
                              }
                              lcd_putchar(data);
                        } 
                         
                        void Send_Data(unsigned char data8)
                        {
                         
                        
                        UDR=data8;  
                        while(!(UCSRA & (1<<TXC))); 
                        
                        } 
                        
                        void main(void)
                        {  
                        UCSRA=0x00;
                        UCSRB=0x98;                                           
                        UCSRC=0x86;
                        UBRRH=0x00;
                        UBRRL=0x67;
                        delay_ms(1000);
                        Send_Data(v1);
                         /* printf("sadeq");*/
                         #asm("sei");
                        lcd_init(16);
                        
                        while (1)
                           { 
                           
                             
                        
                           }
                        }
                        چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                        دیدگاه


                          #13
                          پاسخ : مشکل با usart و rs232

                          سلام مهندس جان جان
                          درست شد میگم که ناشیم همینه دیگه تابع به این خوبی و فوق العاده سنگین (لعنتی 20 درصد حافظه رو میگیره ) بغل گوشم نشسته بیخبر بودم.

                          کد:
                          printf("a is: %d ",a);
                          چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                          دیدگاه


                            #14
                            پاسخ : مشکل با usart و rs232

                            برای اصلاح اون تابع از بیت UDRE استفاده کن حل میشه:
                            این شرط را میتونی قبل ارسال هم چک کنید :arrow:
                            کد:
                            void Send_Data(unsigned char data8)
                            {
                            while ((UCSRA & (1<<UDRE))==0);
                            UDR=data8;
                            }

                            این هم مثال :
                            کد:
                            #include <mega8.h>
                            #include <stdio.h> 
                            #include <delay.h>
                            
                            interrupt [USART_RXC] void USART_RX_Complete(void)
                            {
                            char data;
                            data=UDR;
                            PORTB=data;
                                  
                            } 
                             
                            void Send_Data(unsigned char data8)
                            {
                            
                            UDR=data8;  
                            while ((UCSRA & (1<<UDRE))==0);
                            
                            } 
                            
                            void main(void)
                            {  
                            UCSRA=0x00;
                            UCSRB=0x98;                                           
                            UCSRC=0x86;
                            UBRRH=0x00;
                            UBRRL=0x47; //9600 in 11.059200MHz
                            
                             DDRB=0xFF;
                            
                            
                            Send_Data('A');
                            Send_Data('B');
                            Send_Data('B');
                            Send_Data('A');
                            Send_Data('S');
                            Send_Data('\r');
                            
                            printf("Serial Test");
                            
                            
                            #asm("sei");
                            while (1)
                               { 
                               
                                 
                            
                               }
                            }
                            موفق باشید
                            امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                            دیدگاه


                              #15
                              پاسخ : مشکل با usart و rs232

                              بسیار عالی
                              با این تابع میشه یک کارکتر ثابت رو ارسال کرد.میشه این تابع رو طوری تغییر داد تا مثل printf عمل کنه ؟
                              چه يافت آنــکه تــو را گم کرد وچه گم کرد آنـکه تــو را يافت.

                              دیدگاه

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