Trik ini digunakan untuk keluar dari loop tunggu dalam
fungsi getchar ketika menggunakan USART/UART dengan seting RX interup enabled
Kali ini saya menggunakan codevision 3.12, dan gambar diatas
adalah codewizardAVR. Biasanya jika kita seting USART0 (atau lainnya) dengan RX
interup enabled maka codevision akan meng generate code fungsi getchar()
sebagai berikut
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
Fungsi getchar diatas jika kita panggil misal di main, tentu
selama data bytes tidak masuk ke RX fungsi getchar akan loop terus dan tidak
mengeksekusi baris code dibawahnya misal
void main(void)
{
unsigned char buffer;
while(1)
{
buffer=getchar();
lcd_gotoxy(0,0);
lcd_putsf(“Trik”);
}
}
Maka selama getchar tidak memperoleh data bytes maka baris
code lcd_gotoxy(0,0) dan seterusnya tidak akan di eksekusi.
Bagaimana caranya agar dapat tereksekusi?
char getchar(void)
{
char data;
unsigned long int limit_timeout0=0;
while (rx_counter0==0)
{
limit_timeout0++;
if(limit_timeout0>22000){ limit_timeout0=0;goto exit;}
};
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
exit:
}
Coba perhatikan code fungsi getchar diatas dan apa bedanya
dengan fungsi getchar sebelumnya, silahkan di pelajari dan silahkan bertanya
jika kurang paham…
Makasih banyak info dan bantuannya kak Azhar
BalasHapussemoga Allah membalas segala kebaikannya,,
Aminn...
Kalo cvavr pakek exit kok error ya gan
BalasHapus