پاسخ : 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-









oo: 
دیدگاه