ĆWICZENIE
TEMAT:
OBSAUGA KONTROLERA PRZERWAC 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 zró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 OBSAUGI PRZERWAC
#include
void main (void)
{
EAL=1;
EX0=1;
IT0=1;
while(1);
}
void int_0 (void) interrupt 0 using 0
{ & PROGRAM OBSAUGI 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 OBSAUGI ZGAOSZENIA 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 zró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
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
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
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
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 0Zadanie 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.
Wyszukiwarka
Podobne podstrony:
Rozdział 04 System obsługi przerwań sprzętowych
Ćwiczenia na drabinkach koordynacyjnych – cz 3
Ćwiczenia na drabinkach koordynacyjnych – cz 2
Ćwiczenia na płaski brzuch, jędrne pośladki i uda oraz ładny biust
Ćwiczenia na wyskok (2)
Plan ćwiczeń na triceps
Ćwiczenia na wewnętrzną stronę ud
więcej podobnych podstron