اطلاعیه

Collapse
No announcement yet.

طریقه استفاده از USART در XMEGA

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

    طریقه استفاده از USART در XMEGA

    سلام.
    من این برنامه رو نوشتم.

    $regfile = "xm128a1def.dat"
    $crystal = 32000000
    $lib "xmega.lib"
    $external _xmegafix_clear
    $external _xmegafix_rol_r1014
    Config Osc = Enabled , 32mhzosc = Enabled
    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

    Dim W As Word

    Config Com5 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
    Open "COM5:" For Binary As #5

    Do
    Print #5 , "Shazdeh"
    Waitms 500
    Loop

    کریستال ایکسمگا رو 12مگاهرتز گذاشتم. بود ریت و اینها رو هم درست تنظیم کردم. اما اطلاعات ارسالی توی پورت اشتباه است. چرا؟

    #2
    پاسخ : طریقه استفاده از USART در XMEGA

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

    دیدگاه


      #3
      پاسخ : طریقه استفاده از USART در XMEGA

      نوشته اصلی توسط طراح
      کریستال 12 مگاهرتز با توجه به تنظیمات بالا، تاثیری در تعیین فرکانس ندارد. مسئله بعدی این است که آیا مشکل در ناصحیح بودن Baud Rate است و یا محتوای Data ارسالی غلط است. برای گرفتن جواب مناسب، سوالات خود را بصورت دقیق و با توضیح بیشتر مطرح کنید.
      این خوبه؟


      همش جای Shazdeh عبارت V©Z75/åë یا یه همچین چیزی رو میفرسته تو خروجی.

      دیدگاه


        #4
        پاسخ : طریقه استفاده از USART در XMEGA

        دوست شاید از باودریت باشه
        به شبیه ساز اکتفا نکن عملی تست کن

        دیدگاه


          #5
          پاسخ : طریقه استفاده از USART در XMEGA

          با سلام
          من در راهندازی 3 سریال به مشکل برخوردم
          هرکدوم از سریال هارو به یک وقفه نسبت دادم
          قبلا با دوتا سریال مشکلی نداشتم و الان ایجاد مشکل کرده
          و کاره تابع USART_InterruptDriver_Initialize(&USART_data, &USART, USART_DREINTLVL_LO_gc); چی هست
          در ضمن برروی پورت D از هردو تایمر فقط جهت سرریز استفاده شده ممکن است تداخلی داشته باشد

          کد:
          USART_data_t USART_data,USART_data2,USART_data3;
           #define USART1 USARTC0  //
           #define USART2 USARTE0  //
           #define USART3 USARTD0  //
          
          ///////////////////////////////////////////////////
           PORTE.DIRSET = PIN3_bm;
           PORTE.DIRCLR = PIN2_bm;
           USART_InterruptDriver_Initialize(&USART_data2, &USART2, USART_DREINTLVL_HI_gc);
           USART_Format_Set(USART_data2.usart, USART_CHSIZE_8BIT_gc,USART_PMODE_DISABLED_gc, false);
           USART_RxdInterruptLevel_Set(USART_data2.usart, USART_RXCINTLVL_HI_gc);
           USART_Baudrate_Set(&USART2, 12 , 0);
           USART_Tx_Enable(USART_data2.usart);
           USART_Rx_Enable(USART_data2.usart);
           
           /////////////////////////////////////////
           PORTD.DIRSET = PIN3_bm;
           PORTD.DIRCLR = PIN2_bm;
           USART_InterruptDriver_Initialize(&USART_data3, &USART3, USART_DREINTLVL_MED_gc);
           USART_Format_Set(USART_data3.usart, USART_CHSIZE_8BIT_gc,USART_PMODE_DISABLED_gc, false);
           USART_RxdInterruptLevel_Set(USART_data3.usart, USART_RXCINTLVL_MED_gc);
           USART_Baudrate_Set(&USART3, 12 , 0);
           USART_Tx_Enable(USART_data3.usart);
           USART_Rx_Enable(USART_data3.usart);
          
          
           /////////////////////////////////////////
          
          // PORTC.DIRSET = PIN3_bm;
           PORTC.DIRCLR = PIN2_bm;
           USART_InterruptDriver_Initialize(&USART_data, &USART1, USART_DREINTLVL_LO_gc);
           USART_Format_Set(USART_data.usart, USART_CHSIZE_8BIT_gc,USART_PMODE_DISABLED_gc, false);
           USART_RxdInterruptLevel_Set(USART_data.usart, USART_RXCINTLVL_LO_gc);
           USART_Baudrate_Set(&USART1, 12 , 0);
           //USART_Tx_Enable(USART_data.usart);
           USART_Rx_Enable(USART_data.usart);
          هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
          بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
          میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

          تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

          دیدگاه


            #6
            پاسخ : طریقه استفاده از USART در XMEGA

            نوشته اصلی توسط n340
            کار تابع USART_InterruptDriver_Initialize(&USART_data, &USART, USART_DREINTLVL_LO_gc); چی هست
            وظیفه این تابع، تعیین ماژول usart مورد استفاده و تعیین سطح وقفه و تعیین وضعیت اولیه بافرهای ارسال و دریافت است.

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

            دیدگاه


              #7
              پاسخ : طریقه استفاده از USART در XMEGA

              رسیو سریال اول در اینتراپت دریافت شده و از طریق سریال دوم بایت به بایت ارسال میشه
              و در همین حلقه چک میشه در صورتی که 'a' ارسال شد ،بیتی رو یک کنه

              کد:
              ISR(USARTE0_RXC_vect)
              { 
               while(!USART_IsRXComplete(&USART2));
               rx_buf[rx_len]=USART_GetChar(&USART2);
               if(++rx_len==RXLEN)
               {rx_len=0;}
                USART_PutChar(&USART1,USART_GetChar(&USART2));
               if(USART_GetChar(&USART2)=='a')
              {gsm_st=1;}
              }


              ولی با مشکل برخورد کردم ،که کاره صحیح رو انجام نمیداد
              اولین موردی که فکر میکنم نوع وقفه رسیو و USARTE0_DRE_vect از یک نوع نباید باشه
              دوم ایا ضروری است که اصلا وقفه ی USARTE0_DRE_vect رو داشته باشیم
              که تو رفرنس اتمل به این صورت تایین کرده بود
              کد:
              ISR(USARTE0_DRE_vect)
              {
              USART_DataRegEmpty(&USART_data2);
              }
              هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
              بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
              میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

              تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

              دیدگاه


                #8
                پاسخ : طریقه استفاده از USART در XMEGA

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

                دیدگاه


                  #9
                  پاسخ : طریقه استفاده از USART در XMEGA

                  در برنامه ی زیر قراره با لبه پایین رونده ی PC1 یک داده ی دلخواه از طریق پورت سریال ارسال بشه(تنظیمات اولیه ی یوزارت در برنامه ی MAIN انجام شده و از نظر تنظیمات اولیه مشکلی نداره) و این روند همیشه تکرار بشه.داخل وقفه ی خارجی 0 از وقفه ی یوزارت استفاده کردم(یه وقفه ی تودرتو) ولی برنامه کار نکرد.(هیچ داده ای روی پورت سریال قرار نگرفت.).اگه ممکنه راهنماییم کنید اشکالشو بفهمم.اصولا این وقفه ی تودرتو درست به کاربرده شده؟.ببخشید وقتتونو میگیرم.ممنون
                  کد:
                  #include "avr_compiler_.h"
                  
                  void main(void) 
                  {	 
                   
                   OSC_CTRL|=OSC_RC32MEN_bm;
                   while(!(OSC_STATUS & OSC_RC32MRDY_bm));
                   CCP = CCP_IOREG_gc;
                   CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
                   
                   OSC_PLLCTRL=OSC_PLLSRC_RC2M_gc|8;// 16 MHz
                   OSC_CTRL|=OSC_PLLEN_bm;
                   while(!(OSC_STATUS &OSC_PLLRDY_bm )); 
                   CCP=CCP_IOREG_gc;          
                   CLK_CTRL=CLK_SCLKSEL_PLL_gc;
                  
                   PORTC.DIRSET = PIN3_bm; // TXD0
                   USARTC0_CTRLC=0x03;
                   USARTC0_BAUDCTRLA=131; //Baud Rate = 115200
                   USARTC0_BAUDCTRLB=0xd0;
                   USARTC0_CTRLB=USART_TXEN_bm; 
                  
                   Init_INT0();	
                   while(1);
                  }
                  تابع init_int0 هم بصورت زیره: (کل برنامه همین بود)
                  کد:
                  void Init_INT0(void)
                  {
                   PORTC_PIN1CTRL=PORT_OPC_PULLDOWN_gc|PORT_ISC_FALLING_gc;
                   PORTC_INTCTRL=PORT_INT0LVL_LO_gc;
                   PORTC_INT0MASK=PIN1_bm;
                   PMIC_CTRL=PMIC_LOLVLEX_bm; 
                   sei(); 
                  }
                  
                  ISR(PORTC_INT0_vect)
                  {
                   PORTC_INTCTRL=0;
                   USARTC0_CTRLA=0X01;
                  
                    PMIC_CTRL=PMIC_LOLVLEX_bm; 
                   sei();
                  while(1);
                  }	
                  
                  ISR(USARTC0_DRE_vect)
                   {
                    USARTC0_DATA=0X01;
                    USARTC0_CTRLA=0X00;
                    PORTC_INTCTRL=PORT_INT0LVL_LO_gc;
                    sei();
                    while(1);
                   }

                  دیدگاه


                    #10
                    پاسخ : طریقه استفاده از USART در XMEGA

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

                    دیدگاه


                      #11
                      پاسخ : طریقه استفاده از USART در XMEGA

                      [برای انتقال دیتا از یک سنسور و انتقال آن به ماژول وایرلس RF XBee 3 کانال از میکرو فعال شده است (C1, D1, E1).برای دیدن اطلاعات ارسال شده توسط ماژول RF XBee از یک ماژول جفت شده بر روی پورت کامپیوتر استفاده میگردد. برد سنسور به طور مداوم اطلاعات را ارسال میکند که به کانال متصل شده C1 و کانال D1 به ماژول RF XBee متصل شده .وقفه دریافت اطلاعات هم بر روی دو کانال C1, D1 اعمال شده ، اما در عمل اطلاعاتی دریافت نمیگردد و میکرو قادر به خوندن اطلاعات ارسال شده توسط سنسور برد نیست. کد نوشته شده به صورت زیر است . بسیار سپاسگزام بابت راهنمایی

                      CPU_CCP = 0xD8; //Protected IO register Modes for CPU Configuration Change Protection.
                      OSC_CTRL = 0b10; // Enable 32MHz Internal RC Oscillator //
                      while ((OSC_STATUS & 0b10)==0) { // Wait to RC oscillator became stable and ready to be used //
                      ; // as the System Clock source. //
                      } //
                      CPU_CCP = 0xD8; //Protected IO register Modes for CPU Configuration Change Protection. //
                      CLK_CTRL = 1; // Select 32MHz Internal RC Oscillator as system clock //
                      CLK_PSCTRL = 0; // No division.

                      UARTC1_Init(38400); delay_ms(200);
                      UARTD1_Init(57600); delay_ms(200);
                      UARTE1_Init(57600); delay_ms(200);

                      RXCINTLVL0_USARTD1_CTRLA_bit=0; // Receive Complete Interrupt Level
                      RXCINTLVL1_USARTD1_CTRLA_bit=1; //The enabled interrupt will be triggered when the Receive Complete Interrupt Flag(RXCIF) in the STATUS register is set
                      RXEN_USARTD1_CTRLB_bit=1; //Enables the USART receiver.

                      RXCINTLVL0_USARTC1_CTRLA_bit=0; // Receive Complete Interrupt Level
                      RXCINTLVL1_USARTC1_CTRLA_bit=1; //The enabled interrupt will be triggered when the Receive Complete Interrupt Flag(RXCIF) in the STATUS register is set
                      RXEN_USARTC1_CTRLB_bit=1; //Enables the USART receiver.



                      CPU_SREG.B7=1; // Global interrupt enable
                      MEDLVLEN_bit =1; //Medium-level Interrupt Enable


                      void Read_Imu() iv IVT_ADDR_USARTC1_RXC ics ICS_AUTO // Trigged when received data in UART channel C1
                      {
                      ch=UARTC1_Read();
                      UARTD1_Write(ch);
                      }

                      void RF_Transmit() iv IVT_ADDR_USARTD1_RXC ics ICS_AUTO // Trigged when received data in UART channel D1
                      {
                      ch=UARTD1_Read();
                      UARTD1_Write(ch);
                      }

                      دیدگاه


                        #12
                        پاسخ : طریقه استفاده از USART در XMEGA

                        کدی که قرار داده اید با mikroC PRO نوشته شده و ظاهرا کامل هم نیست. اما از همین وضعیت فعلی کد مشخص است که اطلاعات دریافت شده توسط USARTC1 و USARTD1، توسط USARTD1 ارسال می شوند. اما در متن کد مشاهده نمی شود که بخش فرستنده Enable شده باشد (و پین آن هم باید بصورت خروجی تعریف شود). بنابراین حتی در صورت دریافت یک کاراکتر، توسط USARTD1 کارکتری نمی تواند ارسال شود (مگر اینکه این مقدار دهی در تابع UARTD1_Init انجام شده باشد که به دلیل عدم وجود جزئیات این تابع نمی توان در این مورد قضاوت کرد).
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


                          #13
                          پاسخ : طریقه استفاده از USART در XMEGA

                          با عرض سلام خدمت تمامی دوستان و تبریک عید مبعث به شما دوستان گرامی

                          راستش من یک سوال داشتم در مورد نحوه فعال سازی و ارسال دیتا از طریق USART
                          راستش من یک ماژول RFID دارم که به USARTD1 وصلش کردم الان میخوام باهاش تبادل اطلاعات کنم ولی نمیدونم چطور در Atmel Stadio پورت Usart رو فعال کنم و با ماژول تبادل اطلاعات کنم لازمه بگم که Band Rate هم برابر 19200 هستش یک نمونه از دستوراتی رو که هم باید واسه ماژول ارسال کنم اینجا قرار میدم:(دستورات باید پشت سر هم و به صورت هگز برای ماژول ارسال شود تا پاسخ دریافت گردد)

                          aa bb 06 00 00 00 07 01 03 05

                          لازم هست بگم ما با C# با ماژول ارتباط برقرار کردم و خواندن و نوشتن بروی کارت رو با C# انجام دادم الان میخوام تمامی این فعالیت هارو با میکرو انجام دهم ولی نمیدونم چگونه از طریق میکرو با ماژول ارتباط برقرار کنم

                          اگه امکانش هست تو نوشتن دستورات راهنماییم کنید ممنون میشم

                          دیدگاه


                            #14
                            پاسخ : طریقه استفاده از USART در XMEGA

                            AVR1307 را سرچ کنید. از خود شرکت اتمل هست. یک کتابخانه برای راه اندازی USART داره. استفاده ازش هم نسبتا ساده هست. البته اگر که با کد های C آشنایی داشته باشید.

                            دیدگاه


                              #15
                              پاسخ : طریقه استفاده از USART در XMEGA

                              راستش من برنامه نویس C بلد نیستم زیاد آشنایی با برنامه نویسی میکرو ندارم اگه بشه یک راهنمایی اولیه بهم بکنید ممنون میشم که بتونم یک شناخت اولیه راجب تعریف پورت USART داشته باشم
                              بازم از راهنماییتون کمال تشکر رو دارم

                              دیدگاه

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