Nejdřív konfigurace:
Kód: Vybrat vše
CONFIG TIMER0 = TIMER , PRESCALE= 1|8|64|256|1024
např. pokud budeš mít 8MHz hlavní hodiny (xtal nebo vnitřní RC), prescale=8 vyrobí hodiny pro timer0 8MHz/8=1MHz.
Timer si s každým svým clockem (po vydělení prescalerem) přičte jedničku, přeteče když napočítá své maximum (Timer0 je 8bitový, tedy když doáhne 255). Pokud budeš mít povolena přerušení (a přerušení pro timer0), při přetečení timer0 vyvolá přerušení a skočí na zvolený label
Kód: Vybrat vše
ON timer0 co_se_ma_provest_pri_preruseni
Někam mimo hlavní smyčku dáš label
Kód: Vybrat vše
co_se_ma_provest_pri_preruseni:
incr cas
return
Pokud by byl prescaler = 1024 a hlavní hodiny 1MHz, clocky pro timer budou mít frekvenci asi 976Hz. Když do timeru0 (osmibitový, počítá do 255) nahraju hodnotu třeba 100, počítá od 100 nahoru, tedy 100,101,102...255, takže do přetečení "udělá" svých 155 tiků a pak se skočí na "co_se_ma_provest_pri_preruseni". V tomto případě se tedy bude vyvolávat přerušení každých 1 000 000/1024/155=6,3Hz.
Pokud potřebuješ 0,1s (tedy 10Hz), timer musí napočítat 1 000 000/1024/10=97 tiků. Tedy 255-97=158, kteroužto hodnotu musíš při každém přerušení nastavit do timeru.
Takže někam nahoru:
Kód: Vybrat vše
CONFIG TIMER0 = TIMER , PRESCALE= 1024
enable interrupts
enable timer0
ON timer0 co_se_ma_provest_pri_preruseni
a dolů pod smyčku:
Kód: Vybrat vše
co_se_ma_provest_pri_preruseni:
timer0 = 158
incr cas
return
Při 8MHz krystalu s timerem0 nejde přímo udělat 10Hz (8000000/1024/255=30Hz je maximum), buď můžeš použít timer1 (16bit, pokud je v procesoru) nebo zpomalit krystal, nebo třeba přičítat v přerušení jedničku a v hlavní smyčce reagovat na každé třetí přerušení atd.