|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s
permission is not required when using copyrighted material in:
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Moduł 16-bitowego timera/licznika umożliwia dokładne odmierzanie czasu w programie, zarządzanie zdarzeniami, generację przebiegów oraz pomiar czasu sygnałów. Poniżej przedstawiono uproszczony schemat blokowy 16-bitowego timera/licznika:

Końcówki portów współpracujące z timerem/licznikiem 0 w mikrokontrolerach ATtiny4/5/9/10 są następujące:

Rejestry we/wy dostępne dla mikroprocesora, łącznie z bitami we/wy i końcówkami we/wy są pisane grubą czcionką na powyższym schemacie blokowym. Większość odwołań do rejestrów i bitów w tym rozdziale jest zapisana w ogólnej postaci. Mała litera “n” zastępuje numer timera/licznika (dla mikrokontrolerów ATtiny4/5/9/10 numer ten zawsze wynosi 0), a mała litera "x" zastępuje kanał modułu wyjścia porównań. Jednakże w czasie używania definicji rejestrów i bitów w programie należy stosować ich precyzyjne postacie, np. TCNT0 przy dostępie do zawartości timera/licznika 0, itd..
Rejestr timera/licznika (TCNT0), rejestry Output Compare (OCR0A, OCR0B) i rejestr Input Capture (ICR0) są wszystkie rejestrami 16-bitowymi. Przy dostępie do rejestrów 16-bitowych należy postępować wg specjalnych procedur, które opisane są dalej w tym rozdziale. Rejestry sterujące timera/licznika (ang. Timer/Counter Control Registers, TCCR0A, TCCR0B) są 8-bitowe i nie posiadają ograniczeń przy dostępie przez mikroprocesor. Wszystkie sygnały żądań przerwań są widoczne w rejestrze znaczników przerwań od timera (ang. Timer Interrupt Flag Register, TIFR). Wszystkie przerwania są indywidualnie maskowane za pomocą rejestru maski przerwań timera (ang. Timer Interrupt Mask Register, TIMSK). Na schemacie blokowym nie pokazano rejestrów TIFR i TIMSK.
Timer/Licznik może być taktowany wewnętrznie poprzez preskaler lub z zewnętrznego źródła zegara na końcówce T0. Moduł logiki wyboru zegara steruje wyborem źródła zegarowego oraz krawędzi sygnału, które będą używane przez timer/licznik do zwiększania lub do zmniejszania jego wartości. Timer/licznik jest nieaktywny, jeśli nie wybrano żadnego źródła zegara. Wyjście z modułu logiki wyboru zegara jest opisane jako zegar timera (clkT0).
Podwójnie buforowane rejestry Output Compare (OCR0A, OCR0B) są porównywane z wartością timera/licznika przez cały czas. Wynik tego porównania może być używany przez generator przebiegu (ang. Waveform Generator) do generacji sygnału PWM lub sygnału o zmiennej częstotliwości na końcówkach Output Compare (OC0A, OC0B). Zdarzenie Output Compare ustawi również znacznik Output Compare (OCF0A, OCF0B), który może być użyty do generacji żądania przerwania Output Compare (ang. Output Compare interrupt request).
Rejestr Input Capture (ang. Input Capture Register) może zapamiętywać stan timera/licznika przy danym zdarzeniu zewnętrznym (wyzwalanym zboczem) na końcówce Input Capture (ICP0) lub na końcówkach komparatora analogowego (zobacz do rozdziału "Komparator analogowy"). Moduł Input Capture (ang. Input Capture unit) zawiera cyfrowy filtr reduktora szumów (ang. Noise Canceler), który minimalizuje szansę reakcji na szpilki szumu w sygnale wyzwalającym zdarzenie Input Capture.
Wartość TOP lub maksymalna wartość timera/licznika może w niektórych trybach pracy zostać zdefiniowana albo przez rejestr OCR0A, albo przez ICR0, albo przez wartości stałe. Gdy jest używany rejestr OCR0A jako wartość TOP w trybie PWM, rejestr OCR0A nie może być stosowany do generowania wyjścia PWM. Jednakże wartość TOP będzie w tym przypadku podwójnie buforowana, co pozwoli ją zmieniać w trakcie pracy licznika. Jeśli jest potrzebna stała wartość TOP, to rejestr ICR0 może zostać użyty jako alternatywa, co uwolni rejestr OCR0A do użytku jako wyjście PWM.
Poniższe definicje są intensywnie używane w dalszej części tego rozdziału:
| Stała | Opis |
| BOTTOM | Licznik osiąga BOTTOM, gdy jego wartość staje się równa 0x0000 |
| MAX | Licznik osiąga MAX, gdy jego wartość staje się równa 0xFFFF (dziesiętnie 65535). |
| TOP | Licznik osiąga
TOP, gdy jego wartość staje się
równa największej wartości w sekwencji zliczania. Wartość TOP może być przypisana jako wartość stała 0xFFFF (MAX) lub wartość umieszczona w rejestrze OCR0A. Przypisanie to jest zależne od trybu pracy licznika. |
Timer/licznik może być taktowany przez wewnętrzne lub zewnętrzne źródło zegarowe. Jest ono wybierane przez moduł wyboru zegara (ang. Clock Select logic), które jest sterowane bitami wyboru zegara (CS02:0) umieszczonymi w rejestrze B sterowania timerem/licznikiem (ang. Timer/Counter control Register B, TCCR0B).
Timer/licznik może być taktowany bezpośrednio przez zegar systemowy (przez ustawienie CS2:0 = 1). Zapewnia to najszybsze działanie z maksymalną częstotliwością zegara timera/licznika równej częstotliwości zegara systemowego (fCLK_I/O). Alternatywnie jako źródło zegarowe może zostać użyte jedno z czterech wyjść preskalera.

Wyjścia preskalera dostarczają sygnały zegarowe o
częstotliwościach:
Preskaler pracuje niezależnie od modułu wyboru zegara dla timera/licznika i jest współdzielony z timerem/licznikiem Tn.
Ponieważ na preskaler nie wpływa
wybór zegara dla timera/licznika, stan
preskalera może powodować różne implikacje
w sytuacjach, gdzie jest używany zegar preskalera. Jeden z przykładów artefaktów preskalera występuje, gdy
timer zostaje uaktywniony
i taktowany przez preskaler
(CS2:0 = 2, 3, 4 lub 5). Liczba cykli zegarowych od momentu uaktywnienia timera do pierwszego zliczenia może wynieść
od 1 do

Źródło zewnętrznego sygnału zegarowego przyłożonego do końcówki T0 może być używane jako
zegar dla timera/licznika (clkTn). Stan
końcówki T0 jest próbkowany w każdym cyklu zegara systemowego przez
układ logiczny synchronizacji końcówki. Zsynchronizowany
(próbkowany) sygnał jest następnie
przekazywany do detektora zbocza. Poniższy rysunek pokazuje
schemat blokowy układu logicznego synchronizacji i detektora zbocza dla końcówki T0. Rejestry są taktowane przy zboczu
dodatnim
Detektor zbocza generuje jeden impls clkT0 dla każdego dodatniego (CS2:0 = 7) lub ujemnego (CS2:0 = 6) zbocza, które wykrywa.

Układ logiczny synchronizacji i detektora zbocza wprowadza
opóźnienie od 2,5 do 3,5 cykli zegara systemowego od momentu
pojawienia się zbocza na końcówce T0 do aktualizacji
licznika.
Włączanie i wyłączanie wejścia zegarowego musi być wykonywane,
gdy T0 jest stabilne przynajmniej przez jeden cykl zegara systemowego, inaczej istnieje ryzyko generacji fałszywego
impulsu zegarowego timera/licznika. Każdy półokres zewnętrznego
zegara musi być dłuższy od jednego cyklu
zegara systemowego, aby
zapewnić poprawne próbkowanie. Należy zagwarantować, aby
częstotliwość zegara zewnętrznego była mniejsza od połowy
częstotliwości zegara systemowego
Źródło zegara zewnętrznego nie posiada preskalera.
Głównym elementem 16-bitowego timera/licznika jest programowalny, 16-bitowy, dwukierunkowy moduł licznika. Poniższy rysunek przedstawia schemat blokowy licznika i jego otoczenie:

