Liczniki T0 i T1
Mikrokontrolery rodziny MCS-51 posiadają dwa maksymalnie 16-bitowe liczniki. Obydwa mogą być konfigurowane niezależnie jako liczniki impulsów wewnętrznych (praca w funkcji czasomierza) lub zewnętrznych (praca w funkcji licznika impulsów zewnętrznych).
Podczas pracy w funkcji czasomierza, pracujące w danym trybie rejestry licznika są inkrementowane z każdym cyklem maszynowym. Cykl maszynowy w klasycznym mikrokontrolerze rodziny MCS-51 trwa 12 okresów sygnału taktującego mikrokontroler, zatem częstotliwość zliczania jest równa 1/12 częstotliwości sygnału taktującego lub inaczej, licznik jest inkrementowany co czas równy 12 okresom sygnału taktującego.
Przy konfiguracji w funkcji licznika, pracujące rejestry są inkrementowane przy każdym zboczu opadającym sygnału doprowadzonego do odpowiadającego dla danego licznika wyprowadzenia zewnętrznego T0 (P3.4) lub T1 (P3.5) mikrokontrolera. Stan tych zewnętrznych wyprowadzeń jest sprawdzany w każdym cyklu maszynowym podczas trwania fazy S5P2. Jeśli w jednym cyklu stan wejścia jest wysoki a w następnym niski, wtedy wartość rejestrów licznika jest zwiększana o jeden. Ta nowa wartość pojawia się w rejestrze licznika podczas fazy S3P1 cyklu następującego po tym, w którym nastąpiło wykrycie wspomnianego przejścia.
Ze względu na fakt, iż wykrycie zmiany z 1 na 0 na wejściu T0 lub T1 wymaga dwóch cykli maszynowych (24 okresów oscylatora), to w przypadku pracy w funkcji licznika impulsów zewnętrznych maksymalna częstotliwość zmian możliwa do poprawnego wykrycia jest 24-krotnie mniejsza od częstotliwości dołączonego do mikrokontrolera oscylatora. Nie ma przy tym żadnych ograniczeń co do współczynnika wypełnienia doprowadzonego sygnału, jednak dla pewności, że dany poziom jest próbkowany co najmniej, raz zanim ulegnie zmianie, powinien być utrzymany co najmniej przez jeden pełny cykl maszynowy.
Ustawienie danego licznika do pracy w jednej z dwóch powyższych funkcji odbywa się przez ustawienie (funkcja licznika) lub zerowanie (funkcja czasomierza) bitu C/T znajdującego się w rejestrze TMOD. Niezależnie od wybranej funkcji, liczniki pracują tak samo, zliczając impulsy z jednego z dwóch przedstawionych źródeł.
Rejestr | TMOD | |||||||
---|---|---|---|---|---|---|---|---|
Licznik T1 | licznik T0 | |||||||
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Oznaczenie bitu | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
Bit | Symbol | Funkcja |
GATE | Uaktywnienie bramkowania wejścia T1 | |
C/T | Wybór funkcji dla licznika T1 | |
M1 | Wybór trybu (bit 1) dla licznika T1 | |
M0 | Wybór trybu (bit 0) dla licznika T1 | |
GATE | Uaktywnienie bramkowania wejścia T0 | |
C/T | Wybór funkcji dla licznika T0 | |
M1 | Wybór trybu (bit 1) dla licznika T0 | |
M0 | Wybór trybu (bit 0) dla licznika T0 |
Z licznikami T0 i T1 związany jest również rejestr TCON. Ustawienie w nim bitu TRi (gdzie "i" jest równe 0 lub 1) uruchamia odpowiedni licznik do pracy. Nie powoduje to jednak jego wyzerowania, stąd jeśli w aplikacji występuje taka konieczność, należy przed uruchomieniem licznika wyzerować jego rejestry TLi i THi odpowiednim rozkazem.
Rejestr | TCON | |||||||
---|---|---|---|---|---|---|---|---|
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Adres bitu | 8Fh | 8Eh | 8Dh | 8Ch | 8Bh | 8Ah | 89h | 88h |
Oznaczenie bitu | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
Bit | Symbol | Funkcja |
TCON.7 | TF1 | Znacznik przepełnienia licznika T1 |
TCON.6 | TR1 | Bit sterujący zliczaniem licznika T1 |
TCON.5 | TF0 | Znacznik przepełnienia licznika T0 |
TCON.4 | TR0 | Bit sterujący zliczaniem licznika T0 |
Jeśli dodatkowo podczas konfiguracji licznika bit GATE (znajdujący się w rejestrze TMOD) zostanie ustawiony na 1, to sygnał doprowadzony do licznika jest bramkowany zewnętrznym sygnałem z wejścia INT0 (w przypadku licznika T0) lub INT1 (w przypadku licznika T1). Programowe uruchomienie licznika w takiej konfiguracji powoduje, że licznik pracuje tylko wtedy, gdy INTi=0. Widać to najlepiej na rysunkach pokazujących konfigurację liczników w poszczególnych trybach pracy.
Każdy z opisywanych liczników liczy zawsze w górę. Kiedy zmienia on swoją wartość z maksymalnej, przewidzianej dla danego trybu, na początkową, w rejestrze TCON ustawiany jest znacznik przepełnienia (TF0 w przypadku licznika T0, TF1 - w przypadku przepełnienia licznika T1), który jest jednocześnie sygnałem zgłoszenia przerwania. Przy przyjęciu przerwania znacznik ten jest automatycznie zerowany. Stan tego bitu może być również testowany programowo.
Obydwa opisywane liczniki posiadają cztery tryby pracy wybierane poprzez odpowiednie ustawienie pary bitów M1, M0 w rejestrze TMOD. Tryby 0, 1 i 2 są takie same dla obu liczników T0 i T1, natomiast w trybie 3 liczniki działają różnie. W poniższej tabeli w skrócie scharakteryzowano wszystkie cztery tryby.
Tryb | M1 | M0 | Opis |
---|---|---|---|
0 | 0 | 0 | Rejestr THi pracuje jako 8-bitowy licznik taktowany przez 5-bitowy dzielnik TLi, dając w sumie licznik 13-bitowy. |
1 | 0 | 1 | Rejestry THi i TLi pracują jako jeden licznik 16-bitowy. |
2 | 1 | 0 | Rejestr TLi pracuje jako 8-bitowy licznik z automatycznym przeładowaniem wartości początkowej z rejestru THi. |
3 | 1 | 1 | Licznik T0 – dwa niezależne 8-bitowe liczniki:
|
Tryb 0
Wprowadzenie danego licznika w tryb pracy 0 powoduje, że działa on jak licznik mikrokontrolera 8048, w którym 8-bitowy licznik oparty na rejestrze THi jest poprzedzony podzielnikiem przez 32 realizowanym na bazie 5 najmłodszych bitów rejestru TLi. W tym trybie rejestry licznika są więc skonfigurowane jako jeden licznik 13-bitowy. Trzy najstarsze bity rejestru TLi mają stan nieokreślony i powinny być ignorowane przy odczycie wartości z licznika.

