ĆWICZENIE
TEMAT:
OBSŁUGA KONTROLERA PRZERWAŃ W PAKIECIE KEILuVISON
80C535
Wiadomości wstępne:
Wiadomości wstępne:
W procesorze SAB 80C515 przerwaniami steruje kontroler przerwań, zadaniem
kontrolera przerwań jest kojarzenie sygnałów przerwań ( znaczników zgłoszonych przerwań )
z przypisanymi na stałe adresami pamięci programu (PGM).
Każdy znacznik przerwania ma przypisany adres w pamięci programu.
Przerwanie to sposób pracy procesora polegający na tym że pod wpływem sygnału
zewnętrznego lub pochodzącego z układu wewnętrznego procesora , procesor przerywa
aktualnie wykonywany program ( np. program główny ) i przechodzi do wykonania
podprogramu związanego z sygnałem wywołującym przerwanie. Po wykonaniu podprogramu
obsługi przerwania procesor powraca do wykonywania przerwanego programu . Aby móc
powrócić do przerwanego podprogramu , przed wejściem do podprogramu obsługi przerwania
,procesor przesyła na stos adres rozkazu który ma być wykonany po powrocie z podprogramu
obsługi przerwania .
Każdy sygnał który może wywołać przerwanie ,jest związany z odpowiadającym mu
znacznikiem. W momencie ,gdy sygnał przerwania jest aktywny, odpowiadający mu znacznik
jest ustawiany w stan 1. Sygnał z każdego źródła przerwania może być indywidualnie
zablokowany. Znaczniki blokujące przerwania w mikrokontrolerze SAB80(C)515 znajdują
się w rejestrach IEN0 i IEN1. W rejestrze IEN0 znajduje się znacznik EAL ,którym można
zablokować równocześnie wszystkie przerwania.
IEN0
EAL WDT ET2 ES ET1 EX1 ET0 EX0
• EAL- blokowanie wszystkich przerwań . EAL=0 – żadne przerwanie nie może być przyjęte . EAL=1 każde
przerwanie może być przyjęte pod warunkiem że odpowiadający mu znacznik jest w stanie 1.
• ET2- blokowanie (ET2=0) lub odblokowanie (ET2=1) przerwania generowanego przez licznik T2.
• ES- blokowanie (ES=0) lub odblokowanie (ES=1) przerwania generowanego przez port szeregowy.
• ET1- blokowanie (ET1=0) lub odblokowanie (ET1=1) przerwania generowanego przez licznik T1.
• EX1- blokowanie (EX=0) lub odblokowanie (EX=1) przerwania generowanego przez
licznik T1.
• ET0- blokowanie (ET=0) lub odblokowanie (ET=1) przerwania generowanego przez
licznik T0.
• EX0- blokowanie (EX=0) lub odblokowanie (EX=1) przerwania zewnętrznego z wejścia INT0.
TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
• TF1- znacznik ustawiamy w stan 1 przy przepełnieniu licznika T1
• TF0- znacznik ustawiamy w stan 1 przy przepełnieniu licznika T0
• IE1- znacznik ustawiamy w stan 1 sygnałem przerwania na wejściu INT1
• IT1- znacznik wyboru sygnału przerywającego na wejściu INT1. IT1 =0- przerwanie jest wywoływane
stanem niskim ,IT1 = 1 – przerwanie jest wywoływane zboczem opadającym.
• IE0- znacznik ustawiamy w stan 1 sygnałem przerwania na wejściu INT0
• IT0- znacznik wyboru sygnału przerywającego na wejściu INT0. IT0 =0- przerwanie jest wywoływane
stanem niskim ,IT0 = 1 – przerwanie jest wywoływane zboczem opadającym.
interrupt 0
-
przerwanie od INT0 (P3.2)
0003h
interrupt 1
-
przerwanie od licznika T0
000bh
interrupt 2
-
przerwanie od INT1 (P3.3)
0013h
interrupt 3
-
przerwanie od licznika T1
001bh
interrupt 4
-
przerwanie od portu szeregowego
0023h
interrupt 5
-
przerwanie od licznika T2
002bh
interrupt 6
-
przerwanie od przetwornika A/C
0043h
interrupt 7
-
przerwanie od INT2 (P1.4)
004bh
interrupt 8
-
przerwanie od INT3 (P1.0)
0053h
interrupt 9
-
przerwanie od INT4 (P1.1)
005bh
interrupt 10
-
przerwanie od INT5 (P1.2)
0063h
interrupt 11
-
przerwanie od INT6 (P1.3)
006bh
STRUKTURA PROGRAMU DO OBSŁUGI PRZERWAŃ
#include <REG515.H>
void main (void)
{
EAL=1;
EX0=1;
IT0=1;
while(1);
}
void int_0 (void) interrupt 0 using 0
{ …PROGRAM
OBSŁUGI PRZERWANIA INT0 …
}
void int_T0 (void) interrupt 1 using 0
{}
void int_1 (void) interrupt 2 using 0
{}
void int_T1 (void) interrupt 3 using 0
{}
ZASADY OBSŁUGI ZGŁOSZENIA PRZERWANIA
1. Obsługa przerwania o niskim poziomie może zostać zawieszona przez przerwanie z
wyższego poziomu ( jeśli nie jest ono zablokowane programowo)
2. Jeżeli występują jednocześnie dwa żądania przerwań o różnych poziomach to jako
pierwsze zostanie przyjęte przerwanie z wyższego poziomu.
3. Jeżeli zgłoszone przerwania są na tym samym poziomie to o kolejności ich obsługi
decyduje wewnętrzna kolejność przeglądania przerwań ( priorytet ).
UWAGA:
1. Znacznik zgłoszenia przerwania jest kasowany w momencie wejścia do programu
obsługi przerwania ( kasowanie automatyczne), wyjątkiem są znaczniki TI oraz RI
muszą być kasowane programowo.
2. Jeżeli zmienna jest modyfikowana w programie obsługi przerwania to należy ją
zadeklarować jako ( volatile ) np. int volatile a=5;
3. W programie obsługi przerwania nie można zablokować znacznika blokowania
przerwania ( np. EX0 = 0; ) natomiast dozwolone jest zerowanie znacznika źródła
przerwania ( np. IE0 = 0; )
1. Otwieramy projekt o nazwie „BLINKY” z katalogu
c:\Keil\C51\EXAMPLES\test\ BLINKY.Uv2
2. Ćwiczenia dotyczące działania kontrolera przerwań.
Zadanie 1.
Program główny pracuje w pętli nieskończonej (nic nie robi). Po wciśnięciu przycisku
P3.2 następuje zgłoszenie przerwania INT_0. W programie obsługi przerwania następuje
negacja zmiennej p i wysłanie wartości zmiennej na port P5.
#include <REG515.H>
char volatile p;
void main (void)
{
EAL=1;
EX0=1;
IT0=1;
while(1);
}
void int_0 (void) interrupt 0 using 0
{
P5 = p;
p = ~ p;
}
void int_T0 (void) interrupt 1 using 0
{}
void int_1 (void) interrupt 2 using 0
{}
void int_T1 (void) interrupt 3 using 0
{}
Zadanie 2.
Program po wykryciu przerwania INT_0 powoduje 5 – krotne zapalenie i zgaszenie
pinów portu P5.
#include <REG515.H>
char volatile p;
void delay ()
{
unsigned int volatile i =50000;
while
(i--);
}
void main (void)
{
EAL=1;
EX0=1;
IT0=1;
while(1);
}
void int_0 (void) interrupt 0 using 2
{
p=5;
while(p--)
{
P5
=
0x00;
delay();
P5
=
0xff;
delay();
}
}
void int_T0 (void) interrupt 1 using 0
{}
void int_1 (void) interrupt 2 using 0
{}
void int_T1 (void) interrupt 3 using 0
{}
Zadanie 3.
Program reaguje na przerwanie od licznika T0, pracującego w trybie 1 i włączanym
programowo. Program obsługi przerwania powinien zwiększać zmienną o 1 i wyświetlać ją
na porcie P5, jeśli zmienna przekroczy wartość 255 to ją zeruje.
#include <REG515.H>
int volatile p;
void delay (void)
{
unsigned int i=50000;
while(i--);
}
void main (void)
{
EAL=1;
ET0=1;
MOD=0x01;
TR0=1;
while(1);
}
void int_0 (void) interrupt 0 using 0
{}
void int_T0 (void) interrupt 1 using 0
{
p++;
if(p<256)
P5=p;
else
p=0x00;
delay(
);
}
void int_1 (void) interrupt 2 using 0
{}
void int_T1 (void) interrupt 3 using 0
{}
Zadanie 4.
Napisz modyfikację do zadania 3, aby było obsługiwane przerwanie od licznika T1, natomiast
program obsługi przerwania przesuwał zmienną p o 1 bit w lewo za każdym zgłoszeniem
przerwania poczynając od wartości p=0x01 i wyświetlał wartość zmiennej na porcie P5. Jeśli
zmienna p przekroczy wartość p=0x80 to powinna być ustawiona na p=0x01.
Zadanie 5.
Napisz program obsługujący przerwania INT_0 i INT_1. Program obsługi przerwania INT_0
powinien zwiększać zmienną p o 1 natomiast program obsługi przerwania INT_1 zmniejszać
tą samą zmienną o jeden, w obydwu przypadkach zmienna powinna być wyświetlana na
porcie P5.
#include <REG515.H>
int volatile p;
void main (void)
{
EAL=1;
EX0=EX1=1;
IT0=IT1=1;
P5=0x00;
while(1);
}
void int_0 (void) interrupt 0 using 0
{
p++;
P5=p;
}
void int_T0 (void) interrupt 1 using 0
{}
void int_1 (void) interrupt 2 using 0
{
p--;
P5=p;
}
void int_T1 (void) interrupt 3 using 0
{}
Zadanie 6.
Dopisz do zadania 5 ograniczenie dla zmiennej p aby była z zakresu 0<p<16.
Zadanie 7.
Napisz program który obsługuje przerwania od licznika T0 pracującego w trybie 1, włączany
TR0. Program przerwania od licznika ma zwiększać zmienną p o 1 i wyświetlać jej zawartość
na porcie P5 jeżeli wartość zmiennej przekroczy p=0xff do powinna być wyświetlana na
porcie P1.