[AVR GCC] problem z Timer0

Jun 14, 2004 3 Replies

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; } }

sie 3 razy szybciej.

Wszystko wygl±da dobrze na pierwszy rzut oka. Tak¿e mo¿e co¶ ustawi³e¶ ¼le w czêstotliwo¶ci przerwania. A tak na marginesie to raczej nie stosowa³ bym nazw zmiennych zaczynaj±cych siê o cyfry (w zwyk³ym C nie da siê tego zrobiæ). Druga sprawa to to ¿e w³a¶ciwie nic tu nie zamie¶ci³e¶ co by mia³o kogo¶ na co¶ naprowadziæ bo problem raczej tkwi w inicjalizacji timera a tego nie ma w tym kodzie.

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();

Nazwa tylko przykladowo...

kozystam z dodatkowej biblioteki timer128.h z avr-libc inicjalizuje jak ponizej:

timerInit(); // initialize Timers timer0SetPrescaler ( TIMER_CLK_DIV1024 ); timerAttach ( TIMER0OVERFLOW_INT, Sectic ); TCNT0 = 0x70; //ustawienie poczatkowe Timer0

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required