MCS-51
Architektura

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:
  • TL0 sterowany za pomocą bitów sterujących licznika T0,
  • TH0 sterowany za pomocą bitów sterujących licznika T1.
Licznik T1 – zatrzymany.

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.

Budowa licznika T0 i T1 w trybie 0
Uwaga 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.

Budowa licznika T0 i T1 w trybie 1

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ą.

Budowa licznika T0 i T1 w trybie 2

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.

Budowa licznika T0 i T1 w trybie 3

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.