Chào các anh chị trong diễn đàn !
Em thực hiện giao tiếp atmega16 với máy tính bằng UART.
Em dùng timer để đếm lùi từ 99 về 00 sau mỗi 1 giây.Và em muốn gửi số đếm lùi đó lên máy tính.
Nhưng em lại thấy nó hiện lên mã ASCII của ký tự tương ứng với mã từ 99 về 00.Em đã thử chuyển về kiểu nguyên %d của UDR nhưng vẫn không đươc.
Vậy em phải làm sao để nó hiện ra đúng các số từ 99 về 00 đó ạ ?
Code của em đây ạ :
hàm cài đặt UART:
void uart_setup(){
//set baud,f=8Mhz
UBRRH=0;
UBRRL=51; //9600 bps
//set khung truyen va kich hoat bo nhan du lieu
UCSRA=0x00;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //du lieu 8bit
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //cho phep truyen,nhan,ngat RxD
sei(); //cho phep ngat toan cuc
}
Hàm truyền UART:
void uart_char_tx(int chr){
while (bit_is_clear(UCSRA,UDRE)); //cho den khi bit UDRE=1
UDR = chr;
}
Hàm timer định thời 1 giây :
volatile int dem2=99;
void timer1(){
//timer 1s
TCCR1B |=(1<<CS12)|(0<<CS11)|(0<<CS10); //prescaler = 256
TCNT1=34285; //khoi tao TCNT1=65535-(thoi_gian/((1/F_crystal)*prescaler))=34285 ; thoi_gian(s)
TIMSK |=(1<<TOIE1); //cho phep ngat khi tran T/C1
sei(); //set bit I (SREG) gloabal interrupt
}
//phuc vu ngat tran T/C1
ISR (TIMER1_OVF_vect )
{
TCNT1 = 34285; //gan lai TCNT1 sau khi tran
uart_char_tx(dem2);
_delay_ms(50);
dem2--;
if(!dem2) dem2 = 99;
}
Hàm main:
static FILE uartstd= FDEV_SETUP_STREAM(uart_char_tx, NULL,_FDEV_SETUP_WRITE);
int main(void){
uart_setup();
timer1();
while(1);
return 0;
}
Em thực hiện giao tiếp atmega16 với máy tính bằng UART.
Em dùng timer để đếm lùi từ 99 về 00 sau mỗi 1 giây.Và em muốn gửi số đếm lùi đó lên máy tính.
Nhưng em lại thấy nó hiện lên mã ASCII của ký tự tương ứng với mã từ 99 về 00.Em đã thử chuyển về kiểu nguyên %d của UDR nhưng vẫn không đươc.
Vậy em phải làm sao để nó hiện ra đúng các số từ 99 về 00 đó ạ ?
Code của em đây ạ :
hàm cài đặt UART:
void uart_setup(){
//set baud,f=8Mhz
UBRRH=0;
UBRRL=51; //9600 bps
//set khung truyen va kich hoat bo nhan du lieu
UCSRA=0x00;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //du lieu 8bit
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //cho phep truyen,nhan,ngat RxD
sei(); //cho phep ngat toan cuc
}
Hàm truyền UART:
void uart_char_tx(int chr){
while (bit_is_clear(UCSRA,UDRE)); //cho den khi bit UDRE=1
UDR = chr;
}
Hàm timer định thời 1 giây :
volatile int dem2=99;
void timer1(){
//timer 1s
TCCR1B |=(1<<CS12)|(0<<CS11)|(0<<CS10); //prescaler = 256
TCNT1=34285; //khoi tao TCNT1=65535-(thoi_gian/((1/F_crystal)*prescaler))=34285 ; thoi_gian(s)
TIMSK |=(1<<TOIE1); //cho phep ngat khi tran T/C1
sei(); //set bit I (SREG) gloabal interrupt
}
//phuc vu ngat tran T/C1
ISR (TIMER1_OVF_vect )
{
TCNT1 = 34285; //gan lai TCNT1 sau khi tran
uart_char_tx(dem2);
_delay_ms(50);
dem2--;
if(!dem2) dem2 = 99;
}
Hàm main:
static FILE uartstd= FDEV_SETUP_STREAM(uart_char_tx, NULL,_FDEV_SETUP_WRITE);
int main(void){
uart_setup();
timer1();
while(1);
return 0;
}
Comment