LABOLATORUM PODSTAW SYSTMÓW MIKROPROCESOROWYCH |
|||
TEMAT: Timery mikrokontrolera 8051 system przerwań . |
GRUPA: ED 5.1 |
NR ĆWICZENIA : 4 |
|
WYKONALI : Banach Tomasz Czuryło Paweł |
DATA WYK.: 25.10.1999 |
SEMESTR : V |
OCENA: |
;******************************************************************************************
; LEKCJA 12 - SYSTEM PRZERWAŃ 8051
; PRZYKŁAD 1 - TIMERY
; *****************************************************************************************
LED EQU P1.7
; ************* Ustawienie TIMERÓW ********************
; TIMER 0
T0_G EQU 0 ; GATE
T0_C EQU 0 ; COUNTER/-TIMER
T0_M EQU 1 ; MODE (0...3)
TIM0 EQU T0_M + T0_C*4 + T1_G*8 ; TIMER 1
T1_G EQU 0 ; GATE
T1_C EQU 0 ; 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
THO_SET EQU 0EAH ; stan początkowy Timera 0
TL0_SET EQU 066H ; opóźnienia 6 ms
KROTNOSC EQU 0FFH ;krotność powtarzania opóźnień 6 ms
;*******************************************************
LJMP START
;*************** Przerwanie Timera 0 **********************
ORG 0BH
MOV TH0,# TH0_SET ; stan początkowy do TH0
MOV TL0,# TL0_SET ; i do TL0 (6 ms)
DJNZ B,JESZCZE_NIE ; czy wykonano KROTNOSC opóźnień,
; tj.KROTNOSC*6ms
CPL LED ; mruganie diody TEST
MOV B,#KROTNOSC ; oczekaj kolejną KROTNOSC opóźnień
; KROTNOSC*6ms
JESZCZE_NIE:
RETI
; *****************************************************
ORG 100H
START:
MOV TMOD,#TMOD_SET ;Timer 0 liczy czas
MOV TH0 ,#TH0_SET ;stan początkowy do TH0
MOV TL0,#TL0_SET ;i do TL0
SETB TR0 ;start Timera 0
SETB EA ;włącz zezwolenie ogólne na przerwania
SETB ET0 ;włącz zezwolenie na przerwanie od Timera 0 ;*****************************************************************************************
;
; Robocza część programu głównego
;
;*****************************************************************************************
LOOP_0
LCALL LCD_CLR ;czyść wyświetlacz
MOV R1.#16 ;do odlicz.max. 16 znaków na wyświetlaczu
LOOP: ;w tej pętli czyta/pisze znak
LCALL WAIT_KEY ;czyta klawisz
MOV B,A ;przechowuj znak
MOV A,#2 ;niewielkie
LCALL DEALAY_MS ;opuźnienie
MOV A,B ;pobiera znak z „przechowalni”
ADD A,#30H ;zamienia binarny kod cyfry na kod w ASCII
MOV R0,#LCDWD ;wysyła
MOVX @R0,A ; znak na wyświetlacz
DJNZ R1,LOOP ;wyczyść wyświetlacz jeżeli było już 16 znaków
SJMP LOOP_0 ;zamknij pętlę
PYTANIA:
Czy możliwe jest nie pojawienie się na wyświetlaczu kodu naciśniętego klawisza ?.
Jeżeli tak ,to jak temu zapobiec ?.
Po zapoznaniu się z programem stwierdziliśmy, że istnieje możliwość nie pojawienia się kodu naciśniętego klawisza. Klawiszem, który po naciśnięciu nie pokazuje swojego kodu na wyświetlaczu jest klawisz szesnasty.
Jest to wywołane tym, że po bezpośrednim naciśnięciu tego klawisza, mikrokontroler przechodzi do linii programu czyszczącej wyświetlacz LCD.
Aby zapobiec takiemu zachowaniu mikrokontrolera należy przed wyczyszczeniem wyświetlacza LCD wprowadzić dowolne opóźnienie czasowe.
Czy kod klawisza może wpłynąć na częstotliwość mrugania diody?.
Jeżeli tak to jak temu zapobiec?.
Tak, kod klawisza może wpłynąć na częstotliwość mrugania diody, ponieważ w części roboczej programu głównego kod ten zapamiętywany jest w rejestrze B. Później w tym samym rejestrze zapisywana jest wartość „KROTNOSC” w obsłudze przerwania. Przy wystąpieniu przerwania w rejestrze B pokazywana będzie inny kod klawisza ( kod klawisza wciśniętego tuż przed wystąpieniem przerwania).
Takiemu zachowaniu się programu możemy zapobiec poprzez zastosowania stosu do przechowywania kodu klawisza.
Opisać przebieg pracy TIMERA w tym programie.
Na początku programu następuje ustawienie TIMERA 0 oraz jego uruchomienie. Po około półtorej sekundzie następuje przepełnienie tego TIMERA. Następnie ustawiana jest flaga TF0 z jednoczesnym zgłoszeniem żądania obsługi przerwania. Później procesor rozpoznaje źródło przerwania i ustawia licznik rozkazów na 000BH.
Wykonuje kolejne rozkazy do napotkania rozkazu RETI i powraca do programu głównego.
Program główny pobiera z klawiatury szesnaście kolejnych znaków i wyświetla je na ekranie.
PRZERWANIE TIMERA 0 : tutaj przeładowywane są rejestry TH0 i TL0. Przy 255 przerwaniu wykonywana jest negacja linii diody LED.
PROGRAM ZMODYFIKOWANY
;************************************************************
;ĆWICZENIE 4 - SYSTEM PRZERWAŃ 8051
;ZADANIE 5 - TIMERY
;************************************************************
LED EQU P1.7
;*********** 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 0 ;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
TH0_SET EQU 0EAH ; stan początkowy TIMERA 0
TL0_SET EQU 066H ; opóźnienie 6ms
KROTNOSC EQU 0FFH ;krotność powtarzania opóźnienia 6ms
;*******************************************************
LJMP START
;
;************ PRZERWANIE TIMER 0 *********************
ORG 0BH
MOV TH0,#TH0_SET ;stan początkowy do TH0
MOV TL0,#TL0_SET ;i do TL0 (6ms)
DJNZ B,JESZCZE_NIE ;czy wykonano KROTNOSC opóźnień
;tj. KROTNOSC*6ms?
CPL LED ;mruganie diody TEST
MOV B,#KROTNOSC ;odczekaj kolejną KROTNOSC opóźnień
;KROTNOSC*6ms
JESZCZE_NIE:
RETI
;***************************************************************************
ORG 100H
START:
MOV TMOD,#TMOD_SET ;TIMER 0 liczy czas
MOV TH0,#THO_SET ;stan początkowy do TH0
MOV TL0,#TL0_SET ;i do TL0
SETB TR0 ;start TIMERA 0
SETB EA ;włącz zezwolenie ogólne na przerwania
SETB ET0 ;włącz zezwolene na przerwanie od TIMERA 0
;*******************************************************************************
;
; ROBOCZA CZĘŚĆ PROGRAMU GŁÓWNEGO
;
;*******************************************************************************
LOOP_0:
LCALL LCD_CLR ;czyść wyświetlacz
MOV R1,#16 ;do odliczania max. 16 znaków na wyświetlaczu
LOOP: ;w tej pętli czyta/pisze znak
LCALL WAIT_KEY ;czytaj klawisz
PUSH ACC ;przechowaj znak
MOV A,#2 ;niewielkie
LCALL DELAY_MS ;opóźnienie
POP ACC ;pobierz znak ze stosu
ADD A,#30H ;zamień binarny kod cyfry na kod w ASCII
LCALL WRITE_DATA ;wyślij znak na wyświetlacz
DJNZ R1,LOOP ;wyczyść wyświetlacz ,jeżeli było już 16 znaków
MOV A,#99
LCALL DELAY_MS
SJMP LOOP_0 ;zamknij pętlę
4