Timery mikrokontrolera.doc

(68 KB) Pobierz
Ćwiczenie nr 11

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.

 

 

 

PRZYKŁAD 11.1 

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

IT1

TMOD

GATE

C/T’

M1

M0

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

 

M0 = 0; M1= 0 – tryb 0

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.

M0 = 0; M1= 1 – tryb 1

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.

M0 = 0; M1= 1 – tryb 2

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.

M0 = 0; M1= 1 – tryb 3

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.

 

PRZYKŁAD 11.2 

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

;**************************************

              LJMP              START

              ORG              100H

START:

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

Zgłoś jeśli naruszono regulamin