bq666 napisał:
A moje pytanie, czy przy takim algorytmie, pomimo tego że nie wykorzystuje przerwań a na pinie mam częstotliwość którą chciałem procesor będzie miał jeszcze "czas" na po prostu realizację programu ? Czy tak skonfigurowany timer wykorzystuje procesor ?
Widzę że timery to twoja słaba strona, więc napiszę ci troche ...
Wszystkie timery w AVR mają możliwośc konfiguracji pracy w różnych trybach.
Najprostszy tryb to: 'Normal' - ten, który ty aktualnie stosujesz. W tym trybie timer liczy zawsze w górę i zawsze do przepełnienia jego maxymalnej pojemności, czyli dla Timera0 (oraz T2) byłoby odliczenie 256 clików. Istnieje jednak możliwośc skrócenia tego cyklu do dowolnej ilości clików przez wpis do timera początkowej wartości na przykład : TCNT0 = 106; a wtedy timer odliczy 150 klików zaczym się przepełni i wyzeruje oraz zawiadomi o tym stawiając flagę TOV0 w rejestrze TIFR, którą zwykle wykorzystuje processor do uruchomienia interruptu jezeli programista przewiduje taka potrzebę.
Wadą, a raczej niewygodą takiej procedury jest koniecznośc za każdym razem wpisywania tej początkowej wartości do rejestru timera (TCNT0).
Następny tryb to CTC, podobny do 'Normal' z tą różnicą, że timer też liczy od zera, ale nie musi liczyc do jego pełnej pojemności. Tą górną granicę możesz wskazac że ma odliczyc na przykład 150 clików i ma się wyzerowac (z tego powodu jest nazwa tego trybu). Takie ustawienie jest jednorazowe i pracuje automatycznie za każdym odliczaniem poprzez porównywanie (compare) aktualnej zawartości licznika z zadaną wartością ( w tym przykładzie: OCR0= 150;) zwaną w datasheet w tabelach i wzorach jako TOP .
Twój bład w interpretacji tematu jest traktowanie zwykłego przepełnienia w trybie 'normal' (TOP = FF) jako przepełnienie w trybie CTC gdzie TOP = OCR0.
Patrz twoje uwagi/objaśnienia do listingu:
TCCR0 |= (1<<COM00); //Mode 0 normal,
Toggle OC0 on compare match
W konfiguracji Timera0 jaką stosujesz (tryb Normal), nie masz dużej możliwości wyboru/kontrolowania częstotliwości produkowanego sygnału na wyjściu OC0. Możesz ją zmieniac skokowo przez zmanę prescalera. Tu timer pracuje na cały jego zakres. Istnieje płynniejsza mozliwośc wyboru/regulacji czestotliwości przez zmianę wpisu poczatkowej wartości Timera0, o czym było wcześniej, lecz takiego wpisu musiałbyś dokonywa za kazdym liczeniem, czyli uruchamiac interrupt i tu korzystac z pomocy processora…
W trybie CTC taka potrzeba nie występuje i timer będzie pracował (wg ustalonych na poczatku lub w trakcie jego pracy) parametrów niezależnie od zajętości processora.
Podobnie zachowują sie timery konfigurowane w innych pozostałych trybach wykorzystując ich szczególne możliwości.
I to byłaby odpowiedź na końcowe pytanie....
e marcus