Opis sygnałów (sygnały
wewnętrzne):
|
16 bitowy licznik jest odwzorowany w dwóch 8-bitowych komórkach pamięci we/wy: Counter High (TCNT0H) zawierającej górne 8 bitów licznika i Counter Low (TCNT0L) zawierającej dolne 8 bitów. Rejestr TCNT0H może być adresowany jedynie pośrednio przez mikroprocesor. Gdy mikroprocesor uzyskuje dostęp do komórki TCNT0H pamięci we/wy, to faktycznie ma on dostęp do 8-bitowego rejestru tymczasowego (TEMP). Tymczasowy rejestr jest aktualizowany wartością TCNT0H, gdy zostanie odczytana wartość TCNT0L, i TCNT0H zostaje uaktualniony zawartością rejestru tymczasowego, gdy zostanie zapisana wartość TCNT0L. Pozwala to mikroprocesorowi odczytać całą zawartość 16-bitowego licznika w czasie jednego cyklu zegarowego poprzez 8-bitową magistralę danych. Ważne jest zwrócenie uwagi na fakt, iż istnieją specjalne przypadki zapisu do rejestru TCNT0, gdy licznik zlicza, które dadzą nieprzewidywalne wyniki. Te specjalne przypadki opisane są w tych podrozdziałach, gdzie są istotne.
W zależności od zastosowanego trybu pracy licznik jest zerowany, zwiększany lub zmniejszany przy każdym impulsie zegara timera (clkT0). Zegar clkT0 może być generowany przez zewnętrzne lub wewnętrzne źródło zegarowe, wybierane bitami wyboru zegara (ang. Clock Select bits, CS02:0). Jeśli żadne źródło zegarowe nie jest wybrane (CS02:0 = 0), to timer jest zatrzymany. Jednakże wartość TCNT0 może być modyfikowana przez mikroprocesor niezależnie od obecności sygnału clkT0. Zapisy ze strony mikroprocesora posiadają pierwszeństwo w stosunku do wszystkich operacji zerowania licznika lub zliczania.
Sekwencja zliczania określana jest przez ustawienie bitów trybu generacji przebiegu (ang. Waveform Generation mode bits, WGM03:0) zlokalizowanych w rejestrach A i B sterujących timera/licznika (TCCR0A i TCCR0B).
Istnieje bliski związek pomiędzy zachowaniem się licznika (zliczaniem) a sposobem generacji przebiegów na wyjściach porównań (ang. Output Compare outputs, OC0x). Więcej na ten temat znajdziesz w podrozdziale "Tryby Działania".
Znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany zgodnie z trybem działania wybranym przez bity WGM03:0. TOV0 może zostać wykorzystany do generacji przerwania dla mikroprocesora.
W tym podrozdziale pojawia się termin angielski Input Capture. Pierwotnie próbowałem go przetłumaczyć jako Rejestracja Wejścia, lecz po namyśle postanowiłem pozostawić oryginalne brzmienie. Termin ten oznacza reakcję na zdarzenia, które mogą się pojawić w trakcie pracy mikrokontrolera. Reakcja ta polega na zapisaniu czasu wystąpienia tego zdarzenia, czyli na Rejestracji Czasu Zdarzenia. Odbywa się to w ten sposób, iż w momencie wykrycia zdarzenia (np. zmiany poziomu sygnału na określonej końcówce mikrokontrolera) następuje zapamiętanie w osobnym rejestrze stanu timera/licznika (stąd termin Capture, który po angielsku oznacza "przechwycenie" lub "zarejestrowanie"). Stan ten jest znacznikiem czasu (ang. time-stamp), w którym wystąpiło zdarzenie i może być w różny sposób wykorzystywany w aplikacji.
Timer/licznik zawiera moduł Input Capture (ang. Input Capture unit), który może rejestrować zewnętrzne zdarzenia przez nadanie im znaczników czasu oznaczających czas ich wystąpienia. Sygnał zewnętrzny oznaczający zdarzenie lub wiele zdarzeń można przyłożyć do końcówki ICP0.

Znaczniki czasu mogą następnie być używane do wyliczania
częstotliwości, wypełnienia oraz innych cech zastosowanego
sygnału. Alternatywnie znaczniki czasu można wykorzystać do utworzenia dziennika zdarzeń.
Moduł Input Capture jest zilustrowany na poniższym rysunku. Na szaro zaznaczono elementy, które nie są bezpośrednio częścią
tego modułu. Mała litera "n" w nazwach
rejestru i bitów oznacza
numer timera/licznika (w mikrokontrolerach
posiadających kilka takich komponentów).

Gdy pojawia się zmiana poziomu logicznego (zdarzenie) na końcówce Input Capture (ang. Input Capture pin, ICP0) lub alternatywnie na wyjściu komparatora analogowego (ang. Analog Comparator output, ACO), a zmiana ta jest zgodna z ustawieniem detektora zbocza, to zostanie wyzwolone nagranie stanu licznika. W trakcie rejestracji 16-bitowa wartość licznika (TCNT0) zostaje zapisana w rejestrze Input Capture (ang. Input Capture Register, ICR0). Znacznik Input Capture (ang. Input Capture Flag, ICF0) zostaje ustawiony w tym samym cyklu zegara systemowego, gdy wartość TCNT0 jest kopiowana do rejestru ICR0. Jeśli zostanie to włączone (ICIE0 = 1), to znacznik ICF0 generuje przerwanie Input Capture (ang. Input Capture interrupt). Znacznik ICF0 zostaje automatycznie wyzerowany, gdy to przerwanie jest wykonywane. Alternatywnie znacznik ICF0 może zostać wyzerowany programowo przez zapisanie logicznego 1 (nie 0) do jego bitu w komórce we/wy.
Odczytywanie 16-bitowej wartości w rejestrze Input Capture
(ICR0) jest wykonywane przez
odczytanie najpierw młodszego bajtu (ICR0L),
a później starszego (ICR0H).
Gdy młodszy bajt zostaje odczytany, starszy bajt zostaje
skopiowany do rejestru tymczasowego (TEMP).
Gdy mikroprocesor odczytuje adres
we/wy
ICR0H I/O, to otrzyma dostęp do rejestru TEMP.
Rejestr ICR0 może
być zapisywany jedynie w trybie generacji przebiegu, który
wykorzystuje rejestr
ICR0 do definiowania wartości TOP
(wartość górna, maksymalna)
dla licznika. W takim przypadku bity trybu generacji
przebiegu (ang. Waveform Generation mode bits, WGM03:0) muszą być ustawione, zanim wartość TOP
będzie mogła być wpisana do rejestru
ICR0. Przy zapisywaniu rejestru
ICR0 starszy bajt musi być wpisany do komórki we/wy
ICR0H przed
wpisaniem młodszego bajtu do
ICR0L. Więcej informacji na ten temat
znajdziesz w podrozdziale "Dostęp do rejestrów
16-bitowych".
Głównym źródłem wyzwalania dla modułu Input Capture jest końcówka Input Capture (ICP0):

Timer/licznik 0 może alternatywnie wykorzystywać wyjście z komparatora analogowego jako źródło wyzwalania dla modułu Input Capture. Komparator analogowy zostaje wybrany jako źródło wyzwalające przez ustawienie bitu Input Capture komparatora analogowego (ang. Analog Comparator Input Capture, ACIC) w rejestrze sterowania i stanu komparatora analogowego (ang. ACSR – Analog Comparator Control and Status Register). Bądź świadomy faktu, iż zmiana źródła wyzwalającego może wyzwolić nagranie stanu licznika. Z tego powodu znacznik Input Capture musi zostać wyzerowany po takiej zmianie.
Zarówno końcówka Input Capture (ICP0) jak i wyjście komparatora analogowego (ACO) są próbkowane tym samym sposobem, co końcówka T0. Detektor zbocza jest również identyczny. Jednakże, gdy zostanie włączony reduktor szumu, przed wejście detektora zbocza zostaje wstawiona dodatkowa sieć logiczna, która zwiększa opóźnienie do czterech cykli zegara systemowego. Zwróć uwagę, że wejście reduktora szumów i detektora zbocza jest zawsze uaktywnione, o ile timer/licznik nie zostanie ustawiony do pracy w trybie generacji przebiegu, który wykorzystuje rejestr ICR0 do definiowania wartości TOP.
Zdarzenie Input Capture może być wyzwolone programowo przez sterowanie portem końcówki ICP0.
Reduktor szumów poprawia odporność na zakłócenia poprzez zastosowanie prostego schematu filtracji cyfrowej. Wejście reduktora szumów monitoruje cztery kolejne próbki sygnału i wszystkie muszą być równe, aby zmieniło się wyjście, które z kolei wykorzystuje detektor zbocza. Reduktor szumów jest włączany przez ustawienie bitu reduktora szumów dla Input Capture (ang. Input Capture Noise Canceler, ICNC0) w rejestrze B sterowania timerem/licznikiem (ang. Timer/Counter Control Register B, TCCR0B). Gdy zostanie włączony, reduktor szumów wprowadza dodatkowe cztery cykle zegara systemowego opóźnienia od zmiany wejścia do aktualizacji rejestru ICR0. Reduktor szumów wykorzystuje zegar systemowy i dlatego nie wpływa na niego preskaler.
Głównym wyzwaniem przy używaniu modułu Input Capture jest przydział wystarczającej mocy obliczeniowej procesora do obsługi nadchodzących zdarzeń. Czas pomiędzy dwoma kolejnymi zdarzeniami jest krytyczny. Jeśli procesorowi nie uda się odczytać zarejestrowanej wartości w rejestrze ICR0 przed wystąpieniem następnego zdarzenia, rejestr ICR0 zostanie nadpisany nową wartością. W tym przypadku wynik rejestracji będzie niepoprawny.
Gdy używane jest przerwanie Input Capture, rejestr ICR0 powinien być odczytany najszybciej jak to jest możliwe w procedurze obsługi przerwania. Chociaż przerwanie Input Capture posiada względnie wysoki priorytet, to maksymalny czas reakcji na to przerwanie zależy od maksymalnej liczby cykli zegarowych zużytych na obsługę pozostałych żądań przerwania.
Nie zaleca się używania modułu Input Capture w jakimkolwiek trybie pracy, gdy aktywnie jest zmieniana wartość TOP (rozdzielczość) podczas zliczania.
Pomiar współczynnika wypełnienia sygnału zewnętrznego wymaga zmiany zbocza wyzwalającego po każdej rejestracji. Zmiana wykrywania zbocza musi być wykonana tak szybko jak tylko jest to możliwe po odczycie rejestru ICR0. Po zmianie zbocza musi być programowo wyzerowany znacznik Input Capture (ICF0) przez zapis logicznej jedynki do jego bitu w komórce we/wy.
Jeśli mierzona jest jedynie częstotliwość, to zerowanie znacznika ICF0 nie jest wymagane przy wykorzystywaniu przerwań.
Tutaj występuje termin Output Compare, który jest jakby "odwrotnością" terminu Input Capture. Otóż ten drugi rejestruje czas zmiany sygnału na wybranej końcówce mikrokontrolera, natomiast Output Compare zmienia stan wybranej końcówki, jeśli wewnętrzny licznik odmierzy odpowiedni czas. Odbywa się to w ten sposób, iż stan licznika jest porównywany z rejestrem przechowującym znacznik czasu. Gdy licznik osiągnie wartość znacznika czasu, występuje zgodność porównania i w tym momencie mikrokontroler może wykonać różne operacje, np. zmienić stan określonej końcówki. Pozwala to generować różne przebiegi czasowe. Ponieważ nie spotkałem dobrego tłumaczenia dla terminu Output Compare, postanowiłem go zachować w oryginalnej postaci.

