Wydział Elektroniki i Telekomunikacji MIKROKONTROLER 8051
System przerwań 8051
Poznań 2009
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
Wstęp teoretyczny
Mikrokontroler 8051 jest wyposażony w wieloźródłowy system obsługi przerwań o dwóch priorytetach z możliwością zagnieżdżania.
Mikroprocesor akceptuje żądania przerwania z pięciu źródeł. Są nimi: dwa zewnętrzne urządzenia zgłaszające przerwania przez wejścia INT0 i INT1, po jednym przerwaniu od każdego z dwóch układów timerów oraz jedno przerwanie od portu szeregowego. Każde przerwanie ma przydzielony adres, pod którym powinna być umieszczona procedura obsługi. Każdemu z pięciu przerwań może być przydzielony jeden z dwóch poziomów priorytetów, ponadto każde z przerwań może być niezależnie blokowane. Przerwania zewnętrzne mogą być zaprogramowane na zgłaszanie poziomem lub zboczem sygnału.
Aktywny jest poziom niski.
Wektor adresów procedur obsługi przerwań przedstawia poniższa tabela źródło przerwania
adres obsługi przerwania
przerwanie zewnętrzne 0
3H
wewnętrzny timer 0
0BH
przerwanie zewnętrzne 1
13H
wewnętrzny timer 1
1BH
wewnętrzny port szeregowy
23H
Na skutek żądania przerwania ustawiane są odpowiednie wskaźniki w rejestrach TCON i SCON. Wskaźniki żądań przerwań zawiera kolejna tabela.
źródło przerwania
nazwa flagi
lokalizacja
przerwanie zewnętrzne 0
IE0
TCON.1
wewnętrzny timer 0
TF0
TCON.5
przerwanie zewnętrzne 1
IE1
TCON.3
wewnętrzny timer 1
TF1
TCON.7
wewnętrzny port szeregowy
TI
SCON.1
wewnętrzny port szeregowy
RI
SCON.0
Dane przerwanie zostanie obsłużone jeśli odpowiadający mu bit będzie ustawiony i jeśli nie ma żądania przerwania o wyższym priorytecie.
Bity zezwoleń na przerwania zawarte w rejestrze przerwań IE przedstawia tabela.
1
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
IE7
IE6
IE5
IE4
IE3
IE2
IE1
IE0
EA
-
-
ES
ET1
EX1
ET0
EX0
EA - ogólne zezwolenie na przerwania
ES - zezwolenie na przerwanie transmisji szeregowej ET1 - zezwolenie na przerwanie z timera 1
EX1 - zezwolenie na przerwanie z wejścia INT1
ET0 - zezwolenie na przerwanie z timera 0
ETX - zezwolenie na przerwanie z wejścia INT0
Poszczególne źródła przerwań mają przyznawane poziomy priorytetów jako wyższe lub niższe przez ustawienie odpowiednich bitów w rejestrze priorytetu przerwań IP.
Ustawiając te bity w stan 1, przyznawany jest danemu przerwaniu wyższy priorytet. Flagi poziomów przerwań zawiera kolejna tabela.
źródło przerwania flaga priorytetu priorytet wewnątrz
lokalizacja
poziomu
zarezerwowane
-
IP.7
zarezerwowane
-
IP.6
zarezerwowane
-
IP.5
port szeregowy
PS
.4 (najniższy)
IP.4
timer 1
PT1
.3
IP.3
INT1
PX1
.2
IP.2
timer0
PT0
.1
IP.1
INT0
PX0
.0 (najwyższy)
IP.0
Zewnętrzne żądania przerwań zgłaszane poprzez wejścia INT0 i INT1 mogą być zaprogramowane jako wejścia sygnalizujące zboczem lub poziomem impulsu. Zasady reakcji na poszczególne sygnały żądań przerwań są zapisane na odpowiednich bitach rejestru TCON.
funkcja
nazwa bitu
lokalizacja
flaga żądania zewnętrznego przerwania 1
IE1
TCON.3
sposób działania wejścia INT1
IT1
TCON.2
flaga żądania zewnętrznego przerwania 0
IE0
TCON.1
sposób działania wejścia INT0
IT0
TCON.0
2
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
Przebieg ćwiczenia
1.) Przeanalizuj działanie przedstawionego poniżej programu. Program ten wykorzystuje sygnały przerwań generowane przez timery.
;************************************************
; 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+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
;50[ms] = 50 000[ms]*(11.0592[MHz]/12) =
; = 46 080 cykli = 180 * 256
TH0_SET
EQU
256-180
TL0_SET
EQU
0
;**************************************
LJMP START
;********* Przerwanie Timer 0 *********
ORG
0BH
MOV
TH0,#TH0_SET
;TH0 na 50ms
DJNZ ACC,NO_1SEK
;czy minęła 1 sek
CPL
LED
;mruganie diody TEST
MOV
A,#20
;odczekaj kolejny czas
;20*50ms=1s
NO_1SEK:
RETI
;**************************************
ORG
100H
START:
MOV
TMOD,#TMOD_SET
;Timer 0 liczy czas
MOV
TH0,#TH0_SET
;Timer 0 na 50ms
MOV
TL0,#TL0_SET
SETB TR0
;start Timera 0
MOV
A,#20
;odczekaj czas 20*50ms=1s
SETB EA
;włącz zezwolenie ogólne
3
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
;na przerwania
SETB ET0
;włącz zezwolenie na
;przerwanie od Timera 0
SJMP $
;koniec pracy
;programu głównego
Zmodyfikuj ten program tak by odliczanie do 20 nie odbywało się w akumulatorze.
Napisz program w ten sposób by sterowanie diodą LED odbywało się przy jednoczesnej możliwości czytania przez mikrokontroler znaków z klawiatury i wyświetlania ich na wyświetlaczu LCD (wykorzystaj procedury systemu DSM-51).
2.) Zapoznaj się z program przedstawionym poniżej. Jego głównym zadaniem jest przeglądanie wyświetlacza 7-segmentowego i klawiatury.
Zmodyfikuj go przenosząc obsługę wyświetlacza 7-segmentowego do procedury obsługi przerwania.
;************************************************
; ODCZYT KLAWIATURY
;************************************************
SEG_ON EQU
P1.6
;włączenie wyświetlacza 7-segm.
LED
EQU
P1.7
KEY
EQU
P3.5
;odczyt klawiatury
;Pamięć wewnętrzna RAM
DISPLAY
EQU
30H
KEY_LAST
EQU
DISPLAY+6
LJMP START
ORG
100H
START:
CLR
A
MOV
DISPLAY,A
;wpisz 0 do pamięci
MOV
DISPLAY+1,A
;danych wszystkich
MOV
DISPLAY+2,A
;wskaźników
MOV
DISPLAY+3,A
MOV
DISPLAY+4,A
MOV
DISPLAY+5,A
MOV
DISPLAY+6,A
LOOP_DISP:
;ustaw dane do wyśw.
;na wskaźniku 1
MOV
R0,#DISPLAY ;adres pobierania kodów
MOV
R2,#7
;licznik - liczba wskaź.
MOV
R3,#00000001B ;wybór wskaźnika
;- kod 1 z 8
LOOP:
SETB SEG_ON
;wyłącz poprzedni
;wskaźnik
4
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
MOV
R1,#CSDS
;adres wyboru wskaźnika
MOV
A,R3
;nr wskaźnika (1z8)
MOVX @R1,A
;wpisz wybrany wskaźnik
MOV
R1,#CSDB
;adres danych wskaźnika
MOV
A,@R0
;dane wskaźnika
CJNE
R3,#01000000B,SEG
;czy 7 wskaźnik
SJMP LEDS
;tak-diody świecące
;nie ma zamiany na kod
SEG:
LCALL GET_COD7
;zamiana cyfry na kod
LEDS:
MOVX @R1,A
;wpisanie kodu zapalanych
;segmentów do buforu
;danych wskaźnika
CLR
SEG_ON
;włączenie wskaźnika
MOV
C,KEY
;wstępny odczyt klawisza
MOV
A,#1
;odczekanie 1ms-świecenie
LCALL DELAY_MS
;jednego wskaźnika
JC
KEY_ON
;kontrola jednoznaczności
JB
KEY,KEY_END ;odczytu klawisza
KEY_OFF:
MOV
A,R3
;klawisz zwolniony
CPL
A
ANL
KEY_LAST,A ;zeruj odpowiedni bit
SJMP KEY_END
KEY_ON:
JNB
KEY,KEY_END
MOV
A,R3
;klawisz naciśnięty
ANL
A,KEY_LAST
JNZ
KEY_END
;klawisz był naciśnięty
;bez reakcji
MOV
A,R3
;klawisz był zwolniony
ORL
KEY_LAST,A ;ustaw odpowiedni bit
INC
@R0
;zwiększ licznik
;naciśnięć - liczbę na
;odpowiednim wskaźniku
KEY_END:
MOV
A,R3
RL
A
;numeru następnego
MOV
R3,A
;wskaźnika (kod 1 z 8)
INC
R0
;adres danych następnego
;wskaźnika
DJNZ R2,LOOP
;kolejne świecenie
;siedmiu wskaźników
SJMP LOOP_DISP
;zacznij od wskaźnika 1
;**************************************
;Podprogram zamienia cyfrę na kod 7-segmentowy GET_COD7:
ANL
A,#0FH
;tabela kodów 0..15
INC
A
;pomiń rozkaz RET
5
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
MOVC A,@A+PC
;pobierz kod
RET
COD_7SEG:
DB
03FH
;kod znaku 0
DB
006H
;kod znaku 1
DB
05BH
;kod znaku 2
DB
04FH
;kod znaku 3
DB
066H
;kod znaku 4
DB
06DH
;kod znaku 5
DB
07DH
;kod znaku 6
DB
007H
;kod znaku 7
DB
07FH
;kod znaku 8
DB
06FH
;kod znaku 9
DB
077H
;kod znaku A
DB
07CH
;kod znaku b
DB
039H
;kod znaku C
DB
05EH
;kod znaku d
DB
079H
;kod znaku E
DB
071H
;kod znaku F
3.) Zmodyfikuj program z poprzedniego polecenia w ten sposób by dane odczytywane z klawiatury matrycowej były wypisywane zarówno na wyświetlaczu LCD jak i na wyświetlaczu 7-segmentowym.
4.) Korzystając z programów z punktów 2.) i 3.) napisz program przeglądający wyświetlacz i klawiaturę w przerwaniu. Reakcję na użycie klawisza należy przekazać do programu głównego.
5.) Zapoznaj się z treścią programu przedstawionego poniżej, uruchom go. W wyniku działania programu można zauważyć wyraźnie zakłócone wyświetlanie na wyświetlaczu 7-segmentowym, co jest tego przyczyną? Usuń przyczynę wadliwego działania tego programu.
;************************************************
; PRIORYTETY PRZERWAŃ
;************************************************
LED
P1.7
SEG_ON
EQU
P1.6
;włączenie wyśw.7-segm.
;******* Pamięć wewnętrzna RAM ********
DISPLAY
EQU
30H
;pamięć danych dla wyśw.
LEDY
EQU
DISPLAY+6
;pamięć danych dla diod
TIME
EQU
LEDY+1
;licznik czasu mrugania
STOS
EQU
60H
;********* Ustawienie TIMERÓW *********
;TIMER 0
T0_G
EQU
0
;GATE
6
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
T0_C
EQU
0
;COUNTER/-TIMER
T0_M
EQU
1
;MOD (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
1
;MOD (0..3)
TIM1
EQU
T1_M+T1_C*4+T1_G*8
TMOD_SET
EQU
TIM0+TIM1*16
TH1_SET
EQU
256-4
;czas 4*256 = 1024 cykle
;= ok.1ms
;************** MACRA *****************
BANK0 MACRO
;ustawienie banku 0 rejestrów
CLR
RS0
;(z banku 1)
MACEND
BANK1 MACRO
;ustawienie banku 1 rejestr˘w
SETB RS0
;(z banku 0)
MACEND
;**************************************
LJMP START
;********* Przerwanie Timer 0 *********
ORG
0BH
JNB
TF0,$
;oczekiwanie przez pełen
;okres timera - ok.71ms
CLR
TF0
DJNZ TIME,NO_1SEK
MOV
TIME,#7
CPL
LED
NO_1SEK:
RETI
;********* Przerwanie Timer 1 *********
ORG
1BH
PUSH PSW
PUSH ACC
BANK1
;użycie banku 1 rejestrów
MOV
TH1,#TH1_SET ;ustawienie TH1 na 1ms
SETB SEG_ON
;wyłączenie wskaźnika
MOV
A,R3
;aktualny wskaźnik (1z8)
MOVX @R1,A
;wpisz do bufora wyboru
INC
R1
;adres bufora danych
MOV
A,@R0
;dane dla wskaźnika
CJNE
R3,#40H,SEG
;czy 7 wskaźnik
SJMP LEDS
;tak-diody-nie ma zamiany
SEG:
ACALL GET_COD7
;zamiana danych na kod
LEDS:
MOVX @R1,A
;wpisanie kodu segmentów
7
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
CLR
SEG_ON
;włączenie wskaźnika
DEC
R1
;adres bufora wyboru
MOV
A,R3
RL
A
;następny wskaźnik (1z8)
MOV
R3,A
INC
R0
;adres danych dla
;następnego wskaźnika
DJNZ R2,INT_END
;czy ostatni wskaźnik
;tak - ustaw dane dla 1
MOV
R0,#DISPLAY ;adres danych
MOV
R3,#1
;wybór wskaźnika-kod 1z8
MOV
R2,#7
;liczba wskaźników
INT_END:
;zakończenie przerwania
POP
ACC
POP
PSW
RETI
;**************************************
GET_COD7:
ANL
A,#0FH
;tabela kodów 0..15
INC
A
;ominięcie rozkazu RET
MOVC A,@A+PC
;pobranie kodu z tabeli
RET
COD_7SEG:
DB
03FH
;kod znaku 0
DB
006H
;kod znaku 1
DB
05BH
;kod znaku 2
DB
04FH
;kod znaku 3
DB
066H
;kod znaku 4
DB
06DH
;kod znaku 5
DB
07DH
;kod znaku 6
DB
007H
;kod znaku 7
DB
07FH
;kod znaku 8
DB
06FH
;kod znaku 9
DB
000H
;kod pusty (10)
DB
000H
;kod pusty (11)
DB
000H
;kod pusty (12)
DB
000H
;kod pusty (13)
DB
000H
;kod pusty (14)
DB
000H
;kod pusty (15)
;**************************************
ORG
100H
START:
MOV
SP,#STOS
MOV
DISPLAY,#6
;wpisanie kolejnych
MOV
DISPLAY+1,#5
;cyfr na wskaźniki
MOV
DISPLAY+2,#4
MOV
DISPLAY+3,#3
MOV
DISPLAY+4,#2
MOV
DISPLAY+5,#1
8
Politechnika Poznańska, Wydział Elektroniki i Telekomunikacji System przerwań
__________________________________________________________________________________________________________
BANK1
;rejestry banku1
;dla obsługi wyświetlacza
MOV
R0,#DISPLAY ;adres danych
MOV
R1,#CSDS+7
;adres wyboru wskaźnika
;z możliwością zamiany na
;adres danych wskaźnika
MOV
R2,#7
;liczba wskaźników
MOV
R3,#1
;wybór wskaźnika-kod 1z8
BANK0
MOV
TMOD,#TMOD_SET
;Timery liczą czas
MOV
TH1,#TH1_SET
;Timer 1 na 1ms
CLR
A
MOV
TL1,A
MOV
TH0,A
;Timer 0 na ok.71ms
MOV
TL0,A
SETB TR0
;start timerów
SETB TR1
MOV
TIME,#7
SETB EA
;zezwolenie na przerwanie
SETB ET0
;od timerów
SETB ET1
MOV
LEDY,#20H
;dioda 'Error'
LCALL LCD_CLR
MOV
DPTR,#TEXT
LCALL WRITE_TEXT
LOOP:
;zmiana priorytetu przerwania
;Timera 1
LCALL WAIT_ENT_ESC
JNC
HIGH_PRIOR
CLR
PT1
;Esc->niski priorytet
MOV
LEDY,#20H
;dioda 'Error'
SJMP LOOP
HIGH_PRIOR:
SETB PT1
;Enter->wysoki priorytet
MOV
LEDY,#10H
;dioda 'OK'
SJMP LOOP
TEXT:
DB
'ENTER -> T0 HP '
DB
'ESC -> T0 LP ',0
9