[AVR GCC] problem z Timer0

timer0 w trybie overflow ustawiam dzielnik na 1024 wartosc poczatkowa licznika 0x70

przy zegarze 14,7456 MHz

zegar powinien grnerowac przerwanie 100 razy na sek, ale mam wrazenie ze jest generowane duzo szybciej ponizej uzasadnienie moich przypuszczen. Pominolem duza czesc kodu, ale widac ze po 100 przerwaniach jest zwiekszana zmienn time teoretycznie powinna byc zmieniana co okolo 1 sek, a zmienia sie 3 razy szybciej.

volatile u08 100Hz = 0; volatile u08 time;

int main(void) { while (1) { rprintf ("%d", time ); } }

void przerwanie100hz (void) {

100Hz ++; if (100Hz >100 ) { time ++; 100Hz = 0; } }
Reply to
invalid unparseable
Loading thread data ...

Byc moze koniecznie musisz generowac przerwanie w trybie overflow. Niemniej, jesli zechcesz uzyc trybu compare...

Ten kawalek kodu uzywa Timer2, tryb compare. ATmega16.

Czestotliwosc generowana przerwania wyznacza sie ze wzoru: freq. = kwarc / (prescaler * (OCR2 + 1))

ASSR = 1 << AS2; TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20); /* prescaler 1024 */ TIFR = 1 << OCF2; TIMSK = 1 << OCIE2; OCR2 = 143; /* 143 = 100 Hz, przy prescalerze 1024 i kwarcu 14745600 Hz */

while (ASSR & (1 << OCR2UB)) ;

sei();

Reply to
Pavel
Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.