16-bitowy komparator ciągle porównuje stan timera/licznika TCNT0 z rejestrem Output Compare (OCR0x). Jeśli TCNT0 jest równy OCR0x, komparator sygnalizuje zgodność. Zgodność ustawi znacznik Output Compare (OCF0x) przy następnym cyklu zegarowym timera. Jeśli włączone (OCIE0x = 1), to znacznik Output Compare wygeneruje przerwanie Output Compare. Znacznik OCF0x jest automatycznie zerowany, gdy przerwanie zostanie wykonane. Alternatywnie znacznik OCF0x można wyzerować programowo przez zapis logicznej jedynki do jego bitu w komórce we/wy. Generator przebiegu używa sygnału zgodności do generowania sygnału wyjściowego zgodnie z trybem pracy ustawionym przez bity trybu generacji przebiegu (ang. Waveform Generation mode, WGM03:0) oraz bity trybu Compare Output (ang. Compare Output mode bits, COM0x1:0). Sygnały TOP i BOTTOM są używane przez generator przebiegu do obsługi specjalnych przypadków wartości końcowych w niektórych trybach pracy (zobacz do podrozdziału "Tryby pracy").
Specjalna funkcja modułu A Output Compare pozwala zdefiniować wartość TOP dla timera/licznika (tj. rozdzielczość licznika). Jako dodatek do rozdzielczości licznika, wartość TOP definiuje czas okresu dla przebiegów generowanych w generatorze przebiegów.
Poniższy obrazek przedstawia schemat blokowy modułu Output Compare. Mała litera “n” w nazwach rejestrów i bitów oznacza numer modułu (n = 0 dla timera/licznika 0), a “x” oznacza moduł Output Compare (A/B). Elementy schematu blokowego nie będące bezpośrednio częścią modułu Output Compare są pokolorowane na szaro.

Rejestr OCR0x jest podwójnie buforowany przy korzystaniu z wszystkich dwunastu trybów modulacji szerokości impulsu (ang. Pulse Width Modulation, PWM). W trybach normalnym (ang Normal mode) i zerowania timera przy zgodności porównania (ang. Clear Timer on Compare mode, CTC) podwójne buforowanie jest wyłączone. Podwójne buforowanie synchronizuje uaktualnienia zawartości rejestru porównań OCR0x albo do wartości TOP, albo do wartości BOTTOM sekwencji zliczania. Synchronizacja zapobiega pojawianiu się impulsów PWM o złej długości lub niesymetrycznych, a w ten sposób zapewniając bezbłędny przebieg wyjściowy.
Dostęp do rejestru OCR0x może wydawać się skomplikowany, lecz tak nie jest. Gdy włączone jest podwójne buforowanie, mikroprocesor ma dostęp do rejestru buforowego OCR0x, a jeśli podwójne buforowanie jest wyłączone, to mikroprocesor będzie posiadał bezpośredni dostęp do OCR0x. Zawartość rejestru OCR0x (bufora lub właściwego rejestru) jest zmieniana tylko przez operację zapisu (timer/licznik nie uaktualnia tego rejestru automatycznie, jak w przypadku TCNT0 i ICR0). Dlatego OCR0x nie jest odczytywany poprzez górny bajt rejestru tymczasowego (TEMP). Jednakże dobrą praktyką jest odczyt najpierw dolnego bajtu, jak to jest przy dostępie do innych rejestrów 16-bitowych. Zapis rejestrów OCR0x musi być dokonywany poprzez rejestr TEMP, ponieważ porównywane są ciągle wszystkie 16 bitów. Górny bajt (OCR0xH) musi być zapisany najpierw. Gdy zapisywany jest górny bajt w komórce we/wy przez mikroprocesor, to zapisana wartość trafia do rejestru TEMP. Gdy następnie zostaje zapisany dolny bajt (OCR0xL) do 8 dolnych bitów, to górny bajt zostanie skopiowany do 8 górnych bitów albo bufora OCR0x, albo rejestru porównawczego OCR0x w tym samym cyklu zegara systemowego.
Więcej informacji znajdziesz w podrozdziale "Dostęp do rejestrów 16-bitowych".
W trybach nie generujących przebiegu PWM wyjście zgodności porównania z komparatora może zostać wymuszone przez zapis jedynki do bitu wymuszenia Output Compare (ang. Force Output Compare bit, 0x). Wymuszenie zgodności porównania nie ustawi znacznika OCF0x, ani nie wyzeruje/przeładuje timera, lecz końcówka OC0x zostanie uaktualniona tak, jakby wystąpiła rzeczywista zgodność porównania (ustawienie bitów COM01:0 definiuje, czy końcówka OC0x jest ustawiana, zerowana lub zmienia stan na przeciwny).
Wszystkie zapisy przez mikroprocesor do rejestru TCNT0 będą blokowały każdą zgodność porównania, która pojawi się w następnym cyklu zegara timera, nawet, jeśli timer został zatrzymany. Cecha ta pozwala zainicjować OCR0x na tę samą wartość co TCNT0 bez wyzwolenia przerwania, gdy zostanie włączony zegar timera/licznika.
Ponieważ zapis do TCNT0 w dowolnym trybie pracy zablokuje zgodności porównań na jeden cykl zegara timera, istnieje ryzyko związane ze zmianą TCNT0, gdy korzysta się z modułu Output Compare, niezależnie od tego, czy timer/licznik pracuje lub nie pracuje. Jeśli wartość wpisana do TCNT0 jest równa wartości OCR0x, to zgodność porównania zostanie przegapiona, co da w wyniku niepoprawną generację przebiegu. Nie wpisuj do TCNT0 wartości równej TOP w trybach PWM ze zmiennymi wartościami TOP. Zgodność porównania dla TOP zostanie zignorowana i licznik będzie kontynuował zliczanie do 0xFFFF. Podobnie, nie wpisuj do TCNT0 wartości równej BOTTOM, gdy licznik zlicza w dół. Ustawienie OC0x powinno być wykonane przed ustawieniem w rejestrze kierunku danych (ang. Data Direction Register) wyjścia dla końcówki portu. Najprostszym sposobem ustawienia wartości OC0x jest skorzystanie z bitów strobujących wymuszania Output Compare (0x) w trybie normalnym. Rejestr OC0x zachowuje swą zawartość nawet przy zmienianiu trybów generacji przebiegu.
Bądź świadomy, iż bity COM0x1:0 nie są podwójnie buforowane wraz z wartością porównania. Zmiana bitów COM0x1:0 odniesie natychmiastowy skutek.

Bity trybu wyjścia porównania (ang. Compare Output Mode bits, COM0x1:0) posiadają dwie funkcje. Po pierwsze, generator przebiegu wykorzystuje bity COM0x1:0 do definiowania stanu końcówki wyjścia porównania (OC0x) przy kolejnej zgodności porównania. Po drugie, bity COM0x1:0 kontrolują źródło wyjściowe dla końcówki OC0x. Obrazek poniżej pokazuje uproszczony schemat sieci logicznej, na którą oddziałuje ustawienie bitów COM0x1:0. Rejestry we/wy, bity we/wy i końcówki we/wy na tym obrazku opisane są tłustym drukiem. Pokazane są tylko te elementy ogólnych rejestrów sterowania portami we/wy (DDR i PORT), na które wpływają bity COM0x1:0. Przy odwołaniu do stanu OC0x, odwołanie to dotyczy wewnętrznego rejestru OC0x, nie końcówki OC0x. Jeśli wystąpi reset, to rejestr OC0x zostanie wyzerowany.
Moduł wyjścia zgodności porównania (ang. Compare Match Output Unit) w trybie nie związanym z PWM

