Ć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.