Trong Atmega128 có 2 con USART là USART0 và USART1 , khi em sử dụng CodeWizardAVR ( trong CodeVison) , nếu em cấu hình cho con USART1 như sau
thì trong code nó sinh ra 2 hàm cho getchar1() và putchar1() để nhận và gửi 1 ký tự như sau :
///////////////////////////
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1[rx_rd_index1];
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
Ok mọi thứ tốt , em cũng đã sử dụng dụng được 2 hàm này .
Nhưng vấn đề là nếu em cấu hình USART0 cũng tương tự như USART1 như sau :
thì trong code sinh ra chỉ có hàm getchar() thôi mà em không thấy hàm putchar() nào cả :
//
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
Nếu em cấu hình cho mỗi con USART0 hay cấu hình cho cả 2 USART0 và USART1 thì kết quả vẫn thế , tức là nó không sinh ra hàm putchar() cho con USART0 .
Như thế nghĩa là như thế nào? có phải 1 trong những nguyên nhân sau không :
1. CodeVision bị bug , không genarate ra tất cả các trường hợp
2. USART0 ko thể gửi nếu ko sử dụng interup
Nếu em tự chèn vào 1 hàm putchar0() như sau :
void putchar0(char c)
{
while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
UDR0=c;
}
thì liệu nó có hoạt động được không ? ( mạch của em ko test được hoạt động của USART0 )
Bác nào gặp trường hợp như thế này bao giờ giúp em với ?
Thanks .
thì trong code nó sinh ra 2 hàm cho getchar1() và putchar1() để nhận và gửi 1 ký tự như sau :
///////////////////////////
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1[rx_rd_index1];
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
Ok mọi thứ tốt , em cũng đã sử dụng dụng được 2 hàm này .
Nhưng vấn đề là nếu em cấu hình USART0 cũng tương tự như USART1 như sau :
thì trong code sinh ra chỉ có hàm getchar() thôi mà em không thấy hàm putchar() nào cả :
//
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
Nếu em cấu hình cho mỗi con USART0 hay cấu hình cho cả 2 USART0 và USART1 thì kết quả vẫn thế , tức là nó không sinh ra hàm putchar() cho con USART0 .
Như thế nghĩa là như thế nào? có phải 1 trong những nguyên nhân sau không :
1. CodeVision bị bug , không genarate ra tất cả các trường hợp
2. USART0 ko thể gửi nếu ko sử dụng interup
Nếu em tự chèn vào 1 hàm putchar0() như sau :
void putchar0(char c)
{
while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
UDR0=c;
}
thì liệu nó có hoạt động được không ? ( mạch của em ko test được hoạt động của USART0 )
Bác nào gặp trường hợp như thế này bao giờ giúp em với ?
Thanks .
Comment