Ogólna funkcja portu we/we zostaje przejęta przez
Output
Compare (OC0x) z generatora przebiegu,
jeśli dowolny z bitów COM0x1:0 jest ustawiony. Jednakże kierunek
końcówki OC0x (wejście lub wyjście)
jest wciąż kontrolowany przez rejestr kierunku danych
(DDR) dla tej końcówki portu. Bit portu kierunku danych dla końcówki OC0x (DDR_OC0x)
musi być ustawiony jako wyjście, zanim wartość
OC0x stanie się
widoczna na końcówce. Funkcja przejmowania jest niezależna od trybu pracy generatora przebiegu, lecz istnieją pewne wyjątki,
które opisane są dalej w tym rozdziale.
Zasada działania sieci logicznej dla
końcówki Compare Output
pozwala na inicjalizację stanu OC0x przed uaktywnieniem wyjścia.
Zwróć uwagę, że niektóre z ustawień bitów COM0x1:0 są zarezerwowane tylko dla pewnych trybów pracy. Zobacz do podrozdziału "Opis Rejestrów".
Bity COM0x1:0 nie wpływają na moduł Input Capture.
Generator przebiegu wykorzystuje bity
COM0x1:0 w różny sposób
w trybach: normalnym, CTC i PWM . We wszystkich trybach
ustawienie
Zmiana stanu bitów COM0x1:0 wpłynie na pierwszą zgodność
porównania po zapisaniu tych bitów. Dla trybów różnych od PWM
działanie może być natychmiast wymuszone za pomocą bitów
strobujących FOC0x.
Tryb pracy, tj. zachowanie się timera/licznika i końcówek wyjścia porównania, jest zdefiniowany przez kombinację bitów trybu generacji przebiegu (WGM03:0) oraz bitów trybu Compare Output (COM0x1:0). Bity trybu Compare Output nie wpływają na sekwencję zliczania, natomiast bity trybu generacji przebiegu wpływają na nią. Bity COM0x1:0 kontrolują, czy generowane wyjście PWM ma być zaprzeczone, czy nie (ang. inverted lub non-inverted PWM). Dla trybów różnych od trybów PWM bity COM0x1:0 kontrolują, czy sygnał wyjściowy powinien być ustawiany na 1, zerowany lub zmieniany na przeciwny (0 → 1, 1 → 0) przy zgodności porównania (“Moduł wyjścia zgodności porównania").
Najprostszym trybem pracy jest tryb normalny (ang. Normal Mode, WGM03:0 = 0). W tym trybie kierunek zliczania jest zawsze w górę (stan licznika się zwiększa przy każdym impulsie zegarowym) i nie jest wykonywane żadne zerowanie licznika. Licznik po prostu się przewija, gdy osiąga swoją maksymalną wartość 16-bitową (MAX = 0xFFFF), a później startuje ponownie od wartości BOTTOM (0x0000). W trybie normalnym znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) zostanie ustawiony w tym samym cyklu zegarowym, gdy TCNT0 osiąga wartość zero. Znacznik TOV0 w tym przypadku zachowuje się jak 17-ty bit z tym wyjątkiem, że jest tylko ustawiany, nie zerowany. Jednakże w połączeniu z przerwaniem od przepełnienia timera (ang. timer overflow interrupt), które automatycznie zeruje znacznik TOV0, rozdzielczość timera może zostać zwiększona programowo. Nie ma specjalnych przypadków do rozważenia w trybie normalnym, nowa wartość dla licznika może zostać wpisana w dowolnym momencie.
W trybie normalnym używanie modułu Input Capture jest łatwe. Jednakże postaraj się przestrzegać, aby maksymalny interwał pomiędzy zdarzeniami zewnętrznymi nie przekraczał rozdzielczości licznika. Jeśli interwał pomiędzy dwoma zdarzeniami zewnętrznymi jest zbyt długi, musi zostać użyte przerwanie od przepełnienia timera lub preskaler, aby poszerzyć rozdzielczość modułu rejestracji zdarzeń.
Moduły Output Compare mogą być użyte do generowania przerwań w określonych momentach czasu. Używanie Output Compare do generacji przebiegów w trybie normalnym nie jest zalecane, ponieważ zabiera to zbyt wiele czasu mikroprocesora.
W trybie zerowania timera przy zgodności porównania (ang. Clear Timer on Compare, CTC) (WGM03:0 = 4 lub 12), rejestr OCR0A lub rejestr ICR0 jest używany do manipulowania rozdzielczością licznika. W trybie CTC licznik jest zerowany, gdy jego wartość (TCNT0) zrówna się albo z OCR0A (WGM03:0 = 4), albo z ICR0 (WGM03:0 = 12). Rejestr OCR0A lub ICR0 definiuje wartość szczytową dla licznika, a stąd również jego rozdzielczość. Ten tryb zapewnia większą kontrolę nad częstotliwością wyjścia zgodności porównania. Upraszcza również operację zliczania zdarzeń zewnętrznych.
Wykres czasowy dla trybu CTC jest pokazany na poniższym rysunku. Wartość licznika (TCNT0) zwiększa się aż do pojawienia się zgodności porównania albo z OCR0A, albo z ICR0, a wtedy licznik (TCNT0) jest zerowany.

Przerwanie może zostać wygenerowane za każdym razem, gdy
wartość licznika osiąga wartość TOP przy użyciu albo
znacznika OCF0A, albo ICF0, zgodnie z rejestrem używanym do definiowania
wartości TOP. Jeśli to przerwanie jest uaktywnione, to procedura
jego obsługi może zostać użyta do uaktualniania wartości TOP.
Jednakże zmiana TOP na wartość bliską BOTTOM przy uruchomionym
liczniku bez preskalera lub z małą wartością podziału
preskalera
musi być dokonywana ostrożnie, ponieważ tryb CTC nie posiada
opcji podwójnego buforowania. Jeśli nowa wartość wpisana do
OCR0A
lub
ICR0 jest niższa od bieżącej wartości
TCNT0, licznik przegapi
zgodność
porównania. W takim przypadku będzie on musiał zliczać do swojej
wartości maksymalnej
(0xFFFF) i przewinąć się do 0x0000, zanim wystąpi
zgodność porównania. W wielu przypadkach taka cecha jest
niepożądana. Alternatywą będzie wtedy użycie szybkiego trybu PWM, wykorzystując OCR0A
do definiowania TOP
(WGM03:0 = 15), ponieważ
OCR0A
jest wtedy podwójnie buforowany.
Przy generowaniu przebiegu wyjściowego w trybie CTC
wyjście OC0A
może zostać ustawione na zmianę swojego poziomu logicznego przy
każdej zgodności porównania przez ustawienie bitów trybu
Compare Output na tryb zmiany (COM0A1:0 =
1). Wartość OC0A nie będzie widoczna na końcówce portu aż do ustawienia kierunku danych na wyjście
(DDR_OC0A = 1). Generowany przebieg będzie posiadał
maksymalną częstotliwość

Zmienna N reprezentuje współczynnik preskalera (1, 8, 64, 256 lub 1024).
Tak samo jak w trybie normalnym znacznik TOV0 jest ustawiany w tym samym cyklu zegara timera, gdy licznik zmienia stan z MAX na 0x0000.
Szybki tryb PWM (ang. fast Pulse Width Modulation mode) (WGM03:0 = 5, 6, 7, 14 lub 15) udostępnia opcję generowania przebiegu PWM o wysokiej częstotliwości. Szybkie PWM różni się od innych opcji PWM zliczaniem tylko w jednym kierunku. Licznik zlicza od BOTTOM do TOP i znów rozpoczyna od BOTTOM. W trybie nieodwróconym Output Compare (ang. non-inverting Compare Output mode) wyjście Output Compare (OC0x) jest zerowane przy zgodności porównania pomiędzy TCNT0 a OCR0x i ustawiane przy BOTTOM. W trybie odwróconym Output Compare (ang. inverting Compare Output mode) wyjście jest ustawiane przy zgodności porównania i zerowane przy BOTTOM. Z powodu tego zliczania tylko w jednym kierunku, częstotliwość pracy szybkiego trybu PWM może być dwukrotnie wyższa niż w trybach PWM z poprawnością fazy i z poprawności fazy i częstotliwości, które wykorzystują zliczanie dwukierunkowe. Ta wysoka częstotliwość sprawia, że szybki tryb PWM dobrze nadaje się do aplikacji sterujących mocą, stabilizacją oraz przetwarzaniem cyfrowo/analogowym. Wysoka częstotliwość umożliwia stosowanie mniejszych wymiarowo elementów zewnętrznych (cewek, kondensatorów), a przez to zmniejsza całkowity koszt systemu.
Rozdzielczość PWM dla szybkiego PWM może zostać ustalona na 8, 9,10 bitów lub zdefiniowana albo przez ICR0, albo przez OCR0A. Minimalna, dozwolona rozdzielczość to 2 bity (ICR0 lub OCR0A ustawione na 0x0003), a maksymalna rozdzielczość to 16 bitów (ICR0 lub OCR0A ustawione na MAX). Rozdzielczość PWM w bitach można obliczyć z poniższego wzoru:

W szybkim trybie
PWM licznik jest zwiększany co 1, aż jego zawartość będzie równa
jednej z ustalonych wartości 0x00FF, 0x01FF lub 0x03FF
(WGM03:0 = 5, 6 lub 7), wartości w
ICR0

Znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany zawsze, gdy licznik osiąga TOP. Dodatkowo znacznik OC0A lub ICF0 jest ustawiany w tym samym cyklu zegarowym timera co TOV0, gdy OCR0A lub ICR0 jest używany do definiowania wartości TOP. Jeśli jedno z przerwań jest uaktywnione, to procedura jego obsługi może zostać użyta do uaktualniania wartości TOP oraz wartości do porównań.
Przy zmianie wartości TOP program musi zapewnić, że nowa wartość TOP jest wyższa lub równa wartości wszystkich rejestrów porównawczych. Jeśli będzie ona niższa, to zgodność porównania nigdy nie wystąpi pomiędzy TCNT0 a OCR0x. Zwróć uwagę, że przy korzystaniu z ustalonych wartości TOP nieużywane bity są maskowane na zero, gdy zostanie zapisany dowolny z rejestrów OCR0x.
Procedura uaktualniania ICR0 różni się od uaktualniania OCR0A, gdy rejestr ten jest używany do definiowania wartości TOP.
Rejestr ICR0 nie jest podwójnie buforowany. Oznacza to, iż przy zmianie zawartości ICR0 na niską wartość przy uruchomionym liczniku lub przy niskiej wartości preskalera, istnieje ryzyko, iż zapisana nowa zawartość ICR0 przegapi zgodność porównania przy wartości TOP. Licznik będzie wtedy musiał zliczyć do wartości MAX (0xFFFF) i przewinąć się na 0x0000, zanim zgodność porównania będzie mogła wystąpić. Jednakże rejestr OCR0A jest podwójnie buforowany. Cecha ta pozwala zapisać komórkę we/wy OCR0A w dowolnym momencie. Gdy następuje zapis komórki we/wy OCR0A, zapisywana wartość trafi do rejestru buforowego OCR0A. Rejestr porównawczy OCR0A zostanie następnie uaktualniony wartością w buforze przy następnym cyklu zegarowym timera, gdy TCNT0 osiągnie TOP. Uaktualnienie jest wykonywane w tym samym cyklu zegarowym timera, gdy TCNT0 jest zerowany a znacznik TOV0 ustawiany.
Używanie rejestru ICR0 do definiowania wartości TOP działa dobrze z ustalonymi wartościami TOP. Przez użycie ICR0 rejestr OCR0A zostaje zwolniony i można go wykorzystać do generowania wyjścia PWM na końcówce OC0A. Jednakże, jeśli bazowa częstotliwość PWM zmienia się aktywnie (poprzez zmianę wartości TOP), to używanie OCR0A jako TOP jest w oczywisty sposób lepszym wyborem z uwagi na jego podwójne buforowanie.
W szybkim trybie PWM moduły porównawcze pozwalają generować przebiegi PWM na końcówkach OC0x. Ustawienie bitów COM0x1:0 na 2 utworzy przebieg PWM nieodwrócony, a przebieg odwrócony PWM można wygenerować przez ustawienie bitów COM0x1:0 na 3. Faktyczna wartość OC0x stanie się widoczna na końcówce portu, jeśli kierunek danych dla tej końcówki zostanie ustawiony jako wyjście (DDR_OC0x). Przebieg PWM jest generowany przez ustawianie (lub zerowanie) rejestru OC0x przy zgodności porównania pomiędzy OCR0x a TCNT0 oraz zerowanie (lub ustawianie) rejestru OC0x przy cyklu zegarowym timera zerującym licznik (zmiany z TOP na BOTTOM).
Częstotliwość PWM wyjścia można obliczyć z następującego wzoru:

