#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index=0,rx_rd_index=0;
#else
unsigned int rx_wr_index=0,rx_rd_index=0;
#endif
#if RX_BUFFER_SIZE < 256
unsigned char rx_counter=0;
#else
unsigned int rx_counter=0;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0) rx_buffer_overflow=1;
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
#endif
}
}
در این کد که در تمرین فزستلدن کارکتر a برای روشدن شدن ال ای دی از طریق وقفه است اول از کدویزارد استفاده کردید و گفتید که نیاز به این همه کد نیست و خودتون خلاصه کردید امل واسه بیت توازن و فرمینگ ارور گفتین خودتون اضافه کنید من الان مشکلم اینه که تو کد ویزارد چرا برای پریتی و فرمینگ و دیتا اور ران اومده دیفاین کرده رو یک در حالی که تو دیتا شیت گفته اگه اینا یک باشن ینی خطا داریم این خودش دیفاین یک کرده از طرفی اومده تو شرط گفته اگه اند اینا با استاتوس(status=ucsra) برابر 0 بشه برو تو شرط؟؟؟؟؟
اخه این شرط برقرار نمیشه چون ucsra خودشوقتی ارور نیست همه به جز udre رو یک داره تو دیتا شیت .ینی الان داره تو این کارو میکنه میگه من خودم اون سه تا (پریتی و دیتا اور و فرمینگ ) رو یک دارم حالا اند میکنم با استاتوس که توش همین سه تا صفر هستن اگه جواب صفر شد برو تو اما در عمل ممکن نیست چون استاتوس همیشه اینارو 0 هس مگر اروری پیش بیاد و دیفاین یک داده و اندشون 0 نمیاد
این باید دیفاین 0 میداد که اگر اروری تو استاتوس پیش بیاد دیگه اندش با این 3 تا دیفاین 0 نیاد و وارد حلقه نشه که بهمیم اره الان یه اروری بوده
میشه بگید جریان چیه
/ USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char xx;
xx= UDR ;
if ((FE & UPE & DOR) ==0) {
if (xx == ‘a’){ PORTB.1=1; printf("on led
"); }else if (xx ==‘b’){ PORTB.1 = 0; printf("off led
"); }
}
}
من اینطور نوشتم و کار میکنه ایا درست نیست؟
#define RX_COMPLETE (1<<RXC)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index=0,rx_rd_index=0;
#else
unsigned int rx_wr_index=0,rx_rd_index=0;
#endif
#if RX_BUFFER_SIZE < 256
unsigned char rx_counter=0;
#else
unsigned int rx_counter=0;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0) rx_buffer_overflow=1;
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
#endif
}
}
در این کد که در تمرین فزستلدن کارکتر a برای روشدن شدن ال ای دی از طریق وقفه است اول از کدویزارد استفاده کردید و گفتید که نیاز به این همه کد نیست و خودتون خلاصه کردید امل واسه بیت توازن و فرمینگ ارور گفتین خودتون اضافه کنید من الان مشکلم اینه که تو کد ویزارد چرا برای پریتی و فرمینگ و دیتا اور ران اومده دیفاین کرده رو یک در حالی که تو دیتا شیت گفته اگه اینا یک باشن ینی خطا داریم این خودش دیفاین یک کرده از طرفی اومده تو شرط گفته اگه اند اینا با استاتوس(status=ucsra) برابر 0 بشه برو تو شرط؟؟؟؟؟
اخه این شرط برقرار نمیشه چون ucsra خودشوقتی ارور نیست همه به جز udre رو یک داره تو دیتا شیت .ینی الان داره تو این کارو میکنه میگه من خودم اون سه تا (پریتی و دیتا اور و فرمینگ ) رو یک دارم حالا اند میکنم با استاتوس که توش همین سه تا صفر هستن اگه جواب صفر شد برو تو اما در عمل ممکن نیست چون استاتوس همیشه اینارو 0 هس مگر اروری پیش بیاد و دیفاین یک داده و اندشون 0 نمیاد
این باید دیفاین 0 میداد که اگر اروری تو استاتوس پیش بیاد دیگه اندش با این 3 تا دیفاین 0 نیاد و وارد حلقه نشه که بهمیم اره الان یه اروری بوده
میشه بگید جریان چیه
/ USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char xx;
xx= UDR ;
if ((FE & UPE & DOR) ==0) {
if (xx == ‘a’){ PORTB.1=1; printf("on led
"); }else if (xx ==‘b’){ PORTB.1 = 0; printf("off led
"); }
}
}
من اینطور نوشتم و کار میکنه ایا درست نیست؟
