background image

 
 
 
 
 
 
 
 
 

ĆWICZENIE  

 
 
 
 
 
 

TEMAT:   

OBSŁUGA  KONTROLERA PRZERWAŃ W  PAKIECIE  KEILuVISON 

 

 

 

80C535 

background image

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. 

 
 

 

background image

 

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; 

background image

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 

 

{} 

   

 

background image

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 

 

{} 

   

 

background image

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 

 

{} 

   

background image

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.