اطلاعیه

Collapse
No announcement yet.

مشکل در usart xmega

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

    مشکل در usart xmega

    با سلام
    من داشتم با usart در xmega32a4 کار میکردم. هدفم اینه که usart رو به صورت حالت چند پردازنده ای با یک مستر و چندتا اسلیو فعال کنم.
    مشکلی که الان دارم اینه که وقتی وقفه دریافت رو در مستر فعال میکنیم بدون این که داده ای رو دریافت کنه وارد وقفه میشه؟؟!! اما این مشکل در اسلیو وجود نداره.
    در ارسال داده از مستر به اسلیو مشکلی ندارم اما در حالت ارسال از اسلیو به مستر مشکل دارم.
    ممنون میشم اگه راهنمایی کنید. یا اگر یک کد نمونه دارید برام بذارید؟؟
    تشکر

    #2
    پاسخ : مشکل در usart xmega

    بدون وجود سورس برنامه و با یک توضیح کلی نمی توان به اینگونه سوالات پاسخ لازم را ارائه کرد.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : مشکل در usart xmega

      نوشته اصلی توسط طراح
      بدون وجود سورس برنامه و با یک توضیح کلی نمی توان به اینگونه سوالات پاسخ لازم را ارائه کرد.
      کد برنامه مربوط به فرستنده و گیرنده را ضمیمه کرده ام در صورت امکان آن را ملاحظه کنید
      با تشکر
      کد:
      //----------- Transmitter Master
      
      #define F_CPU 32000000UL
      #include "avr_compiler.h"
      #include "port_driver.h"
      #include "TC_driver.h"
      //#include "event_system_driver.h"
      #include "eeprom_driver.h"
      #include "usart_driver.h"
      #include "stdlib.h"
      
      #define SlaveAdd 0x01    //---------Slave add 
      
      /*! Define that selects the Usart used in example. */
      #define USART USARTE0
      
      /*! USART data struct used in example. */
      USART_data_t USART_data;
      
      #define LEDRedOn() (PORTR.OUTCLR=0x02)
      #define LEDRedOff() (PORTR.OUTSET=0x02)
      #define LEDGreenOn() (PORTR.OUTCLR=0x01)
      #define LEDGreenOff() (PORTR.OUTSET=0x01)
      
      
      struct _Flags
      {
        unsigned char RcvF:1;
      }Flags;
      
      unsigned char SlaveBoardStatus;
      
      void Initial(void);
      void SendDataPacket(unsigned char ,unsigned char);
      
      int main( void )
      {
        unsigned char i=0, j=0, k=0;
        
        //------------------------------------ Initializing the 32MHz clock 
        OSC.CTRL|=OSC_RC32MEN_bm;
        while(!(OSC.STATUS & OSC_RC32MRDY_bm));
        CCP=CCP_IOREG_gc;
        CLK.CTRL=CLK_SCLKSEL_RC32M_gc; 
        
        Initial();
        
        EEPROM_EraseAll();  
        EEPROM_FlushBuffer(); 
        EEPROM_DisableMapping();
        EEPROM_WriteByte(0x00,0x00,0); 
        
        Flags.RcvF=0;
        
        LEDRedOn();
        LEDGreenOn();
        delay_us(1000000);
        LEDGreenOff();
        LEDRedOff();
        
        while(1)
        {
          LEDRedOn();
          delay_us(1000000);
          SendDataPacket(SlaveAdd,i);  //-------------- send data from 0 to 255 
          if(i<255)
            i++;
          LEDRedOff();
          while(!Flags.RcvF);       //------------- Wait to recieve Acknoledge from slave 
          if(Flags.RcvF)         //------------- if recieved acknoledge 
          {
            Flags.RcvF=0;
            EEPROM_WriteByte(0,0,(SlaveBoardStatus));
            LEDGreenOn();
          }
          delay_us(1000000);
        }
       return 0;
      }
      
      //-----------------------
      void Initial(void)
      {
        //--------------------- On board LED Green & Red 
        PORTR.DIRSET = PIN0_bm | PIN1_bm;
        PORTR.OUTSET=0x3;
      
        //--------------------- usart initializing 
        /* This PORT setting is only valid to USARTE0 if other USARTs is used a
        * different PORT and/or pins are used. */
        /* PE1 (XCK0) as output. */
        PORTE.DIRSET = PIN1_bm;
        /* PE3 (TXD0) as output. */
        PORTE.DIRSET = PIN3_bm;
        /* PE2 (RXD0) as input. */
        PORTE.DIRCLR = PIN2_bm;
        
        sei();
        
        /* Use USARTE0 and initialize buffers. */
        USART_InterruptDriver_Initialize(&USART_data, &USART, USART_DREINTLVL_LO_gc);
        
        /* USARTE0, 9 Data bits, No Parity, 1 Stop bit. */
        USART_Format_Set(USART_data.usart, USART_CHSIZE_9BIT_gc,
                 USART_PMODE_DISABLED_gc, false);
        
        /* Enable RXC interrupt. */
        USART_RxdInterruptLevel_Set(USART_data.usart, USART_RXCINTLVL_LO_gc);
        USARTE0.CTRLC|=USART_CMODE_SYNCHRONOUS_gc;
        /* Set Baudrate:
        * Baudrate select = (1/(16*(((I/O clock frequency)/Baudrate)-1)
        *         = 12 
        */
        USART_Baudrate_Set(&USART, 12 , 0);
        
        /* Enable both RX and TX. */
        USART_Rx_Enable(USART_data.usart);
        USART_Tx_Enable(USART_data.usart);
        
        /* Enable PMIC interrupt level low. */
        PMIC.CTRL |= PMIC_LOLVLEX_bm;
      }
      
      
      
      ////----------------------------------- Send a Serial Data Packet
      void SendDataPacket(unsigned char CMDAdd,unsigned char ArgAdd)
      {
        while(!USART_IsTXDataRegisterEmpty(&USART));
        USARTE0.CTRLB |= USART_TXB8_bm;
        USART_PutChar(&USART, CMDAdd);
        while(!USART_IsTXDataRegisterEmpty(&USART));
        USARTE0.CTRLB &= ~USART_TXB8_bm;
        USART_PutChar(&USART, ArgAdd);
      }
      
      //-------------------------
      ISR(USARTE0_RXC_vect)
      {
        SlaveBoardStatus=USARTE0.DATA;
        Flags.RcvF=1;
      }

      و این هم کد گیرنده SLAVE

      کد:
      //--------------------reciever 
      
      #define F_CPU 32000000UL
      #include "avr_compiler.h"
      #include "port_driver.h"
      #include "TC_driver.h"
      //#include "event_system_driver.h"
      #include "eeprom_driver.h"
      #include "usart_driver.h"
      
      
      #define SlaveAdd 0x01    //----Reciever address
      
      /*! Define that selects the Usart used in example. */
      #define USART USARTE0
      //
      ///*! USART data struct used in example. */
      USART_data_t USART_data;
      
      #define LEDRedOn() (PORTB.OUTCLR=0x08)
      #define LEDRedOff() (PORTB.OUTSET=0x08)
      #define LEDGreenOn() (PORTD.OUTCLR=0x08)
      #define LEDGreenOff() (PORTD.OUTSET=0x08)
      
      
      struct _Flags
      {
        char RcvF:1;
      }Flags;
      
      struct _MasterCommand
      {
      
        unsigned char CMD;//command
        unsigned char AddArg;
      }MstrCommand;
      
      unsigned char RsvData;
      
      void Initial(void);
      void SendAnswer(unsigned char );
      
      int main( void )
      {
        
        //--------------------------------- initializing the 32MHz internal clock 
        OSC.CTRL|=OSC_RC32MEN_bm;
        while(!(OSC.STATUS & OSC_RC32MRDY_bm));
        CCP=CCP_IOREG_gc;
        CLK.CTRL=CLK_SCLKSEL_RC32M_gc; 
        
        Initial();
        
        EEPROM_EraseAll();  
        EEPROM_FlushBuffer(); 
        EEPROM_DisableMapping();
        EEPROM_WriteByte(0x00,0x00,0); 
      
        delay_us(1000000);
        
        LEDGreenOff();
        LEDRedOff();
        
        Flags.RcvF=0;
        while(1)
        {
          if(Flags.RcvF)   //--------- if Data recieved from Master
          {
            LEDRedOn();
            Flags.RcvF=0;
            EEPROM_WriteByte(0,0,(MstrCommand.AddArg)); //----------Writing the recieved data on EEPROM 
            SendAnswer(5);
            delay_us(1000);
            LEDGreenOff();
          }
          LEDRedOff();
        }
       return 0;
      }
      
      //-----------------------
      void Initial(void)
      {
        //--------------------- On board LED----Green & Red LEDs 
        PORTD.DIRSET = PIN3_bm ;
        PORTD.OUTSET=0x80;
        PORTB.DIRSET = PIN3_bm ;
        PORTB.OUTSET=0x80;
        //--------------------- usart initializing 
        /* This PORT setting is only valid to USARTE0 if other USARTs is used a
        * different PORT and/or pins are used. */
        /* PE1 (XCK0) as input. */
        PORTE.DIRCLR = PIN1_bm;
        /* PE3 (TXD0) as output. */
        PORTE.DIRSET = PIN3_bm;
        /* PE2 (RXD0) as input. */
        PORTE.DIRCLR = PIN2_bm;
        
        sei();
        
        /* Use USARTE0 and initialize buffers. */
        USART_InterruptDriver_Initialize(&USART_data, &USART, USART_DREINTLVL_LO_gc);
        
        /* USARTE0, 9 Data bits, No Parity, 1 Stop bit. */
        USART_Format_Set(USART_data.usart, USART_CHSIZE_9BIT_gc,
                 USART_PMODE_DISABLED_gc, false);
        
        /* Enable RXC interrupt. */
        USART_RxdInterruptLevel_Set(USART_data.usart, USART_RXCINTLVL_LO_gc);
        USARTE0.CTRLC|=USART_CMODE_SYNCHRONOUS_gc;
        USARTE0.CTRLB|=(USART_MPCM_bm);
        /* Set Baudrate:
        * Baudrate select = (1/(16*(((I/O clock frequency)/Baudrate)-1)
        *         = 12 
        */
        USART_Baudrate_Set(&USART, 12 , 0);
        
        /* Enable both RX and TX. */
        USART_Rx_Enable(USART_data.usart);
        //USART_Tx_Enable(USART_data.usart);
        
        /* Enable PMIC interrupt level low. */
        PMIC.CTRL |= PMIC_LOLVLEX_bm;
      }
      
      //-------------------------
      ISR(USARTE0_RXC_vect)
      {
        RsvData=USARTE0.DATA;
        if((USARTE0.CTRLB&(USART_MPCM_bm))&&((RsvData&0x0f)==SlaveAdd)) //--------Check the address 
        {
          USARTE0.CTRLB&=~(USART_MPCM_bm);
          LEDGreenOn();
        }
        else if(!(USARTE0.CTRLB&(USART_MPCM_bm)))    //------------recieving data 
        {
          MstrCommand.AddArg=RsvData; 
          USARTE0.CTRLB|=(USART_MPCM_bm);    
          Flags.RcvF=1; 
        }
      }
      
      //-------------------- Send a byte from USART salve to Master 
      void SendAnswer(unsigned char tmp)
      {
        while(!(USARTE0.STATUS & USART_DREIF_bm))
        PORTE.DIRSET = PIN3_bm;
        PORTE.OUTSET = PIN3_bm;
        USARTE0.CTRLB |= USART_TXEN_bm;
        USARTE0.CTRLB &= ~USART_TXB8_bm;    
        USARTE0.DATA=tmp;
        while(!(USARTE0.STATUS & USART_DREIF_bm)) 
        USARTE0.CTRLB &= ~(USART_TXEN_bm);
        PORTE.OUTCLR = PIN3_bm;// Tri-state !!! 
        PORTE.DIRCLR = PIN3_bm;// Tri-state !!! 
      }

      دیدگاه


        #4
        پاسخ : مشکل در usart xmega

        توضیح این که داده ها از Trnsmitter به Reciever درست ارسال میشه
        اما پاسخی که Recieverآ‌ به Transmitter ارسال میکنه درست دریافت نمیشه؟!
        و مشکل دیگه این که Transmitter بدون این که داده ای رو دریافت کنه وارد وقفه دریافت میشه!!

        دیدگاه


          #5
          پاسخ : مشکل در usart xmega

          در برنامه شما نوع ارتباط بصورت سنکرون تعریف شده است. بنابراین باید پایه XCK هم متصل باشد و سوال اول این است که آیا این نوع ارتباط مورد نظر بوده یا خیر. مطلب بعدی اینکه شما چطور از وارد شدن برنامه به وقفه در صورت عدم پاسخ slave مطلع می شوید و آیا پایه ها را قطع می کنید و یا در برنامه تغییر می دهید و کلا نسبت به آرایش سخت افزاری و نحوه انصالات و مراحل تست و غیره بیشتر توضیح دهید تا بر اساس آن بتوان راهنمایی لازم را انجام داد.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #6
            پاسخ : مشکل در usart xmega

            با تشکر از پاسخگویی شما
            در برنامه شما نوع ارتباط بصورت سنکرون تعریف شده است. بنابراین باید پایه XCK هم متصل باشد و سوال اول این است که آیا این نوع ارتباط مورد نظر بوده یا خیر. مطلب بعدی اینکه شما چطور از وارد شدن برنامه به وقفه در صورت عدم پاسخ slave مطلع می شوید و آیا پایه ها را قطع می کنید و یا در برنامه تغییر می دهید و کلا نسبت به آرایش سخت افزاری و نحوه انصالات و مراحل تست و غیره بیشتر توضیح دهید تا بر اساس آن بتوان راهنمایی لازم را انجام داد.
            در پاسخ شما باید عرض کنم که ارتباط سنکرون مورد نظر بوده است. و پایه XCK هم متصل است. و کلاک روی آن در عمل هم مشاهده میشود.
            همانطور که در برنامه فرستنده master ملاحظه میکنید وقفه دریافت آن فعال شده است.در هنگام ورود به وقفه دریافت سریال یک فلگ به نام Flags.RcvF در بردار وقفه مقدارش یک می شود. و با یک شدن مقدار این فلگ در حلقه اصلی برنامه یک LED روشن می شود که به وضوح در حلقه while اصلی برنامه مشخص است.
            حالا با این که من پایه های ارتباطی دو میکرو را از هم قطع می کنم اما باز هم برنامه master مرتبا وارد وقفه دریافت شده و led روشن می شود. در صورتی که با عدم فعال کردن وقفه در یافت led دیگر روشن نمیشود.
            در حالت ارسال از maste به slave مشکلی نیست و داده ها درست دریافت می شوند
            همانطور که میبینید من به slave هم آدرس 0x01آ‌ را اختصاص داده ام.
            با تشکر

            دیدگاه


              #7
              پاسخ : مشکل در usart xmega

              در مد Master به دلیل سنکرون بودن ارتباط و اینکه بیت RXEN یک شده صرف نظر از اینکه Slave به آن متصل باشد یا نه ، دریافت انجام می شود. برای رفع این مشکل می توانید بعد از ارسال به Slave، امکان دریافت را فعال کنید.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : مشکل در usart xmega

                آیا برنامه من در قسمت گیرنده دارای اشکالی است؟
                چون به درستی نمی کند.
                با تشکر

                دیدگاه


                  #9
                  پاسخ : مشکل در usart xmega

                  قبلا اعلام کرده بودید که بخش Slave درست عمل می کند. بنابراین منظور از درست عمل نکردن این بخش چیست؟
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #10
                    پاسخ : مشکل در usart xmega

                    بله در قسمت slave داده ها درست ارسال می شوند اما پاسخ از masterآ‌ به slaveآ‌ درست ارسال نمی شود؟؟!!!

                    دیدگاه

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