PODSTAWY TECHNIK MIKROPROCESOROWYCH
Laboratorium 5 03.04.2012 TP wt 13:15-14:45
Temat: TIMERY/LICZNIKI, obsługa w trybie przeglądania.
Zadania do wykonania
Zadanie 1.
Procedury odmierzania określonych odcinków czasu: τ1 ≤ 65ms i τ2 ≥ 65 ms z wykorzystaniem liczników T0/T1.
Zadanie 2.
Procedura generowania N wzajemnie „asynchronicznych” periodycznych sygnałów, z których każdy ma zadane czasy trwania: „1”-THIGH(i), i „0”-TLOW(i); i=1,2…….N.
Zadanie 3.
Program pomiaru zadanej wielkości: np. a) czasu trwania impulsu THIGH lub okresu przebiegu periodycznego generowanego przez ZD-537, b) czasu między kolejnymi zwarciami przycisków/klawiszy.
REALIZACJA ZADAŃ
Ad.1.
$NOMOD51
$INCLUDE(reg517.inc)
CSEG AT 0000h
SKOK:
MOV R2,#20 ; R2*50ms
CPL P1.0
CALL OP ;procedura generacji opóźnienia
SJMP SKOK
OP:
ANL TMOD,#0Fh ; wyzerowanie 4 starszych bitów odp. za ustawienia T1
ORL TMOD,#10h ; rodzaje trybu pracy M0=1, M1=0
ANL TCON,#3Fh ; TF1=0, TR1=0
MOV TH1,#03Ch ; przywrócenie wartości początkowych licznikowi
MOV TL1,#0B0h ; 65536-50000
SETB TR1 ; start T1 (TR1=1)
SKOK2:
JNB TF1,$ ; oczekiwanie na przepełnienie i przerwanie
CLR TF1 ; zerowanie przepełnienia
MOV TH1,#3Ch ; powrót to wartości początkowych
MOV TL1,#0A9h
DJNZ R2,SKOK2
RET
END
Ad.2.
$NOMOD51
$INCLUDE(reg517.inc)
CSEG AT 0000h
TON1 EQU 90 ; czas zapalenia diody P1.0
TOFF1 EQU 9 ; czas zgaszenia diody P1.0
TON2 EQU 40 ; czas zapalenia diody P1.1
TOFF2 EQU 30 ; czas zgaszenia diody P1.1
TON3 EQU 20 ; czas zapalenia diody P1.2
TOFF3 EQU 30 ; czas zgaszenia diody P1.2
START:
MOV TMOD,#01h ; ustawienie trybu pracy licznika
MOV R0,#TOFF1 ; wysłanie okresów do rejestru
MOV R2,#TOFF2 ; zgaszenia kolejnych diod LED
MOV R4,#TOFF3
LICZNIK:
LCALL OP ; wywołanie opóźnienia
MOV TH0,#4Ch ; ustawienia początkowe licznika T0
MOV TL0,#0h
SETB TR0 ; start licznika
JNB TF0,$ ; oczekiwanie na przepełnienie
L0-ZM:
DEC R0
MOV A,R0
JZ L0 ; warunek pełnego cyklu dla P1.0 to zapal/zgaś
L1-ZM:
DEC R2
MOV A,R2
JZ L1 ; warunek pełnego cyklu dla P1.1 to zapal/zgaś
L2-ZM:
DEC R4
MOV A,R4
JZ L2 ; warunek pełnego cylku cykl dla P1.0 to zapal/zgaś
JMP LICZNIK
L0:
MOV A,P1
CPL ACC.0
MOV P1,A ; odczyt diody P1.0
JB ACC.0, L0-WY ; warunek zmiany zapalona->zgaś
L0-WL:
MOV R0,#TON1 ; warunek zmiany zgaszona->zapal
JMP L1-ZM
L0-WY:
MOV R0,#TOFF1
JMP L1-ZM
L1:
MOV A,P1
CPL ACC.1
MOV P1,A ; odczyt diody P1.1
LCALL OP
JB ACC.1, L1-WY ; warunek zmiany zapalona->zgaś
L1-WL:
MOV R2,#TON2 ; warunek zmiany zgaszona->zapal
JMP L2-ZM
L1-WY:
MOV R2,#TOFF2
JMP L2-ZM
L2:
MOV A,P1
CPL ACC.2
MOV P1,A ; odczyt diody P1.2
LCALL OP
JB ACC.0, L2-WY ; warunek zmiany zgaszona->zapal
L2-WL:
MOV R4,#TON3 ; warunek zmiany zgaszona->zapal
JMP LICZNIK
L2-WY:
MOV R4,#TOFF3
JMP LICZNIK
OP:
PUSH ACC
MOV A,#1h
ORL TMOD,#10h ; tryb pracy licznika T1
MOV TL1,#0
MOV TH1,#76 ; ustawienia początkowe licznika T1
CLR TF1 ; wyzerowanie przepełnienia licznika T1
SETB TR1 ; start licznika T1
SKOK-OP:
JNB TF1,$ ; oczekiwanie na przepełnienie licznika T1
MOV TH1,#4Ch
CLR TF1 ; wyzerowanie przepełnienia licznika T1
DJNZ ACC,SKOK-OP ; warunek powtarzania A!=0
CLR TR1 ; wyzerowanie bitu sterującego zliczaniem licznika T1
POP ACC ; odnowienie akumulatora
RET
END
Ad.3.
Biblioteki odpowiadające za obsługę wyświetlacza.
LCDCODE SEGMENT CODE
RSEG LCDCODE
LCD_Reset:
MOV DPTR,#0FF2CH
MOV A,#38h
LCALL TEST
MOVX @DPTR,A
RET
LCD_Clr:
MOV A,#01h
MOV DPTR,#0FF2CH
LCALL TEST
MOVX @DPTR,A
RET
TEST:
PUSH ACC
PUSH DPL
PUSH DPH
MOV DPTR,#0FF2EH
LOOP_NOT:
MOVX A,@DPTR
JB ACC.7,LOOP_NOT
POP DPH
POP DPL
POP ACC
RET
Program właściwy:
$nomod51
$include(reg517.inc)
$include (lcd.inc) ;dołączenie bibliotek wyświetlacza
ORG 0
LJMP PR
ORG 0Bh
LJMP PRZ
ORG 30h
PRZ:
INC B
RETI
PR:
CALL initLCD ; inicjacja LCD
CALL LCDclear ; czyszczenie LCD
ORL TMOD,#09 ; tryb pracy timera T0
PO:
MOV R0,#20h
CLR A ; czyszczenie i akumulatora
MOV TL0,A
MOV TH0,A
MOV B,A
JB P3.3,$ ; obsługa startu stopera
SETB TR0 ; start timera
JB P3.2,$ ; obsługa wyłączenia stoper
CLR TR0 ; stop timera
MOV @R0,TL0
INC R0
MOV @R0,TH0
INC R0
MOV @R0,B ; przekodowanie wyniki do wyświetlenia
MOV A,B
MOV B,#15
DIV AB
CALL putInt ; skok do procedury wyświetlającej
LJMP PO ; skok do procedury PO
END
WNIOSKI
Zadania przewidziane do przeprowadzenia na zajęciach zostały wykonane bez uwzględnienia zagadnienia 3, które to zostało rozpoczęte na zajęciach a dokończone w domu. Przeprowadzone działania pozwoliły na zapoznanie się z działaniem TIMERÓW i LICZNIKÓW, przez co możliwe było wykonanie synchronizacji świecenia diod, oraz prowizorycznego stopera. Podczas analizy zadania trzeciego przydatne okazały się wykonane na poprzednich zajęciach procedury inicjacji wyświetlacza LCD. Kod programu 3 został dokończony w domu, przy użyciu symulatora, przez co istnieje możliwość wystąpienia nieoczekiwanych błędów (występujące podczas uruchamiania na symulatorze zostały wyeliminowane).