LinuksowyElektronik napisał: Zaloguj się, aby zobaczyć kod
Po pierwsze, timer liczy od 0 do 255, ale to oznacza 256 impulsów pomiędzy przepełnieniami, czyli powinno być 256, a nie 255 * 128us.
Po drugie zaokrągliłeś wynik z 32.64 do 32 przed dzieleniem, co w efekcie dało niedokładny wynik ilości przepełnień.
W rzeczywistości częstotliwość przerwań można obliczyć dużo prościej:
( 8000000 / 1024 ) / 256 = ok. 30,5176
Wynik należy zaokrąglić do liczby całkowitej, czyli do 31, więc w efekcie w tym konkretnym przypadku otrzymujemy tę samą wartość, którą wyliczyłeś, czyli błąd wynikający z Twoich przybliżeń nie wpłynął na wynik końcowy. Nie zawsze jednak tak musi być. Czasami błąd wynikający z takich zaokrągleń może być dużo większy.
Tak czy inaczej, przy takich ustawieniach timera - jak pewnie zauważyłeś - nie uzyskasz dokładnego czasu (błąd będzie rzędu 1,6%, czyli ok. 16 sekund na każdy 1000 odmierzonych, czyli prawie 1 minutę w ciągu 1 godziny). Zmieniając prescaler na 256 uzyskamy częstotliwość:
( 8000000 / 256 ) / 256 = ok. 122,07
W tym przypadku wynik jest dużo bardziej zbliżony do liczby całkowitej, więc błąd będzie znacznie mniejszy. Nadal jednak czas nie będzie idealny. Dokładny czas 1 sekundy przy taktowaniu 8MHz można uzyskać na przykład konfigurując timer w tryb CTC z prescalerem 256, z wartością TOP=249 (czyli okres zliczania timera to 250 impulsów) i odliczając 125 przepełnień. Natomiast timer 16-bitowy można skonfigurować tak, by przerwanie było od razu co 1s, czyli nie będzie konieczności zliczania przepełnień.
Oczywiście cały czas mowa o dokładności w odliczaniu taktów. Należy pamiętać, że faktyczny czas odmierzony przez timer będzie zależny od dokładności i stabilności źródła taktowania, które to parametry w przypadku wewnętrznego oscylatora nie są zbyt korzystne.