پاسخ : rs232 .در xmega
با سلام . آی سی رو عوض کردم درست شد و دیگه اضافه جریان نداره
حالا میخواستم با استفاده از وقفه گیرنده سریال رو راه بندازم . به نظر شما استفاده از AVR1307 برای این کار مناسب هستش ؟ تو برنامه های پیچیده تر گیر نمیکنه؟ تو برنامه هایی که نیاز به پردازش سریعتری داره؟ یه تیکه از کدی که داخل 1307 اومده به نظرم یه مقدار بیشتر جای کار داره . این تیکه از کد میاد تازمانی که کل تعداد بافر تعریف شده پر نشده درون یک حلقه صبر میکنه و برنامه در بعضی حالتها ممکنه اونجا گیر کنه. مثلا ممکنه ما یه بافر 8 بایتی تعریف کرده باشیم اما بعضی از کلماتی که میکرو از طریق گیرنده سریال دریافت میکنه مثلا 5 بایت باشه و فرستنده منتظر عکس العمل از سوی میکرو هستش . در حالیکه میکرو توی حلقه گیر کرده . اینم اون تیکه کد مربوطه هستش
البته توی ویزارد codevision یه کدی تولید میکنه که فکر کنم کامل باشه و با اندکی تغییر میشه به IAR تبدیلش کرد . به نظر شما از کدوم استفاده کنم؟
با سلام . آی سی رو عوض کردم درست شد و دیگه اضافه جریان نداره

حالا میخواستم با استفاده از وقفه گیرنده سریال رو راه بندازم . به نظر شما استفاده از 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++; } }
کد:
// 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-
دیدگاه