اطلاعیه

Collapse
No announcement yet.

سوال در ارتباط با USART

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

    سوال در ارتباط با USART

    با سلام خدمت دوستان
    در کار با USART وقفه RX رو فعال کرده ام
    با این حساب اطلاعات دریافتی توسط میکرو بر روی رجیستر UDR نوشته می شوند.
    من میخوام میخوام با دستور sprintf محتویات این رجیستر رو به خروجی بفرستم. یعنی اطلاعات دریافتی رو دوباره به خروجی بفرستم، اما هر کاری میکنم نمیشه...
    دوستانی که تجربه اش رو دارن ممنون میشم راهنمایی کنن

    #2
    پاسخ : سوال در ارتباط با USART

    اول محتویات داخل UDR رو بریز تو یک متغیر دیگه که خودت تعریفش کردی. بعد هر کاری دوست داشتی باهاش بکن.
    ---------
    .
    .
    ...........

    دیدگاه


      #3
      پاسخ : سوال در ارتباط با USART

      دقیقا سخن داداش کاملا صحیح است
      http://s6.uplod.ir/i/00674/9cm41hm4inx0.jpg

      دیدگاه


        #4
        پاسخ : سوال در ارتباط با USART

        نوشته اصلی توسط ajapyy
        اول محتویات داخل UDR رو بریز تو یک متغیر دیگه که خودت تعریفش کردی. بعد هر کاری دوست داشتی باهاش بکن.
        یله، این کار رو هم کردم، کد زیر رو مشاهده کنید،
        در case normal: من رجیستر UDR را رو داخل متغیر q ریختم بعد فرستادم برای نمایش، اون قسمتی که مربوط به %c است رو نشون نمیده نمیدونم مشکل کجاست :sad:
        کد:
        #include <mega32a.h>
        #include <stdio.h>
        #include <delay.h>
        #include <alcd.h>
        
          
         enum e_type{normal,
        send_data}menu ;
        unsigned char d[20],i2,r,q; 
         interrupt [USART_RXC] void usart_rx_isr(void)
        {
        
        if(UDR=='b')
        menu=send_data; 
        }
        // Declare your global variables here
        
        void main(void)
        {
        // Declare your local variables here
        
        unsigned char h1=4,m1=25,mm1=12,d1=3;
        float temp=1.7;
        int y1=2014,j;
        char i;
        
        
        
        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 9600
        UCSRA=0x00;
        UCSRB=0x98;
        UCSRC=0x06;
        UBRRH=0x00;
        UBRRL=0x33;
        
        #asm("sei")
        
        while (1)
           { 
           
           switch (menu){
           case normal: 
           q=UDR;
           sprintf(d,"UDR= %c",q);  
           puts(d); 
           delay_ms(1000);
           break;
           
           case send_data:
           delay_ms(5000); 
           sprintf(d," OK ",);  
           puts(d); 
           
           break;
        
           }
           }
        }

        دیدگاه


          #5
          پاسخ : سوال در ارتباط با USART

          داخل همون تابع وقفه بریز توی متغیر.
          من ندیدم جایی بیان و از UDR استفاده دیگه ای بکنند. همون اول میریزند داخل یک متغیر و تمام.
          ---------
          .
          .
          ...........

          دیدگاه


            #6
            پاسخ : سوال در ارتباط با USART

            نوشته اصلی توسط ajapyy
            داخل همون تابع وقفه بریز توی متغیر.
            من ندیدم جایی بیان و از UDR استفاده دیگه ای بکنند. همون اول میریزند داخل یک متغیر و تمام.
            خیلی ممنون مشکل حل شد
            برنامه ای که نوشتم تو پروتئوس جواب میده، اما وقتی برنامه رو میرزم رو میکرو و با هایپرترمینال میخوام باهاش ارتباط برقرار کنم، نمی تونم، یعنی میکرو دیتا میفرسته، ولی دیتایی که من میفرستم رو میکرو نمی تونه بخونه، یه جورایی ارتباط فقط 1 طرفه است!
            فیوز بیتی، چیزی باید تنظیم بشه!؟

            دیدگاه


              #7
              پاسخ : سوال در ارتباط با USART

              فیوز بیت نداره
              چطور میفهمید که میکرو نمیفهمه ؟!
              برای راحتی کار از توابع putchar و getchar استفاده کنید
              گفت که دیوانه نهی لایق این خانه نهی

              دیدگاه


                #8
                پاسخ : سوال در ارتباط با USART

                نوشته اصلی توسط Finder_

                چطور میفهمید که میکرو نمیفهمه ؟!
                چون همین برنامه در پروتئوس جواب داده،
                من با هایپر با میکرو دیتا رد و بدل می کنم، نکته ی خاصی در ارسال دیتا وجود داره؟
                دیتا میگیرم، وقتی هم دیتا ارسال میکنم، LED مربوطه روشن میشه، ولی میکرو عکس العملی نداره...!

                دیدگاه


                  #9
                  پاسخ : سوال در ارتباط با USART

                  توی برنامه دیدم فلگ ارسال و دریافت رو چک نمیکنید.
                  برای همین گفتم با اون توابع کار کنید
                  گفت که دیوانه نهی لایق این خانه نهی

                  دیدگاه


                    #10
                    پاسخ : سوال در ارتباط با USART

                    اگر دیتا میره و میاد اما اون چیزی که شما میخوای نیست، مشکل از باودریته. کلاک رو تو میکرو مثل پروتئوس گزاشتی ؟
                    شما بیا و مقدار دریافتی با میکرو رو توی یک پورت بریز.
                    ---------
                    .
                    .
                    ...........

                    دیدگاه


                      #11
                      پاسخ : سوال در ارتباط با USART

                      نوشته اصلی توسط ajapyy
                      اگر دیتا میره و میاد اما اون چیزی که شما میخوای نیست، مشکل از باودریته. کلاک رو تو میکرو مثل پروتئوس گزاشتی ؟
                      شما بیا و مقدار دریافتی با میکرو رو توی یک پورت بریز.
                      نه، من اطلاعاتی که میکرو میفرسته رو به درستی دریافت میکنم، ولی نمی تونم دیتا به میکرو بفرستم، برنامه ساده زیر رو نوشتم و در پروتئوس بدون مشکل کار میکنه(هم ارسال هم دریافت)، اما در عمل فقط ارسال میکرو کار میکنه !
                      کد:
                      #include <mega32a.h>
                      #include <delay.h>
                      #include <alcd.h>
                      #include <stdio.h>
                      
                      unsigned char a;
                      
                      void main(void)
                      {
                      // USART initialization
                      // Communication Parameters: 8 Data, 1 Stop, No Parity
                      // USART Receiver: On
                      // USART Transmitter: On
                      // USART Mode: Asynchronous
                      // USART Baud Rate: 9600
                      UCSRA=0x00;
                      UCSRB=0x18;
                      UCSRC=0x06;
                      UBRRH=0x00;
                      UBRRL=0x33;
                      
                      
                      lcd_init(20);
                      
                      // Global enable interrupts
                      #asm("sei")
                      
                      while (1)
                         {
                         a=getchar(); 
                         putchar(a);
                         }
                      }

                      دیدگاه


                        #12
                        پاسخ : سوال در ارتباط با USART

                        اگر برنامه همینه که نوشتی، چیزی نداره. فقط یک تاخیره کوچولو بین دو خط دریافت و ارسال بزار.
                        اون خط مربوط به UCSRC رو چطور تنظیم کردید ؟ و برای چی ؟
                        وقتی دیتا رو میرو می یره، اصلا چیزی می گیره ؟ منظورم اینه که دیتای تکراری رو میگیره یا هر بار تفاوت داره ؟
                        ---------
                        .
                        .
                        ...........

                        دیدگاه


                          #13
                          پاسخ : سوال در ارتباط با USART

                          نوشته اصلی توسط ajapyy
                          اگر برنامه همینه که نوشتی، چیزی نداره. فقط یک تاخیره کوچولو بین دو خط دریافت و ارسال بزار.
                          اون خط مربوط به UCSRC رو چطور تنظیم کردید ؟ و برای چی ؟
                          وقتی دیتا رو میرو می یره، اصلا چیزی می گیره ؟ منظورم اینه که دیتای تکراری رو میگیره یا هر بار تفاوت داره ؟
                          تاخیر هم گذاشتم کار نکرد،
                          رجیستر UCSRC برای تنظم تعداد بیت، Parity و ... است، کدها رو کدویژن تولید کرده
                          اصلا دیتا نمیگیره، چون اگه بگیره باید همون رو نشون بده، وقتی چیزی نشون نمیده معلومه که چیزی نمیگیره، من اینجوری فکر میکنم، برنامه خیلی ساده است، نمیدونم مشکل کجاست :sad:

                          دیدگاه

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