S. Jemioło B. Jakubiec
G. Kulig Ł. Król
Klasa VgT
Ćwiczenie nr 11
TEMAT: TIMERY MIKROKONTROLERA.
Cel ćwiczenia:
Ćwiczenie ma na celu zaznajomienie się z metodami odliczania czasu w mikrokontrolerze 8051.
Wiadomości wstępne:
W mikrokontrolerze 8051 najprostszą metodą odliczania czasu to wykonanie jakiejś operacji, która zajmuje jakiś czas. Muszą to być oczywiście rozkazy, które nie robią nic, np. rozkaz NOP – nie wykonuje żadnego zadania, a trwa jeden cykl maszynowy. Jeden cykl maszynowy to 12 taktów z podłączonego rezonatora kwarcowego (tutaj 12 MHz), czyli jeden cykl maszynowy trwa w przybliżeniu 1us.
W mikrokontrolerze 8051: rozkaz NOP trwa 1 cykl maszynowy (1us); rozkazy mnożenia i dzielenia trwają po 4 cykle maszynowe (4us); pozostałe rozkazy trwają po 2 cykle maszynowe (2us).
Aby odliczyć dany czas wystarczy w programie wstawić określoną liczbę rozkazów NOP np. 10us = 10 linii rozkazu NOP. Ale w praktyce mija się to z celem.
Do odliczania nieco dłuższych czasów można użyć pętli programowych np.
MOV A,#299 ; 2 cykle – 2us
DJNZ ACC,$ ; 229 * 2 = 458 cykli razem 460 cykli, czyli 460 us
Maxymalny tak uzyskany czas to ok. 512 us (dla kwarcu 12 MHz) aby ten czas wydłużyć należy umieścić pętle w pętli.
PĘTLA CZASOWA
LED EQU P1.7
LJMP START
ORG 100H
START:
LOOP: ;Pętla mrugania diody TEST
CPL LED
MOV A,#10 ;czekaj czas 10*100ms=1s
TIME_N100:
PUSH ACC ;przechowaj na stosie licznik zewnętrzny
MOV A,#200 ;zacznij odliczać 100ms
TIME_100: ;odliczanie 200 * 0.5ms
PUSH ACC ;2 cykle
MOV A,#226 ;2 cykle
DJNZ ACC,$ ;226*2=452 cykle
POP ACC ;2 cykle
DJNZ ACC,TIME_100 ;2 cykle razem 460 cykli=0.5ms
POP ACC ;odtwórz licznik
DJNZ ACC,TIME_N100 ;odlicz N*100ms
SJMP LOOP
W przykładzie 11.1 do odliczania czasu zastosowano pętle, które trwają określoną liczbę cyklów maszynowych. Wykorzystano to do zapalania i gaszenia diody LED.
Ten sposób ma jedną podstawową wadę. Przez cały czas wykonywania pętli procesor jest zajęty i nie może robić nic innego.
Do odliczania czasu znacznie lepiej nadają się timery. Istnieją dwa timery T0 i T1.
Timery to 16 – bitowe liczniki cyfrowe, mogą one pracować jako liczniki (zliczać impulsy podawane na ich wejście) albo jako układy czasowe – odmierzające czas.
Przepełnienie w liczniku ( T0 lub T1), tzn. przejście ze stanu FFFFh do 0000h, jest sygnalizowane odpowiednią flagą. W tym momencie może być również zgłaszane przerwanie do mikrokontrolera. Stan początkowy liczników może być dowolnie ustawiany tak, aby zakończenie zliczania oznaczało odliczenie zadanego czasu.
Każdy z liczników składa się z dwóch ośmiobitowych połówek, są one widziane jako rejestry specjalne TH0 i TL0 dla timera T0 oraz TH1 i TL1 dla układu T1.
Timery w mikrokontrolerze 8051 mogą pracować w czterech różnych trybach: 0, 1, 2, 3. Wybór trybu pracy i sterowanie zliczaniem odbywa się za pośrednictwem rejestrów SFR: TCON i TMOD.
Rejestr:
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
TCON
TF1
TR1
TF0
TR0
IE1
IT1
IE0
TMOD
GATE
C/T’
M1
M0
Znaczenie poszczególnych bitów jest następujące:
Rejestr TCON:
TF1 – wskaźnik przerwania od licznika T1. Bit ustawiany sprzętowo wskutek przepełnienia licznika T1, zerowany sprzętowo w chwili rozpoczęcia wykonywania procedury obsługi przerwania . Możliwe programowe wywołanie przerwania;
TR1 – bit włączający (TR1=1) układ licznikowy T1;
TF0 – to co TF1 lecz dotyczy licznika T0.
TR0 – bit włączający (TR0=1) układ licznikowy T0;
IE1 – wskaźnik przerwania zewnętrznego INT1’. Ustawiany sprzętowo w wyniku wykrycia opadającego zbocza (lub niskiego poziomu) na wyprowadzeniu INT1’ mikrokontrolera. Zerowany sprzętowo w wyniku rozpoczęcia wykonywania procedury obsługi przerwania (tylko jeśli przerwanie jest aktywowane zboczem). Jeśli przerwanie jest aktywowane poziomem, to stan bitu odpowiada stanowi na wyprowadzeniu INT1’ mikrokontrolera;
IT1 – bit określający stan wyprowadzenia INT1’ aktywujący przerwanie: 0 – przerwanie aktywowane niskim poziomem, 1 – przerwanie aktywowane zboczem opadającym;
IE0 – jak IE1, dotyczy wyprowadzenia INT0’
IT0 – jak It1, dotyczy wyprowadzenia INT0’
Rejestr TMOD:
Rejestr jest podzielony na dwie 4 – bitowe części zawierające bity o jednakowym znaczeniu. Cztery starsze dotyczą licznika T1, cztery młodsze licznika T0.
GATE – bit sterujący bramkowaniem licznika. Dla GATE=1 zliczanie następuje, gdy sygnał INTn’ i bit TRn odpowiadające danemu licznikowi są w stanie wysokim. Jeżeli GATE=0, to zliczanie następuje, gdy bit TRn danego licznika jest ustawiony.
C/T’ – bit określający źródło zliczania impulsów: ”0” oznacza zliczanie cykli maszynowych ; ”1” oznacza zliczanie impulsów zewnętrznych;
M1,M0 – bity wyboru trybu pracy dla danego licznika
Tryb pracy 0 jest identyczny dla obu liczników. Liczniki pracują w konfiguracji 13 – bitowej. Starszy bit THn zawiera 8 bardzie znaczących bitów, natomiast 5 pozostałych bitów to najstarsze z TLn – trzy młodsze TLx są ignorowane. Maksymalna wartość (przy kwarcu 12MHz) wynosi około 8,191 ms, po osiągnięciu tego czasu licznik wyzeruje się i zgłosi przerwanie informujące o tym fakcie.
Podobny do trybu 0 (identyczny dla obu liczników), z tym że do zliczania wykorzystywane są wszystkie 16 – bitów licznika. Maxymalny czas to ok. 65 ms.
Identyczny dla obu liczników. W licznik pracuje tylko młodsza połówka licznika (8 bitów – 255 stanów). Młodsza połówka zlicza aż do wartości maxymalnej – 255, po czym automatycznie zostaje przepisana do niego zawartość starszej połówki.
Tryb ten dotyczy obu liczników T0 i T1 na raz. W tym trybie licznik T1 jest zatrzymany i nie pracuje. Dwa bajty licznika TH0 i TL0 pracują jako dwa niezależne 8 – bitowe liczniki, przy czym istnieje pewne ograniczenie co do ich funkcji, a mianowicie:
- TL0 może liczyć impulsy z wejścia T0 lub pracować jako czasomierz zliczając impulsy wewnętrzne (Xtal / 12);
- TH0 może pracować tylko jako czasomierz, czyli zliczać impulsy wewnętrzne.
Tryb ten został zaimplementowany po to, aby w wypadkach kiedy licznik T1 używany jest do określenia szybkości transmisji port szeregowego, a programiście niezbędne są dwa dodatkowe liczniki, których role spełniają TH0 i TL0.
LICZNIK ZDARZEŃ
SEG_ON EQU P1.6 ;włączenie wyśw.7-segm.
KEY_COD EQU 01010101B ;wybrane klawisze-1,3,5
;********* Ustawienie TIMER - ów *********
;TIMER 0
T0_G EQU 0 ;GATE
T0_C EQU 0 ;COUNTER/-TIMER
T0_M EQU 0 ;MODE (0..3)
TIM0 EQU T0_M+T0_C*4+T0_G*8
;TIMER 1
T1_G EQU 0 ;GATE
T1_C EQU 1 ;COUNTER/-TIMER
T1_M EQU 0 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
TL1_SET EQU 0 ;wartość początkowa
;**************************************
MOV TMOD,#TMOD_SET ;Timer 1 licznik
MOV TL1,#TL1_SET
SETB TR1 ;start Timera 1
MOV R0,#CSDS ;statyczna obsługa klaw.
MOV A,#KEY_COD ;i wyświetlacza
MOVX @R0,A ;wpis wybranych klawiszy i wskaźników
MOV R0,#CSDB ;adres danych wskaźnika
CLR...
Sinus32