Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Termin Input Capture 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 Wejściowego. 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 słowo Capture, które 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.
Termin Output Compare odnosi się do zmiany stanu 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 (ang. Compare Match) i w tym momencie mikrokontroler może wykonać różne operacje, np. zmienić stan logiczny określonej końcówki. Pozwala to generować różne przebiegi czasowe.
Timer/licznik 0 jest 8-bitowym, jednokanałowym modułem timera/licznika o ogólnym przeznaczeniu. Jego główne cechy są następujące:
Na poniższym rysunku przedstawiony został uproszczony schemat blokowy 8-bitowego timera/licznika 0. Tłustym drukiem przedstawiono rejestry we/wy, do których ma dostęp mikroprocesor. Rejestry sterujące timerem/licznikiem 0 opisano w podrozdziale "Opis rejestrów".
Rejestr timera/licznika (TCNT0) oraz rejestr Output Compare (OCR0) są rejestrami 8-bitowymi. Wszystkie sygnały żądań przerwań są widoczne w rejestrze znaczników przerwań timera (ang. Timer Interrupt Flag Register, TIFR). Wszystkie przerwania są indywidualnie maskowane za pomocą rejestru maski przerwań timera (ang. Timer Interrupt Mask Register, TIMSK). Rejestry TIFR i TIMSK nie są pokazane na obrazku powyżej, ponieważ używa je kilka innych modułów timerów.
Timer/licznik może być taktowany wewnętrznie poprzez preskaler lub asynchronicznie z końcówek TOSC1/2, co szczegółowo jest opisane w dalszej części tego rozdziału. Praca asynchroniczna jest sterowana przez rejestr stanu asynchronicznego (ang. Asynchronous Status Register, ASSR). Układ wyboru zegara określa, które źródło zegara będzie używane przez timer/licznik do zwiększania (lub zmniejszania) jego wartości. Timer/licznik jest nieaktywny, jeśli nie zostało wybrane żadne źródło zegarowe. Wyjście z układu wyboru zegara jest określane jako zegar timera (ang. timer clock, clkT0).
Podwójnie buforowany rejestr Output Compare (OCR0) jest przez cały czas porównywany z wartością timera/licznika. Wynik tych porównań może zostać użyty przez generator przebiegu, aby utworzyć przebieg PWM lub przebieg o zmiennej częstotliwości na końcówce Output Compare (OC0). Szczegóły znajdziesz w podrozdziale "Moduł Output Compare”. Zdarzenie zgodności porównania ustawi również znacznik porównania (OCF0), który z kolei może zostać wykorzystany do generacji żądania przerwania Output Compare.
Wiele rejestrów i odwołań do bitów w tym rozdziale jest zapisanych w postaci ogólnej. Mała litera “n” zastępuje numer timera/licznika, w tym wypadku 0. Jednakże w programie należy używać precyzyjnych nazw, np. TCNT0 przy dostępie do wartości timera/licznika 0 itd.
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 0x00 |
MAX | Licznik osiąga MAX, gdy jego wartość staje się równa 0xFF (dziesiętnie 255). |
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 0xFF (MAX) lub wartość umieszczona w rejestrze OCR0. Przypisanie to jest zależne od trybu pracy licznika. |
Opis sygnałów (sygnały wewnętrzne):
count | Zwiększenie lub zmniejszenie wartości TCNT0 o 1. | |
direction | Wybór pomiędzy zmniejszaniem a zwiększaniem wartości licznika. | |
clear | Zerowanie TCNT0 (ustawienie wszystkich bitów na 0). | |
clkT2 | Zegar timera/licznika. | |
top | Sygnalizacja, iż licznik osiągnął wartość maksymalną. | |
bottom | Sygnalizacja, iż licznik osiągnął wartość minimalną (zero). |
W zależności od użytego trybu działania licznik jest zerowany, zwiększany o 1 lub zmniejszany o 1 przy każdym takcie zegara timera (clkT2). Zegar clkT0 może być tworzony z zewnętrznego lub z wewnętrznego źródła, wybranego bitami wyboru zegara (ang. Clock Select bits, CS0[2:0]). Gdy nie jest wybrane żadne źródło zegarowe (CS0[2:0] = 0), to timer jest zatrzymany. Jednakże zawartość TCNT0 jest dostępna dla mikroprocesora bez względu na obecność lub brak clkT0. Zapis przez mikroprocesor posiada wyższy priorytet nad wszystkimi operacjami zliczania lub zerowania.
Sekwencja zliczania jest określana przez ustawienia bitów WGM0[1:0] umieszczonych w rejestrze sterującym timera/licznika (ang. Timer/Counter Control Register, TCCR0). Istnieją bliskie związki pomiędzy sposobem zachowania się licznika (zliczaniem) a sposobem generacji przebiegów na wyjściu Output Compare, OC0. Więcej na temat zaawansowanych sekwencji zliczania znajdziesz w podrozdziale "Tryby pracy".
Znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany zgodnie z trybem pracy wybranym przez bity WGM0[1:0]. Znacznik TOV0 może być używany do generacji przerwania dla mikroprocesora.
Poniższy rysunek pokazuje schemat blokowy modułu Output Compare:
Rejestr OCR0 jest podwójnie buforowany, gdy są używane tryby PWN (ang. Pulse Width Modulation). W trybie normalnym oraz w trybie zerowania timera przy zgodności porównania, CTC (ang. Clear Timer on Compare) podwójne buforowanie jest wyłączone. Synchronizuje ono uaktuaktualnianie rejestru porównawczego OCR0 do wartości top lub bottom sekwencji zliczania. Synchronizacja zapobiega powstawaniu impulsów PWM o nieprawidłowej długości lub niesymetrycznych, co tworzy bezbłędne przebiegi wyjściowe.
Dostęp do rejestru OCR0 może wydawać się złożony, lecz tak nie jest. Gdy włączone jest podwójne buforowanie, mikroprocesor posiada dostęp do rejestru buforowego OCR0r, a gdy podwójne buforowanie jest wyłączone, mikroprocesor ma bezpośredni dostęp do OCR0.
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, FOC0). Wymuszenie zgodności porównania nie ustawi znacznika OCF0, ani nie wyzeruje/przeładuje timera, lecz końcówka OC0 zostanie uaktualniona tak, jakby wystąpiła rzeczywista zgodność porównania (ustawienie bitów COM0[1:0] definiuje, czy końcówka OC0 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ć rejestr OCR0 na tę samą wartość co TCNT0 bez wyzwolenia przerwania, gdy zostanie włączony zegar timera/licznika.
Ponieważ zapis TCNT0 w dowolnym trybie pracy zablokuje wszystkie zgodności porównań na jeden cykl zegara timera, występuje ryzyko związane ze zmianą zawartości TCNT0, gdy jest używany moduł Output Compare niezależnie od tego, czy timer/licznik pracuje, czy nie. Jeśli wartość wpisana do TCNT0 jest równa wartości OCR0, zgodność porównania zostanie przegapiona, co w wyniku da nieprawidłową generację przebiegu. Podobnie, nie wpisuj do TCNT0 wartości równej BOTTOM, gdy licznik zlicza w dół.
Ustawienie OC0 powinno być wykonane przed ustawieniem rejestru kierunku danych (ang. Data Direction Register) dla końcówki, która będzie wyjściem. Najprostszym sposobem ustawienia wartości OC0 jest użycie bitu strobowego wymuszonego Output Compare (FOC0) w trybie normalnym. Rejestr OC0 utrzymuje swoją wartości nawet przy zmianie trybów generacji przebiegów.
Bądź świadomy, iż bity COM0[1:0] nie są podwójnie buforowane wraz z wartością porównania. Zmiana bitów COM0[1:0] odniesie natychmiastowy skutek.
Bity trybu Compare Output (ang. Compare Output Mode bits, COM0[1:0]) posiadają dwie funkcje. Po pierwsze, generator przebiegu wykorzystuje bity COM0[1:0] do definiowania stanu końcówki wyjścia porównania (OC0) przy kolejnej zgodności porównania. Po drugie, bity COM0[1:0] kontrolują źródło wyjściowe dla końcówki OC0. Obrazek poniżej pokazuje uproszczony schemat sieci logicznej, na którą oddziałuje ustawienie bitów COM0[1: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 COM0[1:0]. Przy odwołaniu do stanu OC0, odwołanie to dotyczy wewnętrznego rejestru OC0, nie końcówki OC0.
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 wyjście porównania (OC0) z generatora przebiegu, jeśli dowolny z bitów COM0[1:0] jest ustawiony. Jednakże kierunek końcówki OC0 (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 OC0 (DDR_OC0) musi być ustawiony jako wyjście, zanim wartość OC0 stanie się widoczna na końcówce. Funkcja przejmowania jest niezależna od trybu pracy generatora przebiegu.
Zasada działania sieci logicznej dla końcówki Compare Output pozwala na inicjalizację stanu OC0 przed uaktywnieniem wyjścia. Zwróć uwagę, że niektóre z ustawień bitów COM0[1:0] są zarezerwowane tylko dla pewnych trybów pracy. Zobacz do podrozdziału "Opis Rejestrów".
Generator przebiegów używa bitów COM0[1:0] w różny sposób w trybach Normalnym, CTC i PWM. Dla wszystkich trybów ustawienie COM0[1:0] = 0 mówi generatorowi przebiegów, aby nie wykonywał żadnego działania na rejestrze OC0 przy następnej zgodności porównania. Opis funkcji tych bitów znajdziesz w opisie poszczególnych trybów.
Zmiana stanu bitów COM0[1:0] odniesie efekt przy pierwszej zgodności porównania, która wystąpi po tej zmianie. W trybach nie-PWM działanie może być wymuszone natychmiast przez wykorzystanie bitów strobowych FOC0.
Dokładne informacje na temat przebiegów czasowych znajdziesz w podrozdziale "Przebiegi czasowe timera/licznika".
Najprostszym trybem pracy jest tryb normalny (ang. Normal Mode, WGM0[1:0] = 0). W tym trybie kierunek zliczania jest zawsze w górę (stan licznika sie 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ść 8-bitową (TOP = 0xFF), a później startuje ponownie od wartości BOTTOM (0x00). 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 9-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.
Moduł Output Compare może być użyty do generowania przerwań w zadanych 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 Match Mode, CTC) (WGM0[1:0] = 2), rejestr OCR0 jest używany do manipulowania rozdzielczością licznika. W trybie CTC licznik jest zerowany, gdy jego wartość (TCNT0) zrówna się z OCR0. Rejestr OCR0 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 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 z OCR0, 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 znacznika OCF0. 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 OCR0 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 (0xFF) i rozpocząć od nowa zliczanie od 0x00, zanim będzie mogła wystąpić następna zgodność porównania.
Przy generowaniu przebiegu wyjściowego w trybie CTC wyjście OC0 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
(COM0[1:0] = 1). Wartość OC0 nie będzie widoczna na końcówce portu aż do
ustawienia kierunku danych na wyjście. 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 0x00.
Szybki tryb PWM (ang. fast Pulse Width Modulation mode) (WGM0[1:0] = 3) 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 MAX, po czym znów rozpoczyna od BOTTOM. W trybie nieodwróconym Compare Output (ang. non-inverting Compare Output mode) wyjście Output Compare (OC0) jest zerowane przy zgodności porównania pomiędzy TCNT0 a OCR0 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 trybie PWM z poprawnością fazy, który wykorzystuje zliczanie dwukierunkowe. Ta wysoka częstotliwość sprawia, że szybki tryb PWM dobrze nadaje się do aplikacji sterujących zasilaniem, 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.
W szybkim trybie PWM licznik jest zwiększany co 1, aż jego zawartość osiągnie MAX. Licznik zostaje wyzerowany przy następnym cyklu zegara timera. Na poniższym rysunku przedstawiono wykres czasowy dla szybkiego trybu PWM. Wartość TCNT0 jest na wykresie przedstawiona jako histogram dla zilustrowania jednokierunkowej operacji zliczania. Wykres zawiera wyjścia PWM nieodwrócone oraz odwrócone. Małe poziome odcinki na zboczach TCNT0 reprezentują zgodności porównań pomiędzy OCR0 a TCNT0.
Znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany zawsze, gdy licznik osiąga MAX. Jeśli przerwanie jest uaktywnione, to procedura jego obsługi może zostać użyta do uaktualniania wartości do porównań.
W szybkim trybie PWM układ porównawczy pozwala na generację przebiegów PWM na końcówkach OC0. Ustawienie bitów COM0[1:0] na 2 utworzy nieodwrócony przebieg PWM, a odwrócony przebieg PWM może zostać wygenerowany przez ustawienie bitów COM0[1:0] na 3. Faktyczna wartość OC0 pojawi się na końcówce portu tylko wtedy, gdy końcówka ta zostanie ustawiona jako wyjście. Przebieg PWM jest generowany przez ustawianie (lub zerowanie) rejestru OC0 przy zgodności porównania pomiędzy OCR0 i TCNT0, a zerowanie (lub ustawianie) rejestru OC0 w cyklu zegara timera, w którym licznik jest zerowany (zmienia wartość z MAX na BOTTOM).
Częstotliwość przebiegu PWM na wyjściu może być obliczona z poniższego wzoru:
Zmienna N reprezentuje dzielnik preskalera (1,
8, 64, 256 lub 1024).
Wartości ekstremalne rejestru OCR0 reprezentują specjalne przypadki przy generacji przebiegu wyjściowego w szybkim trybie PWM. Jeśli OCR0 jest ustawiony na wartość równą BOTTOM, to na wyjściu pojawią się wąskie szpilki przy każdym MAX+1 cyklu zegara timera. Ustawienie OCR0 na wartość równą MAX spowoduje powstanie stałego przebiegu o wartości wysokiej lub niskiej (zależnie od polaryzacji wyjścia ustawianej bitami COM0[1:0]).
Przebieg wyjściowy z wypełnieniem 50% w szybkim trybie PWM można osiągnąć przez ustawienie wyjścia OC0 na zmianę poziomu logicznego przy każdej zgodności porównania (COM0[1:0] = 1). Generowany przebieg będzie posiadał maksymalną częstotliwość FOC0 = fclk_I/O/2, gdy rejestr OCR0 zostanie ustawiony na zero. Ta cecha jest podobna do ustawienia zmiany poziomu OC0 w trybie CTC, z wyjątkiem tego, iż opcja podwójnego buforowania w module Output Compare jest uaktywniona w szybkim trybie PWM.
Tryb PWM poprawny fazowo (ang. phase correct PWM mode, WGM0[1:0] = 1) udostępnia opcję generacji przebiegu PWM o wysokiej rozdzielczości i poprawnego fazowo. Oparty on jest na zliczaniu dwukierunkowym. Licznik w kółko zlicza od BOTTOM do MAX, a później od MAX do BOTTOM. W nieodwróconym trybie Compare Output końcówka Output Compare (OC0) jest ustawiana w stan niski przy zgodności porównania pomiędzy TCNT0 i OCR0 przy zliczaniu w górę, a ustawiana w stan wysoki przy tej zgodności porównania przy zliczaniu w dół. W odwróconym trybie Output Compare operacje są odwrócone. Zliczanie dwukierunkowe skutkuje mniejszą częstotliwością pracy niż przy zliczaniu jednokierunkowym. Jednakże z powodu symetrii trybów PWM z dwukierunkowym zliczaniem są one preferowane w aplikacjach sterujących silnikami.
Rozdzielczość PWM w trybie PWM poprawnym fazowo jest ustalona na osiem bitów. W trybie PWM poprawnym fazowo licznik jest zwiększany aż osiągnie wartość MAX. Gdy to się stanie, zmienia kierunek zliczania. Wartość TCNT0 będzie równa MAX przez jeden takt zegara timera. Wykres czasowy trybu PWM poprawnego fazowo przedstawia rysunek poniżej. Wartość TCNT0 jest na wykresie pokazana jako histogram, aby zilustrować zliczanie w obu kierunkach. Wykres zawiera wyjścia PWM nieodwrócone i odwrócone. Małe, poziome linie na zboczach TCNT0 reprezentują zgodności porównań pomiędzy OCR0 a TCNT0.
Znacznik przepełnienia timera/licznika (ang. Timer/Counter Overflow Flag, TOV0) jest ustawiany za każdym razem, gdy licznik osiąga BOTTOM i może on zostać użyty do generowania przerwania w tym właśnie momencie.
W trybie PWM poprawnym fazowo moduł porównawczy pozwala generować przebiegi PWM na końcówce OC0. Ustawienie bitów COM0[1:0] na 2 wytworzy nieodwrócony przebieg PWM, a przebieg odwrócony powstanie przy ustawieniu COM0[1:0] na 3. Faktyczna wartość OC0 pojawi się na końcówce portu tylko wtedy, gdy końcówka ta zostanie ustawiona jako wyjście. Przebieg PWM jest generowany przez zerowanie (lub ustawianie) rejestru OC0 przy zgodności porównania pomiędzy OCR0 i TCNT0, gdy licznik zlicza w górę, a ustawianie (lub zerowanie) rejestru OC0 przy zgodności porównania pomiędzy OCR0 a TCNT0, gdy licznik zlicza w dół. Wyjściową częstotliwość PWM w trybie PWM poprawnym fazowo obliczamy wg poniższego wzoru:
Zmienna N
reprezentuje dzielnik preskalera (1, 8, 64,
256 lub 1024).
Wartości ekstremalne dla rejestru OCR0 reprezentują specjalne przypadki przy generacji przebiegu PWM w trybie poprawnym fazowo. Jeśli OCR0 zostanie ustawiony na BOTTOM, to wyjście będzie stale w stanie niskim, a jeśli ustawi się go na MAX, to na wyjściu ciągle będzie stan wysoki w trybie nieodwróconym PWM. W trybie odwróconym PWM wyjście będzie w przeciwnych stanach logicznych.
Na samym początku okresu 2 na wykresie powyżej OCn przechodzi ze stanu wysokiego w niski, nawet jeśli nie występuje zgodność porównania. Miejsce tego przejścia ma zagwarantować symetryczność wokół BOTTOM. Istnieją dwa przypadki dające takie przejście bez zgodności porównania:
Wykres czasowy Timera/Licznika bez
preskalera
Następny wykres pokazuje te same dane, lecz z uruchomionym preskalerem (fclk_I/O:8):
Kolejny wykres pokazuje ustawianie znacznika OCF0 we wszystkich trybach z wyjątkiem trybu CTC:
Kolejny wykres pokazuje ustawianie znacznika OCF0 i zerowanie licznika TCNT0 w trybie CTC.
Gdy timer/licznik 2 pracuje asynchronicznie, należy rozważyć kilka rzeczy.
Preskaler dla timera/licznika
0
Źródło zegarowe dla timera/licznika 0 nosi nazwę clkT0S i jest standardowo połączone z głównym zegarem we/wy systemu, clkI/O. Przez ustawienie bitu AS0 w rejestrze ASSR timer/licznik 0 jest taktowany asynchronicznie z końcówki TOSC1. To umożliwia użycie timera/licznika 0 jako licznika zegarowego rzeczywistego (ang. Real Time Counter, RTC). Gdy bit AS0 jest ustawiony, końcówki TOSC1 i TOSC2 zostają odłączone od portu G. Wtedy można pomiędzy nie podłączyć kryształ kwarcu, który będzie służył jako niezależne źródło zegarowe dla timera/licznika 0. Oscylator został zoptymalizowany do użytku z kwarcem 32,768 kHz. Podłączanie zewnętrznego źródła zegarowego do końcówki TOSC1 nie jest zalecane. Możliwe ustawienia preskalera dla timera/licznika 0 są następujące: clkT0S/8, clkT0S/32, clkT0S/64, clkT0S/128, clkT0S/256 i clkT0S/1024. Dodatkowo można wybrać clkT0S jak również 0 (stop).
Ustawienie bitu PSR0 w rejestrze SFIOR resetuje preskaler. Pozwala to użytkownikowi pracować z przewidywalnym preskalerem.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x33 (0x53) | FOC0 | WGM00 | COM01 | COM00 | WGM01 | CS02 | CS01 | CS00 | TCCR0 |
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 FOC0 jest czynny tylko wtedy, gdy bity WGM określają tryb nie-PWM. Jednakże w celu zapewnienia kompatybilności z przyszłymi układami bit ten musi być ustawiany na zero przy zapisie do TCCR0 w czasie pracy w trybie PWM. Gdy do bitu FOC0 zostanie zapisana logiczna jedynka, wymuszana jest natychmiastowa zgodność porównania na module generacji przebiegu. Wyjście OC0 jest zmieniane zgodnie z ustawieniami bitów COM0[1:0].
Zauważ, iż bit FOC0 jest zaimplementowany jako strob. Z tego powodu to wartość obecna w bitach COM0[1:0] określa efekt tego wymuszonego porównania. Strob FOC0 nie wygeneruje żadnego przerwania, ani nie wyzeruje timera w trybie CTC używającego OCR0 jako TOP.
Przy odczycie bit FOC0 zwraca zawsze zero.
Te bity sterują sekwencją zliczania w liczniku, źródłem wartości maksymalnej (TOP) licznika i rodzajem używanej generacji przebiegu. Obsługiwane w module timera/licznika tryby pracy są następujące: normalny, zerowanie timera przy zgodności porównania (CTC) i dwa typy modulacji szerokości impulsu (PWM).
Poniższa tabelka przedstawia dostępne tryby pracy:
Tryb | WGM01 (CTC0) |
WGM00 (PWM0) |
Tryb pracy timera/licznika(1) | TOP | Uaktualnianie OCR0 | Ustawianie znacznika TOV0 |
0 | 0 | 0 | Normalny | 0xFF | Natychmiast | MAX |
1 | 0 | 1 | PWM z poprawną fazą | 0xFF | TOP | BOTTOM |
2 | 1 | 0 | CTC | OCR0 | Natychmiast | MAX |
3 | 1 | 1 | Szybki PWM | 0xFF | BOTTOM | MAX |
Uwaga: | 1. | Definicje nazw bitów CTC0 i PWM0 są już przestarzałe. Używaj definicji WGM0[1:0]. Jednakże działanie oraz położenie tych bitów jest kompatybilne z poprzednimi wersjami timera. |
Te bity kontrolują zachowanie się końcówki Output Compare (OC0). Jeśli zostanie ustawiony jeden lub oba bity COM0[1:0], to wyjście OC0 przechwytuje normalne działanie portu tej końcówki we/wy, do której jest podłączone. Jednakże zwróć uwagę, iż bit Rejestru kierunku danych DDR odpowiadający końcówce OC0 musi zostać ustawiony, aby uaktywnić to wyjście.
Gdy OC0 jest podłączone do końcówki, funkcja bitów COM0[1:0] zależy od ustawienia bitów WGM0[1:0].
Poniższa tabelka pokazuje działanie bitów COM0[1:0], gdy bity WGM0[1:0] ustawiają tryb normalny lub CTC (nie-PWM).
COM01 | COM00 | Opis |
0 | 0 | Normalna praca portu, OC0 odłączone. |
0 | 1 | Zmiana wartości OC0 na przeciwną przy zgodności porównania. |
1 | 0 | Zerowanie OC0 przy zgodności porównania. |
1 | 1 | Ustawienie OC0 przy zgodności porównania. |
Następna tabelka pokazuje działanie bitów COM0[1:0], gdy bity WGM0[1:0] ustawiają szybki tryb PWM.
COM01 | COM00 | Opis |
0 | 0 | Normalna praca portu, OC0 odłączone. |
0 | 1 | Zarezerwowane |
1 | 0 | Zerowanie OC0 przy zgodności porównania, ustawienie OC0 przy BOTTOM (tryb nieodwracający). |
1 | 1 | Ustawienie OC0 przy zgodności porównania, zerowanie OC0 przy BOTTOM (tryb odwracający). |
Uwaga: | 1. | Specjalny przypadek występuje, gdy rejestr OCR0 ma zawartość równą TOP, a bit COM01 jest ustawiony. W takim przypadku zgodność porównania jest ignorowana, lecz ustawianie lub zerowanie jest wykonywane przy wartości BOTTOM. Zobacz do podrozdziału "Szybki tryb PWM". |
Tabelka poniżej pokazuje działanie bitów COM0[1:0], gdy bity WGM0[1:0] ustawiają tryb PWM poprawny fazowo.
COM01 | COM00 | Opis |
0 | 0 | Normalna praca portu, OC0 odłączone. |
0 | 1 | Zarezerwowane |
1 | 0 | Zerowanie OC0 przy
zgodności porównania przy zliczaniu w górę. Ustawienie OC0 przy zgodności porównania przy zliczaniu w dół. |
1 | 1 | Ustawienie OC0 przy
zgodności porównania przy zliczaniu w górę. Zerowanie OC0 przy zgodności porównania przy zliczaniu w dół. |
Uwaga: | 1. | Specjalny przypadek występuje, gdy rejestr OCR0 ma zawartość równą TOP, a bit COM01 jest ustawiony. W takim przypadku zgodność porównania jest ignorowana, lecz ustawianie lub zerowanie jest wykonywane przy wartości TOP. Zobacz do podrozdziału "Tryb PWM poprawny fazowo". |
Trzy bity wyboru zegara określają źródło zegarowe, które jest używane przez timer/licznik, zobacz na poniższą tabelkę.
CS02 | CS01 | CS00 | Opis |
0 | 0 | 0 | Brak źródła zegarowego (timer/licznik zatrzymany) |
0 | 0 | 1 | clkTS0/1 (bez preskalera) |
0 | 1 | 0 | clkTS0/8 (z preskalera) |
0 | 1 | 1 | clkTS0/32 (z preskalera) |
1 | 0 | 0 | clkTS0/64 (z preskalera) |
1 | 0 | 1 | clkTS0/128 (z preskalera) |
1 | 1 | 0 | clkTS0/256 (z preskalera) |
1 | 1 | 1 | clkTS0/1024 (z preskalera) |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x32 (0x52) | TCNT0[7:0] | TCNT0 | |||||||
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 timera/licznika daje bezpośredni dostęp zarówno przy odczycie jak i przy zapisie do zawartości 8-bitowego licznika w module timera/licznika. Zapis do rejestru TCNT0 blokuje (usuwa) zgodność porównania przy następnym cyklu zegara timera. Modyfikowanie licznika (TCNT0) podczas jego pracy wprowadza ryzyko pominięcia zgodności porównania pomiędzy TCNT0 a rejestrem OCR0.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x31 (0x51) | OCR0[7:0] | OCR0 | |||||||
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 0 dla Output Compare zawiera 8-bitową wartość, która jest ciągle porównywana z zawartością licznika (TCNT0). Zgodność może zostać wykorzystana do generacji przerwania Output Compare lub do generacji przebiegu wyjściowego na końcówce OC0.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x30 (0x50) | – | – | – | – | AS0 | TCN0UB | OCR0UB | TCR0UB | ASSR |
Zapis/Odczyt | O | O | O | O | Z/O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Gdy bit AS0 zostanie zapisany stanem zero, timer/licznik 0 jest taktowany z zegara we/wy clkI/O. Gdy do bitu AS0 zostanie wpisana jedynka, timer/licznik 0 jest taktowany z oscylatora kwarcowego podłączonego do końcówki 1 oscylatora timera (ang. Timer Oscillator 1 pin, TOSC1). Gdy zmienia się wartość bitu AS0, zawartości rejestrów TCNT0, OCR0 i TCCR0 mogą być nieprawidłowe.
Gdy timer/licznik 0 pracuje asynchronicznie i rejestr TCNT0 zostanie zapisany, bit ten przechodzi w stan jeden. Gdy rejestr TCNT0 został uaktualniony z rejestru tymczasowego, bit jest zerowany sprzętowo. Logiczne zero w tym bicie oznacza, iż rejestr TCNT0 można zapisać nową wartością.
Gdy timer/licznik 0 pracuje asynchronicznie i rejestr OCR0 zostanie zapisany, bit ten przechodzi w stan jeden. Gdy rejestr OCR0 został uaktualniony z rejestru tymczasowego, bit jest zerowany sprzętowo. Logiczne zero w tym bicie oznacza, iż rejestr OCR0 można zapisać nową wartością.
Gdy timer/licznik 0 pracuje asynchronicznie i rejestr TCCR0 zostanie zapisany, bit ten przechodzi w stan jeden. Gdy rejestr TCCR0 został uaktualniony z rejestru tymczasowego, bit jest zerowany sprzętowo. Logiczne zero w tym bicie oznacza, iż rejestr TCCR0 można zapisać nową wartością.
Jeśli zostanie wykonany zapis do dowolnego z tych trzech rejestrów timera/licznika 0, gdy jego bit zajętości jest ustawiony, to zapisana wartość może ulec uszkodzeniu i spowodować niezamierzone przerwanie.
Mechanizm odczytu TCNT0, OCR0 i TCCR0 jest inny. Gdy odczytywany jest rejestr TCNT0, odczytana będzie aktualna wartość timera. Gdy odczytywany jest rejestr OCR0 lub TCCR0, odczytana będzie wartość z rejestru tymczasowego.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x37 (0x57) | OCIE2 | TOIE2 | TICIE1 | OCIE1A | OCIE1B | TOIE1 | OCIE0 | TOIE0 | TIMSK |
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 |
Gdy bit OCIE0 jest zapisany logiczną jedynką oraz bit I w rejestrze stanu SREG jest ustawiony na 1, to zostaje włączona obsługa przerwań od zgodności porównania w timerze/liczniku 0. Odpowiednie przerwanie jest wykonywane, jeśli wystąpi zgodność porównania w timerze/liczniku 0 (tj. gdy zostanie ustawiony bit OCF0 w rejestrze znaczników przerwań timerów/liczników – TIFR).
Gdy bit TOIE0 jest zapisany logiczną jedynką oraz bit I w rejestrze stanu SREG jest ustawiony na 1, to zostaje włączona obsługa przerwań od przepełnienia timera/licznika 0. Odpowiednie przerwanie jest wykonywane, jeśli wystąpi przepełnienie w timerze/liczniku 0 (tj. gdy zostanie ustawiony bit TOV0 w rejestrze znaczników przerwań timerów/liczników – TIFR).
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x36 (0x56) | OCF2 | TOV2 | ICF1 | OCF1A | OCF1B | TOV1 | OCF0 | TOV0 | TIFR |
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 OCF0 jest ustawiany, gdy wystąpi zgodność porównania pomiędzy timerem/licznikiem 0 a danymi w rejestrze OCR0. Znacznik OCF0 jest zerowany sprzętowo przy wykonaniu odpowiedniego wektora przerwań. Alternatywnie znacznik OCF0 jest zerowany przez wpisanie do niego logicznej jedynki. Gdy są ustawione na 1 bit I w rejestrze SREG, bit OCIE0 (ang. Timer/Counter0 Compare Match Interrupt Enable – włączenie przerwań przy zgodności porównania w timerze/liczniku 0) i znacznik OCF0, zostaje wykonane przerwanie przy zgodności porównania w timerze/liczniku 0.
Bit TOV0 jest ustawiany, gdy wystąpi przepełnienie w timerze/liczniku 0. Znacznik TOV0 jest zerowany sprzętowo przy wykonaniu odpowiedniego wektora przerwań. Alternatywnie znacznik TOV0 jest zerowany przez wpisanie do niego logicznej jedynki. Gdy są ustawione na 1 bit I w rejestrze SREG, bit TOIE0 (ang. Timer/Counter0 Overflow Interrupt Enable – włączenie przerwań przy przepełnieniu w timerze/liczniku 0) i znacznik TOV0, zostaje wykonane przerwanie przy przepełnieniu w timerze/liczniku 0. W trybie PWM bit ten jest ustawiany, gdy timer/licznik 0 zmienia kierunek zliczania przy wartości 0x00.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x20 (0x40) | TSM | – | – | – | ACME | PUD | PSR0 | PSR321 | SFIOR |
Zapis/Odczyt | Z/O | O | O | O | Z/O | Z/O | Z/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 tym trybie wartość wpisana do bitów PSR0 i PSR321 jest zachowana, stąd odpowiednie sygnały resetu preskalerów są utrzymywane. Zapewnia to, iż odpowiednie timery/liczniki są zatrzymane i można je skonfigurować na tę samą wartość bez ryzyka, iż jeden z nich pójdzie do przodu podczas konfiguracji. Gdy do bitu TSM zostanie wpisane zero, bity PSR0 i PSR321 będą wyzerowane sprzętowo, a timery/liczniki równocześnie rozpoczynają zliczanie.
Gdy ten bit zostanie ustawiony na 1, zresetuje się preskaler timera/licznika 0. Bit jest zerowany sprzętowo po wykonaniu tej operacji. Zapis zera do tego bitu nie przynosi żadnego efektu. Przy odczycie bit ten zwraca zawsze wartość zero, jeśli timer/licznik 0 jest taktowany przez wewnętrzny zegar mikroprocesora. Jeśli bit PSR0 zostanie ustawiony na jeden podczas pracy asynchronicznej timera/licznika 0, to pozostanie w tym stanie aż do momentu zresetowania się preskalera.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 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.