اطلاعیه

Collapse
No announcement yet.

rs232 .در xmega

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

    #16
    پاسخ : rs232 .در xmega

    با سلام . آی سی رو عوض کردم درست شد و دیگه اضافه جریان نداره

    حالا میخواستم با استفاده از وقفه گیرنده سریال رو راه بندازم . به نظر شما استفاده از AVR1307 برای این کار مناسب هستش ؟ تو برنامه های پیچیده تر گیر نمیکنه؟ تو برنامه هایی که نیاز به پردازش سریعتری داره؟ یه تیکه از کدی که داخل 1307 اومده به نظرم یه مقدار بیشتر جای کار داره . این تیکه از کد میاد تازمانی که کل تعداد بافر تعریف شده پر نشده درون یک حلقه صبر میکنه و برنامه در بعضی حالتها ممکنه اونجا گیر کنه. مثلا ممکنه ما یه بافر 8 بایتی تعریف کرده باشیم اما بعضی از کلماتی که میکرو از طریق گیرنده سریال دریافت میکنه مثلا 5 بایت باشه و فرستنده منتظر عکس العمل از سوی میکرو هستش . در حالیکه میکرو توی حلقه گیر کرده . اینم اون تیکه کد مربوطه هستش
    کد:
    	/* Fetch received data as it is received. */
    	i = 0;
    	while (i < NUM_BYTES) {
    		if (USART_RXBufferData_Available(&USART_data)) {
    			receiveArray[i] = USART_RXBuffer_GetByte(&USART_data);
    			i++;
    		}
    	}
    البته توی ویزارد codevision یه کدی تولید میکنه که فکر کنم کامل باشه و با اندکی تغییر میشه به IAR تبدیلش کرد . به نظر شما از کدوم استفاده کنم؟

    کد:
    // USARTD0 initialization
    void usartd0_init(void)
    {
    // Note: the correct PORTD direction for the RxD, TxD and XCK signals
    // is configured in the ports_init function
    
    // Communication mode: Asynchronous USART
    // Data bits: 8
    // Stop bits: 1
    // Parity: Disabled
    USARTD0.CTRLC=USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc;
    
    // Receive complete interrupt: Low Level
    // Transmit complete interrupt: Disabled
    // Data register empty interrupt: Disabled
    USARTD0.CTRLA=(USARTD0.CTRLA & (~(USART_RXCINTLVL_gm | USART_TXCINTLVL_gm | USART_DREINTLVL_gm))) |
    	USART_RXCINTLVL_LO_gc | USART_TXCINTLVL_OFF_gc | USART_DREINTLVL_OFF_gc;
    
    // Required Baud rate: 9600
    // Real Baud Rate: 9601.0 (x1 Mode), Error: 0.0 %
    USARTD0.BAUDCTRLA=0xF5;
    USARTD0.BAUDCTRLB=((0x0C << USART_BSCALE_bp) & USART_BSCALE_gm) | 0x0C;
    
    // Receiver: On
    // Transmitter: Off
    // Double transmission speed mode: Off
    // Multi-processor communication mode: Off
    USARTD0.CTRLB=(USARTD0.CTRLB & (~(USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm | USART_MPCM_bm | USART_TXB8_bm))) |
    	USART_RXEN_bm;
    }
    
    // USARTD0 Receiver buffer
    #define RX_BUFFER_SIZE_USARTD0 8
    char rx_buffer_usartd0[RX_BUFFER_SIZE_USARTD0];
    
    #if RX_BUFFER_SIZE_USARTD0 <= 256
    unsigned char rx_wr_index_usartd0=0,rx_rd_index_usartd0=0,rx_counter_usartd0=0;
    #else
    unsigned int rx_wr_index_usartd0=0,rx_rd_index_usartd0=0,rx_counter_usartd0=0;
    #endif
    
    // This flag is set on USARTD0 Receiver buffer overflow
    bit rx_buffer_overflow_usartd0=0;
    
    // USARTD0 Receiver interrupt service routine
    interrupt [USARTD0_RXC_vect] void usartd0_rx_isr(void)
    {
    unsigned char status;
    char data;
    
    status=USARTD0.STATUS;
    data=USARTD0.DATA;
    if ((status & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm)) == 0)
      {
      rx_buffer_usartd0[rx_wr_index_usartd0++]=data;
    #if RX_BUFFER_SIZE_USARTD0 == 256
      // special case for receiver buffer size=256
      if (++rx_counter_usartd0 == 0) rx_buffer_overflow_usartd0=1;
    #else
      if (rx_wr_index_usartd0 == RX_BUFFER_SIZE_USARTD0) rx_wr_index_usartd0=0;
      if (++rx_counter_usartd0 == RX_BUFFER_SIZE_USARTD0)
       {
       rx_counter_usartd0=0;
       rx_buffer_overflow_usartd0=1;
       }
    #endif
      }
    }
    
    // Receive a character from USARTD0
    #pragma used+
    char getchar_usartd0(void)
    {
    char data;
    
    while (rx_counter_usartd0==0);
    data=rx_buffer_usartd0[rx_rd_index_usartd0++];
    #if RX_BUFFER_SIZE_USARTD0 != 256
    if (rx_rd_index_usartd0 == RX_BUFFER_SIZE_USARTD0) rx_rd_index_usartd0=0;
    #endif
    #asm("cli")
    --rx_counter_usartd0;
    #asm("sei")
    return data;
    }
    #pragma used-
    "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
    در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

    دیدگاه


      #17
      پاسخ : rs232 .در xmega

      یه اشکال دیگه هم خیلی اذیت میکنه . کد زیر رو برای ارسال کاراکتر A به کامپیوتر استفاده میکنم . از کریستال خارجی 16 مگ استفاده کردم که با pll به 32 مگ میرسونمش.
      با کاهش تاخیر بعد از دستور ارسال کاراکتر p به کامپیوتر میرسه . با افزایش تاخیر مثلا حدود 2 میلی ثانیه درست ارسال میشه . به نظر شما اشکال از چیه ؟
      ممنون
      کد:
      #define F_CPU 32000000UL
      
      #include "avr_compiler.h"
      #include "port_driver.h"
      
      
      void main()
      {
       
        OSC_XOSCCTRL =OSC_FRQRANGE_12TO16_gc|OSC_XOSCSEL_XTAL_16KCLK_gc;
        OSC_PLLCTRL =OSC_PLLSRC_XOSC_gc|2;
        OSC_CTRL |=OSC_XOSCEN_bm;
        while(!(OSC.STATUS & OSC_XOSCRDY_bm));
        OSC_CTRL |=OSC_PLLEN_bm;
        while(!(OSC.STATUS & OSC_PLLRDY_bm));
        CCP=0xd8;
        CLK.CTRL=CLK_SCLKSEL_PLL_gc;
       
        
      // OSC_CTRL|=OSC_RC32MEN_bm;
       //while(!(OSC_STATUS & OSC_RC32MRDY_bm));
       //CCP=CCP_IOREG_gc;
       //CLK_CTRL=CLK_SCLKSEL_RC32M_gc; 
       
       PORTD.DIRSET = PIN3_bm; // TXD0
       USARTD0_CTRLC=USART_CMODE_ASYNCHRONOUS_gc|USART_PMODE_DISABLED_gc|USART_CHSIZE_8BIT_gc; 
       USARTD0_BAUDCTRLA=0xf5; //Baud Rate = 9600
       USARTD0.BAUDCTRLB=0xcc;
      
       USARTD0_CTRLB=USART_RXEN_bm|USART_TXEN_bm; 
       PMIC_CTRL=PMIC_LOLVLEN_bm;    //set low level interrupt enable  
       __enable_interrupt(); 
       
       while(1)
       { 
         
        while( !(USARTD0_STATUS & USART_DREIF_bm));	//wait for data register empty
        USARTD0_DATA='A';	    //send data to PC
        delay_us(100); //
       } 
       
       
      }
      "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
      در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

      دیدگاه


        #18
        پاسخ : rs232 .در xmega

        چرا از کریستال خارجی استفاده می کنین؟
        در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

        1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
        2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
        3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

        دیدگاه


          #19
          پاسخ : rs232 .در xmega

          به خاطر اینکه کلاک پایدارتری رو به میکرو اعمال کنیم تا در برابر نویز مقاوم تر باشه و در برابر تغییرات دمایی فرکانس کلاک کمتر تغییر کنه .
          "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
          در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

          دیدگاه


            #20
            پاسخ : rs232 .در xmega

            نوشته اصلی توسط tictactoe
            به خاطر اینکه کلاک پایدارتری رو به میکرو اعمال کنیم تا در برابر نویز مقاوم تر باشه و در برابر تغییرات دمایی فرکانس کلاک کمتر تغییر کنه .
            فکر نکنم این مورد هیچ ارتباطی با نویز داشته باشه. بقیه موارد که فرمودین صحیح ولی به نظرم نویز شاید بیشتر هم بشه.
            در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

            1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
            2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
            3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

            دیدگاه


              #21
              پاسخ : rs232 .در xmega

              فکر کنم اینطوری بشه دامنه پالسهای اعمال شده به میکرو بالاتر از حالت کلاک داخلی باشه و نسبت نویز به سیگنال کمتر میشه و نویزهای دامنه کوتاه تاثیر کمتری بر روی کلاک میگذارند. حالا تا نظر دوستان چگونه باشد؟
              "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
              در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

              دیدگاه


                #22
                پاسخ : rs232 .در xmega

                من کاملا مطمئن نیستم. ولی پایه های خود کریستال به نظر جاذب نویز هستند. در حالی که منبع کلاک داخلی چنین پایه هایی نداره. ولی در ارتباط با دامنه شک دارم.
                در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                دیدگاه


                  #23
                  پاسخ : rs232 .در xmega

                  نوشته اصلی توسط tictactoe
                  این تیکه از کد میاد تازمانی که کل تعداد بافر تعریف شده پر نشده درون یک حلقه صبر میکنه و برنامه در بعضی حالتها ممکنه اونجا گیر کنه. مثلا ممکنه ما یه بافر 8 بایتی تعریف کرده باشیم اما بعضی از کلماتی که میکرو از طریق گیرنده سریال دریافت میکنه مثلا 5 بایت باشه و فرستنده منتظر عکس العمل از سوی میکرو هستش . در حالیکه میکرو توی حلقه گیر کرده . اینم اون تیکه کد مربوطه هستش
                  کد:
                  	/* Fetch received data as it is received. */
                  	i = 0;
                  	while (i < NUM_BYTES) {
                  		if (USART_RXBufferData_Available(&USART_data)) {
                  			receiveArray[i] = USART_RXBuffer_GetByte(&USART_data);
                  			i++;
                  		}
                  	}
                  در این کد NUM_BYTES بصورت ماکرو تعریف شده، اما در صورت نیاز می توانید مقدار آن را بصورت متغیر تعریف کنید. در مورد سوال بعدی هم تا جایی که محاسبه کردم، برای Baud Rate برابر با 9600 و کلاک 32 مگاهرتز، مقادیر رجیسترها را درست حساب نکرده اید.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #24
                    پاسخ : rs232 .در xmega

                    با سلام
                    من از یه سایت استفاده کردم که با استفاده از کلاک میکرو و سرعت مورد نیاز برای سریال خودش مقادیر مختلفی رو حساب میکنه و با توجه به مقدار درصد خطا من یکی رو که بهترین حالت هستش رو انتخاب کردم و از روی اون مقادیر رو جایگزین کردم . اگه اشتباهی هست لطف کنید یه مقدار توضیح بدین.
                    http://www.4shared.com/photo/djv6kfd..._baudrate.html



                    خیلی ممنون از توجهتون
                    "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
                    در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

                    دیدگاه


                      #25
                      پاسخ : rs232 .در xmega

                      کد ویژن توی ویزاردش همه این موارد را خودش حساب میکنه.
                      در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                      1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                      2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                      3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                      دیدگاه


                        #26
                        پاسخ : rs232 .در xmega

                        همین مقادیر درست است و در محاسبه بجای 4- عدد 2- را قرار داده بودم. ضمنا آدرس سایت مورد نظر را هم برای استفاده دوستان قرار می دهم:

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

                        دیدگاه


                          #27
                          پاسخ : rs232 .در xmega

                          با سلام
                          استاد با توجه به درست بودن تنظیمات سریال هنوزم مشکل قبلی هستش .
                          کد زیر رو برای ارسال کاراکتر A به کامپیوتر استفاده میکنم . از کریستال خارجی 16 مگ استفاده کردم که با pll به 32 مگ میرسونمش.
                          با کاهش تاخیر بعد از دستور ارسال کاراکتر p به کامپیوتر میرسه . با افزایش تاخیر مثلا حدود 2 میلی ثانیه درست ارسال میشه . به نظر شما اشکال از چیه ؟

                          ممنون
                          کد:
                          #define F_CPU 32000000UL
                          
                          #include "avr_compiler.h"
                          #include "port_driver.h"
                          
                          
                          void main()
                          {
                           
                            OSC_XOSCCTRL =OSC_FRQRANGE_12TO16_gc|OSC_XOSCSEL_XTAL_16KCLK_gc;
                            OSC_PLLCTRL =OSC_PLLSRC_XOSC_gc|2;
                            OSC_CTRL |=OSC_XOSCEN_bm;
                            while(!(OSC.STATUS & OSC_XOSCRDY_bm));
                            OSC_CTRL |=OSC_PLLEN_bm;
                            while(!(OSC.STATUS & OSC_PLLRDY_bm));
                            CCP=0xd8;
                            CLK.CTRL=CLK_SCLKSEL_PLL_gc;
                           
                            
                          // OSC_CTRL|=OSC_RC32MEN_bm;
                           //while(!(OSC_STATUS & OSC_RC32MRDY_bm));
                           //CCP=CCP_IOREG_gc;
                           //CLK_CTRL=CLK_SCLKSEL_RC32M_gc; 
                           
                           PORTD.DIRSET = PIN3_bm; // TXD0
                           USARTD0_CTRLC=USART_CMODE_ASYNCHRONOUS_gc|USART_PMODE_DISABLED_gc|USART_CHSIZE_8BIT_gc; 
                           USARTD0_BAUDCTRLA=0xf5; //Baud Rate = 9600
                           USARTD0.BAUDCTRLB=0xcc;
                          
                           USARTD0_CTRLB=USART_RXEN_bm|USART_TXEN_bm; 
                           PMIC_CTRL=PMIC_LOLVLEN_bm;    //set low level interrupt enable  
                           __enable_interrupt(); 
                           
                           while(1)
                           { 
                             
                            while( !(USARTD0_STATUS & USART_DREIF_bm));	//wait for data register empty
                            USARTD0_DATA='A';	    //send data to PC
                            delay_us(100); //
                           } 
                           
                           
                          }
                          "در عجبم از مردمی که خود زیر شلاق ظلم و ستم زندگی می کنند و بر حسینی می گریند که آزادنه زیست" شریعتی
                          در جهان روشنایی هایی وجوددارد که در عمیق ترین ظلمات نهانند.

                          دیدگاه


                            #28
                            پاسخ : rs232 .در xmega

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

                            دیدگاه


                              #29
                              پاسخ : پاسخ : rs232 .در xmega

                              با عرض سلام
                              توی سایتی که برای محاسبه معرفی نمودید فرکانس 14745600 و BR 9600 رو زدم جدولی که به من داد اکثر رکورد ها بدون خطا هستند oo:
                              حالا من کدوم ردیف رو انتخاب کنم بهتر هست ؟

                              - به دنبال فرصت عمری تباه کردم ! فرصت جوانی ام بود من اشتباه کردم .

                              دیدگاه


                                #30
                                پاسخ : rs232 .در xmega

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

                                دیدگاه

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