Ze względu na wykorzystywanie w tym trybie pracy pięciu najmłodszych bitów rejestru TLi licznika oraz nieokreślonej wartości trzech najstarszych bitów tego rejestru, należy być ostrożnym przy składaniu jednej 13-bitowej wartości poprzez złaczenie wartości przechowywanej w THi oraz TLi. |
Tryb 1
Schemat pracy liczników T0 i T1 w trybie 1 jest taki sam jak w trybie 0 z tą różnicą, że do zliczania impulsów wykorzystywane są wszystkie bity rejestrów THi oraz TLi. Licznika jest zatem 16-bitowy.

Tryb 2
W trybie 2 do zliczania impulsów wykorzystany jest tylko 8-bitowy rejestr TLi. Jego przepełnienie nie tylko ustawia znacznik TFi, lecz także powoduje przeładowanie wartości początkowej z rejestru THi. Wartość rejestru THi powinna być więc ustawiona programowo przed uruchomieniem licznika do pracy. Proces przeładowania pozostawia wartość w rejestrze THi niezmienioną.

Tryb 3
W trybie 3 licznik T1 nie pracuje. Natomiast rejestry TH0 i TL0 licznika T0 pracują niezależnie jako dwa 8-bitowe liczniki. Pracą licznika opartego na rejestrze TL0 sterują bity związane z licznikiem T0, tj. C/T, GATE, TR0, INT0 oraz TF0. Natomiast bity sterujące i kontrolne licznika T1, tj. bit TR1 oraz TF1, są przypisane do licznika opartego na rejestrze TH0. Licznik oparty na TL0 może być skonfigurowany zarówno w funkcji czasomierza jak i licznika impulsów zewnętrznych. Natomiast licznik oparty na rejestrze TH0 może pracować tylko w funkcji czasomierza. Obydwa liczniki mogą generować przerwania przejmując, podobnie jak bity sterujące, również wektory przerwań od odpowiednich liczników.

Tryb 3 jest przydatny w aplikacjach, które wymagają dodatkowego 8-bitowego czasomierza. Przy liczniku T0 ustawionym w tym trybie, mikrokontroler wygląda, jakby miał trzy niezależne liczniki.