Zmienna N reprezentuje dzielnik preskalera (1, 8, 64, 256 lub 1024).
Wartości ekstremalne rejestru
OCR0x reprezentują specjalne
przypadki przy generacji przebiegu wyjściowego PWM w szybkim
trybie PWM. Jeśli
OCR0x jest ustawiony na wartość równą
BOTTOM (0x0000), to na wyjściu pojawią
się wąskie szpilki przy każdym
Przebieg wyjściowy z wypełnieniem 50% w szybkim trybie PWM można
osiągnąć przez ustawienie OC0A na zmianę poziomu logicznego przy
każdej zgodności porównania (COM0A1:0 = 1).
Generowany przebieg będzie posiadał maksymalną częstotliwość
Tryb PWM poprawny fazowo (ang. phase correct Pulse Width Modulation mode) (WGM03:0 = 1, 2, 3, 10 lub 11) pozwala generować przebiegi PWM z poprawną fazą. Opiera się on na dwukierunkowym działaniu licznika, który w pętli liczy od wartości BOTTOM (0x0000) do TOP, a następnie wstecz od TOP do BOTTOM. W trybie nieodwróconym Output Compare (ang. non-inverting Compare Output mode) wyjście Output Compare (OC0x) jest zerowane przy zgodności porównania pomiędzy TCNT0 a OCR0x przy zliczaniu w górę oraz ustawiane przy tej zgodności porównania w czasie zliczania w dół. W trybie odwróconym Output Compare (ang. inverting Output Compare mode) działanie jest odwrotne. Zliczanie dwukierunkowe powoduje mniejszą szybkość działania niż przy zliczaniu jednokierunkowym. Jednakże z powodu symetrycznej natury trybów PWM przy zliczaniu dwukierunkowym są one preferowane w aplikacjach sterujących silnikami.
Rozdzielczość dla trybu PWM poprawnego fazowo może zostać ustalona na 8, 9, 10 bitów lub zdefiniowana przez rejestr ICR0 lub OCR0A. Najmniejsza dozwolona rozdzielczość wynosi 2 bity (ICR0 lub OCR0A ustawiony na 0x0003), a maksymalna rozdzielczość wynosi 16 bitów (ICR0 lub OCR0A ustawiony na MAX). Rozdzielczość PWM w bitach może zostać obliczona wg następującego wzoru:

W trybie PWM poprawnym fazowo licznik jest zwiększany aż jego zawartość zrówna się albo z jedną z ustalonych wartości 0x00FF, 0x01FF, 0x03FF (WGM03:0 = 1, 2 lub 3), albo z wartością w ICR0 (WGM03:0 = 10), albo z wartością w OCR0A (WGM03:0 = 11). W tym momencie licznik osiągną swoją wartość TOP i zmienia kierunek zliczania. Zawartość TCNT0 będzie równa TOP przez jeden cykl zegara timera. Poniżej przedstawiony jest wykres czasowy dla trybu PWM poprawnego fazowo, gdy rejestr OCR0A lub ICR0 jest używany do definiowania TOP. Na wykresie wartość TCNT0 jest pokazana w postaci histogramu, który ilustruje operację zliczania w obu kierunkach. Wykres zawiera wyjścia nieodwrócone i odwrócone PWM. Małe znaczki poziome na zboczach TCNT0 reprezentują zgodności porównań pomiędzy OCR0x a TCNT0. Znacznik przerwania OC0x jest ustawiany, gdy wystąpi zgodność porównania.

