Witam,
Mam procesor Atmel ATMEGA16. Napisalem program, w ktorym jest pewna funkcja obslugi przerwania wywolywana z pewna czestotliwoscia -- do procesora podlaczony jest kwarc wyjety z zegarka elektronicznego.
W dokumencie timery-avr.pdf
Niestety, w praktyce zegarek sie rozjezdzal. Eksperymentalnie zmienilem MaxVal z 8 na 7 i zaczelo dzialac.
Potem w dokumentacji Atmela znalazlem wzor: f = fclkI/O / (2 * N * (1 + OCRn)) wstawilem: fclkI/O = 32768, N = 1024, OCRn = 7 uzyskalem f = 2 Hz, a z obserwacji wynika, ze funkcja wywolywana jest z czestotliwoscia 4 Hz.
Juz doszedlem eksperymentalnie, ze wzor w moim przypadku to: f = fclk / (N * (1 + OCRn)) fclk - czestotliwosc kwarcu, N - prescaler, OCRn - wartosc maksymalna.
Niemniej chcialem zapytac, skad te roznice w dostepnych wzorach i ktory jest w koncu prawdziwy?
Trix. PS. Oto jak uruchamiam timer
... ...
ASSR = 1 << AS2; TCCR2 = (1 << WGM21) | (1 << CS22) | (1 << CS21) | (1 << CS20); /* prescaler 1024 */ TIFR = 1 << OCF2; TIMSK = 1 << OCIE2; OCR2 = 7;
while (ASSR & (1 << OCR2UB)) ;
sei();
while (1) ;
... ...
SIGNAL (SIG_OUTPUT_COMPARE2) { licznik++; wypiszLiczbeNaLCD(licznik); }