اطلاعیه

Collapse
No announcement yet.

مشکل در ارتباط سریال بین دو میکرو

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

    #16
    پاسخ : مشکل در ارتباط سریال بین دو میکرو

    ممنون از راهنماییهاتون راه افتاد.
    یه سوال دیگه دارم اینکه چه جوری میتونم 16 یا 32 بیت به هم پیوسته را از طریق سریال انتقال بدم مگه UDR هشت بیت نیست

    دیدگاه


      #17
      پاسخ : مشکل در ارتباط سریال بین دو میکرو

      نوشته اصلی توسط msadegh
      ممنون از راهنماییهاتون راه افتاد.
      یه سوال دیگه دارم اینکه چه جوری میتونم 16 یا 32 بیت به هم پیوسته را از طریق سریال انتقال بدم مگه UDR هشت بیت نیست
      سلام ببین اول 8 بیت اول را می فرستیم بعد هشت بیت دوم را بعد هشت بیت دوم را *256 می کنی (یا همان 8 بیت به سمت چپ بعد + هشت بیت اول می کنی
      باد می وزد ...
      میتوانی در مقابلش هم دیوار بسازی ، هم آسیاب بادی
      تصمیم با تو است ...

      دیدگاه


        #18
        پاسخ : مشکل در ارتباط سریال بین دو میکرو

        نوشته اصلی توسط atrobot
        سلام ببین اول 8 بیت اول را می فرستیم بعد هشت بیت دوم را بعد هشت بیت دوم را *256 می کنی (یا همان 8 بیت به سمت چپ بعد + هشت بیت اول می کنی
        شرمنده منظورتون رو متوجه نشدم
        یعنی با وقفه اول هشت بیت در یافت میشه بعد با وقفه دوم هشت بیت دوم خب حالا اینا چه جوری باید باهم جمع بشن با توجه به اینکه تو روتین وقفه هر بار که دیتا میاد تو یه متغییر ثابت میریزیم منظورم اینکه باید فاصله زمانی باشه بینشون یا نه؟
        اگه میشه یه مثال بزنید ممنون میشم.

        دیدگاه


          #19
          پاسخ : مشکل در ارتباط سریال بین دو میکرو

          کد:
          unsigned int i;
          putchar(i&0xFF);
          putchar((i>>8)&0xFF);
          و برای دریافت عکس عملیات بالا را انجام بده
          موفق باشید
          امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

          دیدگاه


            #20
            پاسخ : پاسخ : مشکل در ارتباط سریال بین دو میکرو

            نوشته اصلی توسط Abbas Sarami
            کد:
            unsigned int i;
            putchar(i&0xFF);
            putchar((i>>8)&0xFF);
            و برای دریافت عکس عملیات بالا را انجام بده
            موفق باشید
            من از روش polling استفاده نکردم بلکه از روش وقفه استفاده میکنم
            برای فرستنده
            UDR = 0x22
            delay_ms(50)
            UDR = 0x33
            حالا موندم برای دریافت تو روتین وقفه چجوری بگیرمش
            ایا اصلا این طرز فرستادن درسته اگه درسته دریافتش با وقفه چطوریه؟؟

            دیدگاه


              #21
              پاسخ : مشکل در ارتباط سریال بین دو میکرو

              چه فرقی داره که شیوه ارسال شما چطوری هست ؟
              شما دیتا 16 بیتی را به دو تا 8بیت تقسیم کن و ارسال کن، هنگام دریافت کنار هم قرار بده و ...
              شما یک بافر برای دریافت قرار بده، تعداد بایت در هر ارسال را ثابت در نظر بگیر (مثلاً8 بایت در هر ارسال)

              برای polling این پست را ببین (میتونی همین را برای وقفه بنویسی)
              http://www.eca.ir/forum2/index.php?topic=76250.msg458151#msg458151
              امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه


                #22
                پاسخ : مشکل در ارتباط سریال بین دو میکرو

                چون دیدم تاپیک جدید زدی مجبور شدم دوباره توضیح بدم
                -------------------------
                کد:
                UDR = 0x22
                delay_ms(50)
                UDR = 0x33
                اولاً این کد که نوشتی نه وقفه هست و نه ارسال polling :NO:
                ------------------------
                کلاً برای ارسال و دریافت با وقفه ناچاری از بافر استفاده کنی:
                این ارسال با وقفه : (عدد 0x3031 که 16 بیتی هست ارسال میشه)
                کد:
                /*****************************************************
                Chip type        : ATmega32
                AVR Core Clock frequency: 11.059200 MHz
                *****************************************************/
                
                #include <mega32.h>
                
                #ifndef RXB8
                #define RXB8 1
                #define TXB8 0
                #define UPE 2
                #define DOR 3
                #define FE 4
                #define UDRE 5
                #define RXC 7
                #endif
                
                #define FRAMING_ERROR (1<<FE)
                #define PARITY_ERROR (1<<UPE)
                #define DATA_OVERRUN (1<<DOR)
                #define DATA_REGISTER_EMPTY (1<<UDRE)
                #define RX_COMPLETE (1<<RXC)
                
                
                #define StartSend() {tx_counter=0; UDR=tx_buffer[tx_counter++];}
                
                // USART Transmitter buffer
                #define TX_BUFFER_SIZE 2
                char tx_buffer[TX_BUFFER_SIZE];
                unsigned char tx_counter;
                
                interrupt [USART_TXC] void usart_tx_isr(void)
                {
                if (tx_counter<TX_BUFFER_SIZE) UDR=tx_buffer[tx_counter++];
                }
                
                
                
                
                unsigned int WORD;
                
                
                void main(void)
                {
                // USART initialization
                // Communication Parameters: 8 Data, 1 Stop, No Parity
                // USART Receiver: Off
                // USART Transmitter: On
                // USART Mode: Asynchronous
                // USART Baud Rate: 9600
                UCSRA=0x00;
                UCSRB=0x48;
                UCSRC=0x86;
                UBRRH=0x00;
                UBRRL=0x47;
                #asm("sei")
                
                WORD = 0x3031;
                
                tx_buffer[0] = WORD & 0xFF;
                tx_buffer[1] = (WORD >> 8)& 0xFF;
                 StartSend();
                  
                while (1)
                   {
                   }
                }
                و برای دریافت : (اگه دریافت 0x3031 باشه A.0 یک میشه)
                کد:
                /*****************************************************
                Chip type        : ATmega32
                AVR Core Clock frequency: 11.059200 MHz
                *****************************************************/
                
                #include <mega32.h>
                
                #ifndef RXB8
                #define RXB8 1
                #define TXB8 0
                #define UPE 2
                #define DOR 3
                #define FE 4
                #define UDRE 5
                #define RXC 7
                #endif
                
                #define FRAMING_ERROR (1<<FE)
                #define PARITY_ERROR (1<<UPE)
                #define DATA_OVERRUN (1<<DOR)
                #define DATA_REGISTER_EMPTY (1<<UDRE)
                #define RX_COMPLETE (1<<RXC)
                
                // USART Receiver buffer
                #define RX_BUFFER_SIZE 2
                char rx_buffer[RX_BUFFER_SIZE];
                
                unsigned char rx_counter;
                
                bit rx_buffer_overflow;
                
                interrupt [USART_RXC] void usart_rx_isr(void)
                {
                char status,data;
                status=UCSRA;
                data=UDR;
                if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                  {
                  rx_buffer[rx_counter++]=data;
                
                  if (rx_counter == RX_BUFFER_SIZE)
                   {
                   rx_counter=0;
                   rx_buffer_overflow=1;
                   }
                  }
                }
                
                unsigned int WORD;
                
                void main(void)
                {
                // USART initialization
                // Communication Parameters: 8 Data, 1 Stop, No Parity
                // USART Receiver: On
                // USART Transmitter: Off
                // USART Mode: Asynchronous
                // USART Baud Rate: 9600
                UCSRA=0x00;
                UCSRB=0x90;
                UCSRC=0x86;
                UBRRH=0x00;
                UBRRL=0x47;
                
                
                DDRA.0 =1;
                
                
                #asm("sei")
                
                while (1)
                   {
                     if(rx_buffer_overflow)
                    {           
                     rx_buffer_overflow =0;
                     WORD = rx_buffer[0] | (rx_buffer[1]<<8); 
                     if(WORD == 0x3031) PORTA.0=1;
                     }
                
                   }
                }
                دیگه تاپیک نزنیا
                موفق باشید
                امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                دیدگاه


                  #23
                  پاسخ : مشکل در ارتباط سریال بین دو میکرو

                  نوشته اصلی توسط Abbas Sarami
                  چون دیدم تاپیک جدید زدی مجبور شدم دوباره توضیح بدم
                  کارم گیر بود چون این بحثم موضوش چیز دیگه ای بود و غیر شما کسی نمیومد اینجا تاپیک زدم

                  دیدگاه

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