Znacznik przepełnienia timera/licznika
(ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany
za każdym razem, gdy licznik osiąga
BOTTOM. Gdy do definiowania
TOP jest używany rejestr
OCR0A
lub
ICR0, to zostaje odpowiednio
ustawiony znacznik OC0A lub
ICF0 w tym samym cyklu zegarowym
timera, gdy rejestry OCR0x
są uaktualniane wartością z bufora (przy TOP). Znaczniki przerwania mogą
zostać użyte do generowania przerwania za każdym razem, gdy
licznik osiąga wartość TOP lub BOTTOM.
Gdy zmieniana jest wartość TOP, program musi się upewnić, że nowa wartość TOP jest większa lub równa wartości wszystkich
rejestrów porównawczych. Jeśli jest ona mniejsza, to zgodność
porównania nigdy nie wystąpi pomiędzy TCNT0
a
OCR0x. Zwróć uwagę, iż przy używaniu
ustalonych wartości TOP, nieużywane bity są maskowane na zero,
gdy zostanie zapisany dowolny z rejestrów OCR0x. Jak pokazuje
okres trzeci na powyższym rysunku, aktywna zmiana wartości TOP
podczas pracy timera/licznika w trybie poprawnym fazowo może
doprowadzić do niesymetrycznego przebiegu wyjściowego. Powodem
tego zachowania jest czas uaktualnienia rejestru
OCR0x. Ponieważ uaktualnienie
OCR0x wykonywane jest przy TOP, okres
PWM zaczyna się i kończy przy TOP. Powoduje to, iż długość
zbocza opadającego jest określona przez poprzednią wartość TOP,
natomiast długość zbocza wznoszącego się jest określona przez
nową wartość TOP. Gdy te dwie wartości się różnią, to te dwa
zbocza okresu będą miały różną długość. Różnica w długości daje
niesymetryczny wynik na wyjściu.
Zaleca się używanie trybu poprawnego fazowo i częstotliwościowo zamiast trybu poprawnego fazowo, gdy zmieniana jest wartość TOP przy uruchomionym timerze/liczniku. Gdy stosowana jest statyczna wartość TOP, nie ma praktycznie żadnych różnic pomiędzy tymi dwoma trybami pracy.
W trybie PWM poprawnym fazowo moduły porównawcze pozwalają generować przebiegi PWM na końcówkach OC0x. Ustawienie bitów COM0x1:0 na 2 wytworzy nieodwrócony przebieg PWM, a przebieg odwrócony powstanie przy ustawieniu COM0x1:0 na 3. Wartość OC0x stanie się widoczna na końcówce portu, jeśli kierunek danych dla tej końcówki będzie ustawiony jako wyjście (DDR_OC0x). Przebieg PWM jest generowany przez ustawianie (lub zerowanie) rejestru OC0x przy zgodności porównania pomiędzy OCR0x a TCNT0, gdy licznik zlicza w górę, a przez zerowanie (lub ustawianie) rejestru OC0x przy zgodności porównania pomiędzy OCR0x a TCNT0, gdy licznik zlicza w dół. Wyjściowa częstotliwość przebiegu PWM w trybie poprawnym fazowo może zostać wyliczona z poniższego wzoru:

Zmienna N reprezentuje dzielnik preskalera (1, 8, 64, 256 lub 1024).
Wartości ekstremalne dla rejestru OCR0x reprezentują specjalne przypadki przy generacji przebiegu PWM w trybie poprawnym fazowo. Jeśli OCR0x zostanie ustawiony na BOTTOM, to w trybie nieodwróconym PWM wyjście będzie stale w stanie niskim, a jeśli ustawi się go na TOP, to na wyjściu ciągle będzie stan wysoki. W odwróconym trybie PWN wyjście będzie w przeciwnych wartościach logicznych.
Tryb PWM z poprawną fazą i częstotliwością (ang. phase and frequency correct Pulse Width Modulation mode) (WGM03:0 = 8 or 9) pozwala tworzyć przebiegi z wysoką rozdzielczością fazy i częstotliwości. Tryb ten, podobnie jak tryb poprawny fazowo oparty jest na dwukierunkowym zliczaniu. Licznik w kółko zlicza od BOTTOM (0x0000) do TOP, a następnie od TOP do BOTTOM. W nieodwróconym trybie Compare Output, wyjście Output Compare (OC0x) jest zerowane przy zgodności porównania pomiędzy TCNT0 a OCR0x przy zliczaniu w górę, a ustawiane przy tej zgodności porównania przy zliczaniu w dół. W trybie odwróconym Compare Output operacja jest wykonywana na odwrót. Dwukierunkowe zliczanie daje mniejszą maksymalną częstotliwość działania w porównaniu do zliczania jednokierunkowego. Jednakże z powodu symetrii zliczania dwukierunkowego w tych trybach PWM, preferowane one są w aplikacjach sterujących silnikami.
Główną różnicą pomiędzy trybami PWM poprawnymi fazowo a trybami poprawnymi fazowo i częstotliwościowo jest czas aktualizacji rejestru OCR0x przez rejestr buforowy OCR0x.
Rozdzielczość PWM w trybie poprawnym fazowo i częstotliwościowo można zdefiniować albo przez ICR0, albo przez OCR0A. Najmniejsza dozwolona rozdzielczość wynosi 2 bity (ICR0 lub OCR0A ustawiony na 0x0003), a maksymalną rozdzielczością jest 16 bitów (ICR0 lub OCR0A ustawione na MAX). Rozdzielczość PWM w bitach liczymy z następującego wzoru:

W trybie PWM poprawnym fazowo i częstotliwościowo licznik jest zwiększany, aż jego zawartość będzie równa albo zawartości ICR0 (WGM03:0 = 8), albo zawartości OCR0A (WGM03:0 = 9). W tym momencie licznik osiąga TOP i zmienia kierunek zliczania. Wartość TCNT0 będzie równa TOP przez jeden cykl zegarowy timera. Poniższy rysunek przedstawia wykres czasowy dla trybu PWM poprawnego fazowo i częstotliwościowo. Wykres odnosi się do przypadku, gdy TOP definiuje rejestr OCR0A lub ICR0. Wartość TCNT0 na tym wykresie została przedstawiona jako histogram dla zilustrowania dwukierunkowego zliczania. Wykres zawiera odwrócone i nieodwrócone wyjścia PWM. Mała pozioma kreska na zboczach TCNT0 reprezentuje zgodność porównania pomiędzy OCR0x a TCNT0. Znacznik przerwania OC0x zostanie ustawiony przy wystąpieniu zgodności porównania.

Znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany w tym samym cyklu zegarowym timera, w którym rejestry OCR0x są uaktualniane zawartością z bufora tymczasowego (przy BOTTOM). Gdy do definiowania TOP wykorzystywany jest albo rejestr OCR0A, albo ICR0, to znacznik OC0A lub ICF0 jest ustawiany przy osiągnięciu TOP przez TCNT0.
Wtedy ten znacznik przerwania może zostać wykorzystany do generacji przerwania za każdym razem, gdy licznik osiąga wartość TOP lub BOTTOM.
Przy zmianie wartości TOP program musi zapewnić, że nowa wartość TOP jest wyższa lub równa wartości wszystkich rejestrów porównawczych. Jeśli będzie ona niższa od zawartości dowolnego z rejestrów porównawczych, to zgodność porównania nigdy nie wystąpi pomiędzy TCNT0 a OCR0x.
Jak pokazuje powyższy rysunek przebieg wyjściowy jest, w przeciwieństwie do trybu poprawnego fazowo, symetryczny we wszystkich okresach. Ponieważ rejestry OCR0x są uaktualniane przy BOTTOM, długość zboczy rosnącego i opadającego będzie zawsze równa. Tworzy to symetryczne impulsy na wyjściu i dlatego jest poprawne częstotliwościowo.
Używanie rejestru ICR0 do definiowania TOP działa dobrze przy stosowaniu ustalonych wartości TOP. Przez użycie ICR0 rejestr OCR0A pozostaje wolny i można go wykorzystać przy generowaniu sygnału PWM na OC0A. Jednakże, jeśli podstawowa częstotliwość PWM jest aktywnie zmieniana przez modyfikowanie wartości TOP, to używanie OCR0A jako TOP jest w oczywisty sposób lepszym wyborem z powodu cechy podwójnego buforowania.
W trybie PWN poprawnym fazowo i częstotliwościowo moduły porównawcze pozwalają generować przebiegi PWM na końcówkach OC0x. Ustawienie bitów COM0x1:0 na dwa utworzy przebieg PWM nieodwrócony, a przebieg PWM odwrócony może zostać wygenerowany przez ustawienie COM0x1:0 na trzy. Faktyczna wartość OC0x stanie się widoczna na końcówce portu, jeśli dla tej końcówki zostanie ustawiony kierunek danych jako wyjście (DDR_OC0x). Przebieg PWM jest generowany przez ustawianie (lub zerowanie) rejestru OC0x przy zgodnościach porównań pomiędzy OCR0x a TCNT0, gdy licznik zwiększa swą zawartość, a zerowanie (lub ustawianie) rejestru OC0x przy zgodnościach porównań pomiędzy OCR0x a TCNT0, gdy licznik zmniejsza swoją zawartość. Częstotliwość PWM dla przebiegu utworzonego w trybie PWM poprawnym fazowo i częstotliwościowo można obliczyć z poniższego wzoru:

Zmienna N
reprezentuje dzielnik preskalera (1, 8, 64,
256 lub 1024).
Ekstremalne wartości rejestru
OCR0x reprezentują specjalne przypadki przy generacji
przebiegu PWM w trybie poprawnym fazowo i częstotliwościowo.
Jeśli w trybie nieodwróconym PWM
OCR0x jest ustawiony na wartość równą BOTTOM, to wyjście będzie ciągle znajdować się w stanie
niskim, a jeśli zostanie ustawiony na TOP, to wyjście będzie ciągle w stanie wysokim. W trybie odwróconym PWM
wyjście
to będzie przyjmowało odwrotne wartości logiczne.
Timer/licznik jest urządzeniem zaprojektowanym jako synchroniczne i stąd zegar timera (clkT0) jest pokazany na kolejnych obrazkach jako sygnał zegarowy uaktywniający funkcje. Obrazki zawierają informacje o momencie ustawiania znaczników przerwania oraz uaktualniania rejestru OCR0x wartością z bufora OCR0x (jedynie dla trybów wykorzystujących podwójne buforowanie). Poniższy rysunek przedstawia wykres czasowy ustawiania OCF0x:
Wykres czasowy Timera/Licznika, Ustawianie OCF0x, bez preskalera

Kolejny rysunek przedstawia ten sam wykres czasowy, lecz z włączonym preskalerem:
Wykres czasowy Timera/Licznika, Ustawianie OCF0x, z Preskalerem (fclk_I/O/8)

Następny rysunek przedstawia sekwencję zliczania bliską TOP w różnych trybach. Gdy jest używany tryb PWM poprawny fazowo i częstotliwościowo, to rejestr
OCR0x jest uaktualniany przy wartości BOTTOM. Wykresy
czasowe będą takie same, lecz TOP powinno zostać zastąpione
przez BOTTOM,
Wykres czasowy Timera/Licznika, bez Preskalera

Poniższy rysunek przedstawia ten sam wykres czasowy, lecz z włączonym preskalerem.

Rejestry TCNT0, OCR0A, OCR0B ICR0 są rejestrami 16-bitowymi, do których dostęp w mikrokontrolerach AVR następuje poprzez 8-bitową magistralę danych. Rejestr 16-bitowy wymaga dwóch bajtowych operacji odczytu lub zapisu. Każdy 16-bitowy timer posiada pojedynczy 8-bitowy rejestr na tymczasowe przechowanie górnego bajtu przy dostępie 16-bitowym. Ten sam rejestr tymczasowy jest współdzielony pomiędzy wszystkimi 16-bitowymi rejestrami wewnątrz 16-bitowego timera. Dostęp do dolnego bajtu wyzwala 16-bitową operację odczytu lub zapisu. Gdy dolny bajt 16-bitowego rejestru jest zapisywany przez mikroprocesor, górny bajt zapisany w rejestrze tymczasowym oraz zapisywany dolny bajt są razem kopiowane do 16-bitowego rejestru w tym samym cyklu zegarowym. Gdy dolny bajt 16-bitowego rejestru jest odczytywany przez mikroprocesor, to górny bajt 16-bitowego rejestru jest kopiowany do rejestru tymczasowego w tym samym cyklu zegara, co odczyt dolnego bajtu.
Nie każdy dostęp 16-bitowy wykorzystuje rejestr tymczasowy na górny bajt. Odczyt 16-bitowych rejestrów OCR0A i OCR0B
nie korzysta z rejestru tymczasowego.
Aby dokonać 16-bitowego zapisu, górny bajt musi być zapisany
przed dolnym bajtem. Przy 16-bitowym odczycie dolny bajt musi
zostać odczytany przed górnym bajtem.
Poniższy przykład kodu pokazuje, w jaki sposób uzyskać dostęp do 16-bitowych rejestrów timera przy założeniu, że żadne przerwania nie uaktualniają rejestru tymczasowego. Ta sama zasada może być stosowana przy dostępie do rejestrów OCR0A, OCR0B i ICR0.
...
; Ustaw TCNT0 na 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNT0H,r17
out TCNT0L,r16
; Odczytaj TCNT0 do r17:r16
in r16,TCNT0L
in r17,TCNT0H
...
|
Przykładowy kod zwraca wartość TCNT0 w parze rejestrów r17:r16.
Ważnym jest zauważenie, iż dostęp do rejestrów 16-bitowych jest operacją atomową (niepodzielną). Jeśli przerwanie wystąpi pomiędzy dwoma instrukcjami uzyskującymi dostęp do rejestru 16-bitowego, a kod przerwania aktualizuje rejestr tymczasowy przez dostęp do tego samego rejestru lub do innych rejestrów 16-bitowych timera, to wynik tej operacji po powrocie z przerwania będzie niepoprawny. Dlatego, gdy zarówno kod podstawowy jak i kod przerwania uaktualniają rejestr tymczasowy, kod podstawowy musi zablokować przerwania podczas 16-bitowego dostępu.
Poniższy przykład kodu pokazuje, jak wykonać atomowy odczyt zawartości rejestru TCNT0. Tak samo można odczytywać dowolny z rejestrów OCR0A, OCR0B lub ICR0.
TIM16_ReadTCNT0:
; Zapamiętaj globalny znacznik przerwań
in r18,SREG
; Wyłącz przerwania
cli
; Czytaj TCNT0 do r17:r16
in r16,TCNT0L
in r17,TCNT0H
; Odtwórz globalny znacznik przerwań
out SREG,r18
ret
|
Przykładowy kod zwraca wartość TCNT0 w parze rejestrów r17:r16. Dodatkowo wykorzystywany jest rejestr r18 do tymczasowego przechowania rejestru stanu SREG.
Poniższy przykład kodu pokazuje, jak wykonać atomowy zapis zawartości rejestru TCNT0. Tak samo można zapisywać dowolny z rejestrów OCR0A, OCR0B lub ICR0.
TIM16_WriteTCNT0:
; Zapamiętaj globalny znacznik przerwań
in r18,SREG
; Wyłącz przerwania
cli
; Ustaw TCNT0 na r17:r16
out TCNT0H,r17
out TCNT0L,r16
; Odtwórz globalny znacznik przerwań
out SREG,r18
ret |
Przykład kodu wymaga umieszczenia w parze rejestrów r17:r16 wartości do zapisania w TCNT0. Dodatkowo rejestr r18 wykorzystywany jest do tymczasowego przechowania rejestru stanu SREG.
Przy zapisie do więcej niż jednego rejestru 16-bitowego, gdzie górny bajt jest taki sam dla wszystkich zapisywanych rejestrów, górny bajt może być zapisany tylko jeden raz. Jednakże zasada atomowego dostępu, opisana wcześniej, wciąż w tym przypadku obowiązuje.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x2E | COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 | TCCR0A |
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | O | O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bity COM0A1:0 i COM0B1:0 sterują zachowaniem końcówek Output Compare: odpowiednio OC0A i OC0B. Jeśli jeden lub oba bity COM0A1:0 zostaną zapisane stanem 1, to wyjście OC0A przejmuje normalną funkcję portu na końcówce we/we, do której jest podłączone. Podobnie, jeśli jeden lub oba bity COM0B1:0 zostaną ustawione na 1, wyjście OC0B przejmuje końcówkę I/O podłączoną do niego.
Zwróć jednak uwagę, że bit rejestru kierunku danych (ang. Data Direction Register bit, DDR) odpowiadający końcówce OC0A lub OC0B musi być ustawiony, aby końcówka pracowała jako wyjście.
Gdy OC0A lub OC0B jest podłączone do końcówki, funkcja bitów COM0x1:0 zależy od bitów WGM03:0. Poniższa tabela pokazuje funkcje bitów COM0x1:0, gdy bity WGM03:0 są ustawione na tryb normalny lub CTC (nie-PWM):.
| COM0A1/ COM0B1 |
COM0A0/ COM0B0 |
Opis |
| 0 | 0 | Normalne działanie portu: OC0A/OC0B odłączone |
| 1 | Zmiana stanu OC0A/OC0B na przeciwny przy zgodności porównania | |
| 1 | 0 | Zerowanie OC0A/OC0B przy zgodności porównania |
| 1 | Ustawianie OC0A/OC0B przy zgodności porównania |
Kolejna tabela pokazuje funkcje bitów COM0x1:0, gdy bity WGM03:0 są ustawione na szybkie tryby PWM.
| COM0A1/ COM0B1 |
COM0A0/ COM0B0 |
Opis |
| 0 | 0 | Normalne działanie portu: OC0A/OC0B odłączone |
| 1 | WGM03 = 0: Normalne działanie portu:
OC0A/OC0B
odłączone WGM03 = 1: Zmiana stanu OC0A na przeciwny przy zgodności porównania, OC0B zarezerwowane |
|
| 1(1) | 0 | Zerowanie OC0A/OC0B przy zgodności porównania Ustawianie OC0A/OC0B przy BOTTOM (tryb nieodwrócony) |
| 1 | Ustawianie OC0A/OC0B przy
zgodności porównania Zerowanie OC0A/OC0B przy BOTTOM (tryb odwrócony) |
| Uwaga: | 1.
Specjalny przypadek występuje, gdy
OCR0A/OCR0B jest równe TOP i COM0A1/COM0B1 jest ustawiony. Wtedy zgodność porównania jest ignorowana, lecz ustawianie/zerowanie jest wykonywane przy BOTTOM. Zobacz na "Szybki tryb PWM". |
Kolejna tabela pokazuje funkcje bitów COM0x1:0, gdy bity WGM03:0 są ustawione na tryb PWM poprawny fazowo lub poprawny fazowo i częstotliwościowo.
| COM0A1/ COM0B1 |
COM0A0/ COM0B0 |
Opis |
| 0 | 0 | Normalne działanie portu: OC0A/OC0B odłączone |
| 1 | WGM03 = 0: Normalne działanie portu:
OC0A/OC0B
odłączone WGM03 = 1: Zmiana stanu OC0A na przeciwny przy zgodności porównania, OC0B zarezerwowane |
|
| 1(1) | 0 | Zliczanie w górę: Zerowanie OC0A/OC0B przy
zgodności porównania Zliczanie w dół: Ustawianie OC0A/OC0B przy zgodności porównania |
| 1 | Zliczanie w górę: Ustawianie OC0A/OC0B przy
zgodności porównania Zliczanie w dół: Zerowanie OC0A/OC0B przy zgodności porównania |
| Uwaga: | 1.
Specjalny przypadek występuje, gdy
OCR0A/OCR0B jest równe TOP i bit COM0A1/COM0B1 jest ustawiony. Zobacz na “Tryb PWM poprawny fazowo". |
W połączeniu z bitami WGM03:2 w rejestrze TCCR0B bity te sterują sekwencją zliczania licznika, źródłem dla wartości maksymalnej (TOP) licznika oraz rodzajem przebiegu do generowania. Obsługiwane tryby pracy modułu timera/licznika to: tryb normalny (licznik), tryb zerowania timera przy zgodności porównania (CTC) oraz trzy tryby PWM. (Zobacz do rozdziału "Tryby pracy").
| Tryb | WGM0 3:0 |
Tryb działania | TOP | Uaktualnianie OCR0X przy |
Znacznik TOV0 ustawiany przy |
| 0 | 0000 | Normalny | 0xFFFF | Natychmiast | MAX |
| 1 | 0001 | PWM, poprawna faza, 8 bitów | 0x00FF | TOP | BOTTOM |
| 2 | 0010 | PWM, poprawna faza, 9 bitów | 0x01FF | TOP | BOTTOM |
| 3 | 0011 | PWM, poprawna faza, 10 bitów | 0x03FF | TOP | BOTTOM |
| 4 | 0100 | CTC (zerowanie przy zgodności) | OCR0A | Natychmiast | MAX |
| 5 | 0101 | Szybki PWM, 8 bitów | 0x00FF | TOP | TOP |
| 6 | 0110 | Szybki PWM, 9 bitów | 0x01FF | TOP | TOP |
| 7 | 0111 | Szybki PWM, 10 bitów | 0x03FF | TOP | TOP |
| 8 | 1000 | PWM, poprawna faza i częstotliwość | ICR0 | BOTTOM | BOTTOM |
| 9 | 1001 | PWM, poprawna faza i częstotliwość | OCR0A | BOTTOM | BOTTOM |
| 10 | 1010 | PWM, poprawna faza | ICR0 | TOP | BOTTOM |
| 11 | 1011 | PWM, poprawna faza | OCR0A | TOP | BOTTOM |
| 12 | 1100 | CTC (zerowanie przy zgodności) | ICR0 | Natychmiast | MAX |
| 13 | 1101 | Zarezerwowane | – | – | – |
| 14 | 1110 | Szybki PWM | ICR0 | TOP | TOP |
| 15 | 1111 | Szybki PWM | OCR0A | TOP | TOP |
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x2D | ICNC0 | ICES0 | - | WGM03 | WGM02 | CS02 | CS01 | CS00 | TCCR0B |
| Zapis/Odczyt | Z/O | Z/O | O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Ustawienie tego bitu aktywuje układ zmniejszania szumu dla Input Capture. Gdy układ ten jest włączony, to wejście z końcówki Input Capture (ICP0) jest filtrowane. Funkcja filtru wymaga czterech kolejnych próbek o równych wartościach na końcówce ICP0, aby wyjście uległo zmianie. Z tego powodu Input Capture jest opóźnione o 4 cykle oscylatora przy włączonym zmniejszania szumów.
Ten bit wybiera, które ze zboczy na końcówce Input Capture (ICP0) zostanie użyte do wyzwolenia zdarzenia Input Capture. Gdy bit ICES0 zostanie zapisany stanem 0, będzie użyte zbocze opadające (ujemne), a gdy bit ICES0 zostanie zapisany stanem 1, zdarzenie Input Capture wyzwoli zbocze rosnące (dodatnie).
Gdy Input Capture zostanie wyzwolone
zgodnie z ustawieniem ICES0, to wartość licznika będzie
skopiowana do rejestru Input Capture (ICR0).
Zdarzenie to ustawi również znacznik Input Capture
(ICF0), a to z kolei można wykorzystać
do generacji przerwania Input Capture, jeśli to przerwanie
zostało uaktywnione.
Gdy ICR0 jest
używany jako wartość TOP (zobacz na opis bitów WGM03:0 umiejscowionych w rejestrach TCCR0A i
TCCR0B), to ICP0 jest odłączone, a w konsekwencji
funkcja Input Capture jest wyłączona.
Ten bit jest zarezerwowany do użycia w przyszłości. Aby zapewnić kompatybilność z przyszłymi mikrokontrolerami, należy go ustawiać na 0 przy zapisach rejestru TCCR0B.
Zobacz na opis bitów WGM01:0 dla rejestru TCCR0A.
Trzy bity wyboru zegara ustawiają źródło zegara do użycia przez timer/licznik.
| CS02 | CS01 | CS00 | Opis |
| 0 | 0 | 0 | Brak źródła zegara (Timer/Licznik zatrzymany) |
| 0 | 0 | 1 | clkI/O/1 (bez preskalera) |
| 0 | 1 | 0 | clkI/O/8 (z preskalera) |
| 0 | 1 | 1 | clkI/O/64 (z preskalera) |
| 1 | 0 | 0 | clkI/O/256 (z preskalera) |
| 1 | 0 | 1 | clkI/O/1024 (z preskalera) |
| 1 | 1 | 0 | Zewnętrzne źródło zegara na końcówce T0. Zliczanie przy opadającym zboczu. |
| 1 | 1 | 1 | Zewnętrzne źródło zegara na końcówce T0. Zliczanie przy narastającym zboczu. |
Jeśli jako źródło zegara zostanie wybrany sygnał zewnętrzny, to zmiany poziomu na końcówce T0 będą sterowały licznikiem, nawet gdy końcówka ta została skonfigurowana jako wyjście. Ta cecha pozwala na programowe sterowanie zliczaniem.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x2C | FOC0A | FOC0B | - | - | - | - | - | - | TCCR0C |
| Zapis/Odczyt | Z | Z | O | O | O | O | O | O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bity FOC0A/FOC0B są aktywne tylko wtedy, gdy bity
WGM03:0
określają tryb nie-PWM. Jednakże w celu zapewnienia
kompatybilności z przyszłymi mikrokontrolerami bity te należy
zapisywać stanami 0 przy zapisie rejestru
TCCR0C w trybach PWM. Gdy bit FOC0A/FOC0B zostanie zapisany
stanem logicznym 1, to w module generacji przebiegu zostaje
wymuszona natychmiastowa zgodność porównania. Wyjście OC0A/OC0B
jest zmieniane zgodnie z ustawieniem bitów
COM0x1:0. Zwróć uwagę, że bity FOC0A/FOC0B są zaimplementowane jako stroby. Dlatego to wartość wpisana do bitów COM0x1:0 określa efekt wymuszonego Output Compare.
Strob
FOC0A/FOC0B nie wygeneruje żadnego przerwania, ani nie wyzeruje
timera w trybie CTC przy użyciu
OCR0A
jako TOP.
Bity FOC0A/FOC0B przy odczycie zawsze dają wartość zero.
Te bity są zarezerwowane dla przyszłego użytku. W celu zapewnienia kompatybilności z przyszłymi mikrokontrolerami, należy je zapisywać stanem 0 przy wpisie danych do tego rejestru.
| Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
| 0x29 | TCNT0[15:8] | TCNT0H | |||||||
| 0x28 | TCNT0[7:0] | TCNT0L | |||||||
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
Dwie komórki we/wy timera/licznika (TCNT0H
i TCNT0L, połączone razem jako TCNT0) dają bezpośredni
dostęp przy zapisie i odczycie do modułu 16 bitowego
timera/licznika. Aby zapewnić, że oba bajty górny i dolny są odczytywane i zapisywane jednocześnie przy dostępie
mikroprocesora do tych rejestrów, dostęp jest wykonywany przy
wykorzystaniu tymczasowego 8 bitowego rejestru
dla górnego bajtu
(TEMP). Rejestr tymczasowy jest współdzielony przez
wszystkie pozostałe rejestry 16-bitowe. Zobacz do rozdziału "Dostęp
do rejestrów 16-bitowych".
Modyfikowanie licznika (TCNT0) w czasie
jego pracy wprowadza ryzyko przegapienia zgodności porównania
pomiędzy TCNT0 a jednym z rejestrów
OCR0x.
Zapis do rejestru TCNT0 blokuje (usuwa) zgodność porównania w następnych cyklach zegara dla wszystkich modułów porównawczych.
| Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
| 0x27 | OCR0A[15:8] | OCR0AH | |||||||
| 0x26 | OCR0A[7:0] | OCR0AL | |||||||
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
| 0x25 | OCR0B[15:8] | OCR0BH | |||||||
| 0x24 | OCR0B[7:0] | OCR0BL | |||||||
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
Rejestry Output Compare zawierają 16-bitową wartość, która jest ciągle porównywana z wartością licznika (TCNT0). Zgodność może zostać wykorzystana do generacji przerwania Output Compare lub do generacji przebiegu wyjściowego na końcówce OC0x.
Rejestry Output Compare mają rozmiar 16-bitów. Aby zapewnić, że oba bajty górny i dolny są odczytywane i zapisywane jednocześnie przy dostępie mikroprocesora do tych rejestrów, dostęp jest wykonywany przy wykorzystaniu tymczasowego 8 bitowego rejestru dla górnego bajtu (TEMP). Rejestr tymczasowy jest współdzielony przez wszystkie pozostałe rejestry 16-bitowe. Zobacz do rozdziału "Dostęp do rejestrów 16-bitowych".
| Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
| 0x23 | ICR0[15:8] | ICR0H | |||||||
| 0x22 | ICR0[7:0] | ICR0L | |||||||
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
Rejestr Input Capture jest zapisywany wartością licznika (TCNT0) za każdym razem, gdy pojawi się zdarzenie Input Capture na końcówce ICP0 (lub opcjonalnie na wyjściu z Komparatora Analogowego dla timera/licznika 0). Rejestr Input Capture może zostać wykorzystany do zdefiniowania dla licznika wartości TOP.
Rejestr Input Capture ma rozmiar 16-bitów. Aby zapewnić, że oba bajty górny i dolny są odczytywane i zapisywane jednocześnie przy dostępie mikroprocesora do tych rejestrów, dostęp jest wykonywany przy wykorzystaniu tymczasowego 8 bitowego rejestru dla górnego bajtu (TEMP). Rejestr tymczasowy jest współdzielony przez wszystkie pozostałe rejestry 16-bitowe. Zobacz do rozdziału "Dostęp do rejestrów 16-bitowych".
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x2B | - | - | ICIE0 | - | - | OCIE0B | OCIE0A | TOIE0 | TIMSK0 |
| Zapis/Odczyt | O | O | Z/O | O | O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane dla przyszłego użytku. W celu zapewnienia kompatybilności z przyszłymi mikrokontrolerami, należy je zapisywać stanem 0 przy wpisie danych do tego rejestru.
Gdy ten bit zostanie zapisany stanem 1 i znacznik I w rejestrze stanu jest ustawiony (przerwania włączone globalnie), to zostaje włączone przerwanie od Input Capture dla timera/licznika 0. Odpowiadający temu przerwaniu wektor (Zobacz do rozdziału "Przerwania") jest wykonywany, gdy zostanie ustawiony znacznik ICF0, zlokalizowany w rejestrze TIFR0.
Gdy ten bit zostanie zapisany stanem 1 i znacznik I w rejestrze stanu jest ustawiony (przerwania włączone globalnie), to zostaje włączone przerwanie od Output Compare B dla timera/licznika 0. Odpowiadający temu przerwaniu wektor (Zobacz do rozdziału "Przerwania") jest wykonywany, gdy zostanie ustawiony znacznik OCF0B, zlokalizowany w rejestrze TIFR0.
Gdy ten bit zostanie zapisany stanem 1 i znacznik I w rejestrze stanu jest ustawiony (przerwania włączone globalnie), to zostaje włączone przerwanie od Output Compare A dla timera/licznika 0. Odpowiadający temu przerwaniu wektor (Zobacz do rozdziału "Przerwania") jest wykonywany, gdy zostanie ustawiony znacznik OCF0A, zlokalizowany w rejestrze TIFR0.
Gdy ten bit zostanie zapisany stanem 1 i znacznik I w rejestrze stanu jest ustawiony (przerwania włączone globalnie), to zostaje włączone przerwanie od przepełnienia timera/licznika 0. Odpowiadający temu przerwaniu wektor (Zobacz do rozdziału "Przerwania") jest wykonywany, gdy zostanie ustawiony znacznik TOV0, zlokalizowany w rejestrze TIFR0.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x2A | - | - | ICF0 | - | - | OCF0B | OCF0A | TOV0 | TIFR0 |
| Zapis/Odczyt | O | O | Z/O | O | O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity są zarezerwowane dla przyszłego użytku. W celu zapewnienia kompatybilności z przyszłymi mikrokontrolerami, należy je zapisywać stanem 0 przy wpisie danych do tego rejestru.
Ten znacznik jest ustawiany, gdy pojawia się
zdarzenie Input
Capture na końcówce ICP0. Gdy bity
WGM03:0 ustawiają
rejestr Input Capture (ICR0)
jako wartość TOP dla licznika, to znacznik ICF0 jest ustawiany,
gdy licznik osiąga wartość TOP.
ICF0 jest automatycznie zerowany, gdy zostanie wykonany wektor przerwania Input Capture. Alternatywnie
znacznik ICF0
można wyzerować przez zapis logicznej jedynki na pozycji jego
bitu.
Ten znacznik jest ustawiany w cyklu zegarowym timera po osiągnięciu przez licznik (TCNT0) wartości zgodnej z zawartością rejestru Output Compare B (OCR0B).
Zwróć uwagę, iż strob wymuszonej zgodności porównania FOC0B nie ustawi znacznika OCF0B.
OCF0B jest automatycznie zerowany po uruchomieniu wektora dla przerwania od Output Compare B. Alternatywnie znacznik OCF0B można wyzerować przez zapis logicznej jedynki na pozycji jego bitu.
Ten znacznik jest ustawiany w cyklu zegarowym timera po osiągnięciu przez licznik (TCNT0) wartości zgodnej z zawartością rejestru Output Compare A (OCR0A).
Zwróć uwagę, iż strob wymuszonej zgodności porównania FOC0A nie ustawi znacznika OCF0A.
OCF0A jest automatycznie zerowany po uruchomieniu wektora dla przerwania od Output Compare A. Alternatywnie znacznik OCF0A można wyzerować przez zapis logicznej jedynki na pozycji jego bitu.
Ustawianie tego znacznika jest uzależnione od ustawienia
bitów WGM03:0. W trybach normalnym i CTC znacznik
TOV0 jest
ustawiany, gdy licznik przepełnia się (osiąga
swoja wartość maksymalną, po czym zeruje się i rozpoczyna
zliczanie od nowa). Zobacz na ustawienia
bitów WGM03:0, gdzie opisano zachowanie się znacznika TOV0
w różnych trybach.
TOV0 jest automatycznie zerowany po uruchomieniu wektora dla
przerwania od przepełnienia timera/licznika 0. Alternatywnie
znacznik TOV0 można wyzerować przez zapis logicznej jedynki na pozycji jego bitu.
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x2F | TSM | - | - | - | - | - | - | PSR | GTCCR |
| Zapis/Odczyt | Z/O | O | O | O | O | O | O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Zapis logicznej jedynki do bitu TSM aktywuje tryb synchronizacji timera/licznika. W trybie tym wartość wpisana do bitu PSR zostaje utrzymana, co daje ciągły sygnał resetu preskalera. Zapewnia to, iż timer/licznik zostaje zatrzymany i można go skonfigurować bez ryzyka zwiększania jego zawartości podczas konfiguracji. Gdy bit TSM zostaje zapisany stanem logicznym zera, bit PSR jest zerowany sprzętowo i timer/licznik rozpoczyna zliczanie.
Gdy ten bit ma wartość jeden, resetowany jest preskaler timera/licznika 0. Ten bit normalnie zostaje natychmiast wyzerowany sprzętowo z wyjątkiem przypadku, gdy bit TSM jest ustawiony na 1.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.