Ćwiczenie 8

Transkrypt

Ćwiczenie 8
Ć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
interrupt 1
interrupt 2
interrupt 3
interrupt 4
interrupt 5
interrupt 6
interrupt 7
interrupt 8
interrupt 9
interrupt 10
interrupt 11
-
przerwanie od INT0 (P3.2)
przerwanie od licznika T0
przerwanie od INT1 (P3.3)
przerwanie od licznika T1
przerwanie od portu szeregowego
przerwanie od licznika T2
przerwanie od przetwornika A/C
przerwanie od INT2 (P1.4)
przerwanie od INT3 (P1.0)
przerwanie od INT4 (P1.1)
przerwanie od INT5 (P1.2)
przerwanie od INT6 (P1.3)
0003h
000bh
0013h
001bh
0023h
002bh
0043h
004bh
0053h
005bh
0063h
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.