Ahoj
ATmega32A, XTAL 9,216MHz zdroj externího přerušení na EXT_INT0
Mám k ATmega připojený radiový modul RFM12BP-433 a právě se potím s funkcí “ping”. Odešlu radiový paket s definovanou zprávou a pokud do předem stanoveného času (0,5s) nepříjde odpověď od protistanice, tak napíše “timeout…” a poku odpověď dojde, tak napíše “PING OK”.
Problém u mě nastal v momentě, kdy mám čekat těch 0,5s na odpověď (ta může příjt v různém čase - maximum je ale pevně stanoveno na 500ms). Pokud radiovému modulu RFM12 příjdou data, tak shodí stav linky nIRQ do log.0, čímž aktivuje přerušení EXT_INT0.
Nevím jestli jsem to pochopil správně, že čítač/časovač jsou vlastně takové hodiny “na pozadí”. Tj. čekám těch 0,5s a pokud kdykoliv v tomto čase příjde odpověď a mám povoleno globální přerušení, tak se toto spustí a provede a pak zase program poběží dál.
Udělal jsem si tedy funkci:
void timer1_delay(unsigned int time_ms) // zpouzdeni pomoci timer/counter 1
{
unsigned int pocet_taktu = 0;
unsigned int counter1 = 0;
pocet_taktu = time_ms * 9;
TCCR1B = 0x05; // NORMAL mode, prescaler 1024
TCNT1L = 0x00; // vymazani citaciho registru
TCNT1H = 0x00;
while(1)
{
counter1 = TCNT1L | (TCNT1H<<8);
if (counter1 >= pocet_taktu) // cekej dokud TCNT1 nedosahne pozadovane hodnoty
{
TCNT1L = 0x00;
TCNT1H = 0x00;
TCCR1B = 0x00; // NORMAL mode, timer/counter1 off
break;
}
}
return;
}
Kdy jako parametr předávám požadovanou dobu čekání. Příklad:
Chci čekat 500ms, tak:
pocet_taktu = 500 * 9 = 4500
prescaler je nastaven na 1024, to budeme mít celkem 4500*1024=4608000 taktů (=0,5s při 9,216MHz) než se funkce opustí (pokud nedojde mezitím přerušení - v přerušení mám na 1. řádku TCCR1B = 0x00;)
V simulaci to funguje jak má - pokud předám např. jako parametr “1”, tak skutečně čeká 1ms, v reálu (parametr “500”) se ale běh programu “sekne” a vypadá to, že to stojí právě v té čekací funkci. Ještě před tím, než ji volám, tak povoluji globální přerušení (kvůli EXT_INT0) a jinak EXT_INT0 se mi určitě zatím nespouští (ještě nemám protistanici) a i jsem to zkoumal logickým analyzátorem, že linka nIRQ nespadnedo 0 a tím pádem to nemůže být tím ovlivněno.
Může mi prosím někdo osvětlit, jak tedy použít timer/counter jako obyčejnou zpožďovací smyčku ?
Děkuji