System przerwań
W dużej grupie aplikacji, w których są stosowane układy mikroprocesorowe, istnieje konieczność odpowiedniej reakcji na pewne zdarzenia występujące okresowo, czy też nieokresowo. Mianem ,,zdarzeń'' określa się tutaj pewne stany zarówno wewnątrz układu mikroprocesorowego (odebranie lub wysłanie bajta informacji przez port szeregowy lub przepełnienie jednego z liczników-czasomierzy), jak również na zewnątrz (odpowiedni stan logiczny na wyprowadzeniach mikrokontrolera). Wystąpienie takiego zdarzenia wyznacza niejako chwilę początkową, od której powinien być wykonywany pewien określony fragment programu. Opisane powyżej zdarzenia noszą nazwę przerwań (ang. interrupt), natomiast fragmenty programu wykonywane po ich wystapieniu są nazywane programami obsługi przerwań (ang. interrupt service routine).
System przerwań (ang. interrupt system) umożliwia zatem zawieszenie wykonywania działania bieżącego programu i natychmiastowy skok do wykonywania podprogramu obsługi przerwania na skutek pojawienia się sygnału zgłoszenia przerwania. Mikrokontrolery rodziny MCS-51 posiadają 5 ( lib 6 w przypadku układu oznaczanego 8xx2) źródeł przerwań przedstawionych graficznie na poniższym rysunku.

Pierwsza instrukcja związana z obsługą danego przerwania musi być zawsze umieszczona pod ściśle określonym adresem zwanym wektorem przerwania (ang. interrupt vector). W mikrokontrolerach rodziny MCS-51 adresy, pod które następuje skok w wypadku pojawienia się źródła przerwania, umieszczone są w początkowym obszarze pamięci programu w odstępach co 8 bajtów. W Poniższej tablicy przedstawiono adresy wspólne dla całej rodziny mikrokontrolerów MCS-51. W przypadku rozbudowanych odmian mikrokontrolerów tej rodziny mogą występować inne źródła przerwań wraz z przypisanymi do nich dalszymi adresami.
Żródło przerwania | Adres |
---|---|
Zewnętrzne INT0 | 0003h |
Licznik-czasomierz T0 | 000Bh |
Zewnętrzne INT1 | 0013h |
Licznik-czasomierz T1 | 001Bh |
Port szeregowy | 0023h |
Licznik-czasomierz T2 | 002Bh |
Domyślnie po resecie mikrokontrolera system przerwań jest nieaktywny (zablokowany). Jego aktywacja (odblokowanie) następuje dopiero w wyniku programowego ustawienia bitu EA znajdującego się w rejestrze IE oraz odpowiednich bitów (znajdujących się w tym samym rejestrze) odblokowujących właściwe przerwanie, co pozwala na przyjmowanie przerwań tylko od pożądanych źródeł.
Rejestr | IE | |||||||
---|---|---|---|---|---|---|---|---|
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Adres bitu | AFh | AEh | ADh | ACh | ABh | AAh | A9h | A8h |
Oznaczenie bitu | EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
Bit | Symbol | Funkcja |
IE.7 | EA | Bit maski systemu przerwań |
IE.6 | - | Rezerwa |
IE.5 | ET2 | Bit maski przerwania od licznika czasomierza T2 |
IE.4 | ES | Bit maski przerwania od protu szeregowego |
IE.3 | ET1 | Bit maski przerwania od licznika czasomierza T1 |
IE.2 | EX1 | Bit maski przerwania od wejścia zewnętrznego INT1 |
IE.1 | ET0 | Bit maski przerwania od licznika czasomierza T0 |
IE.0 | EX0 | Bit maski przerwania od wejścia zewnętrznego INT0 |
Dość często w bardziej rozbudowanych klonach tego mikrokontrolera stosuje się inne oznaczenie rejestru IE. Związane jest to z faktem występowania większej liczby źródeł przerwań, co z kolei wiąże się z przydzieleniem dodatkowego rejestru do ich aktywacji. Dlatego w takich przypadkach należy odnieść się do dokumentacji danego mikrokontrolera. |
Znaczniki wystąpienia przerwań
Z każdym źródłem przerwania związany jest pojedynczy bit znacznika przerwania. W chwili, gdy sygnał przerwania jest aktywny, związany z nim znacznik jest ustawiany na 1. W przypadku, gdy dane przerwanie jest odblokowane i znacznik wystapienia przerwania ustawiony na 1, nastąpi skok pod odpowiedni wektor przerwania.
Również programowe ustawienie wybranego znacznika jest równoznaczne z wystąpieniem aktywnego sygnału przerwania. |
Poniżej przedstawiono znaczniki wystąpienia przerwań właściwe dla standardowego mikrokontrolera rodziny MCS-51.
Rejestr | TCON | |||||||
---|---|---|---|---|---|---|---|---|
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Adres bitu | 8Fh | 8Eh | 8Dh | 8Ch | 8Bh | 8Ah | 89h | 88h |
Oznaczenie bitu | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
Bit | Symbol | Funkcja |
TCON.7 | TF1 | Znacznik zgłoszenia przerwania od licznika T1 |
TCON.5 | TF0 | Znacznik zgłoszenia przerwania od licznika T0 |
TCON.3 | IE1 | Znacznik zgłoszenia przerwania od wejścia INT1 |
TCON.1 | IE0 | Znacznik zgłoszenia przerwania od wejścia INT0 |
Rejestr | SCON | |||||||
---|---|---|---|---|---|---|---|---|
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Adres bitu | 9Fh | 9Eh | 9Dh | 9Ch | 9Bh | 9Ah | 99h | 98h |
Oznaczenie bitu | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
Bit | Symbol | Funkcja |
SCON.1 | TI | Znacznik zgłoszenia przerwania od nadajnika portu szeregowego |
SCON.0 | RI | Znacznik zgłoszenia przerwania od odbiornika portu szeregowego |
Rejestr | T2CON | |||||||
---|---|---|---|---|---|---|---|---|
Adres bitu | CFh | CEh | CDh | CCh | CBh | CAh | C9h | C8h |
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Oznaczenie bitu | TF2 | EXF2 | RCLK | TCLK | EXEN2 | TR2 | C/T2 | CP/RL2 |
Bit | Symbol | Funkcja |
T2CON.7 | TF2 | Znacznik zgłoszenia przerwania od przepełnienia licznika T2 |
T2CON.6 | EXF2 | Znacznik zgłoszenia przerwania od pojawienia się zbocza opadającego na wejściu T2EX mikrokontrolera |
Większość przedstawionych powyżej znaczników zerowana jest automatycznie po przyjęciu przerwania za wyjątkiem dwóch (TI oraz RI) związanych z portem szeregowym mikrokontrolera oraz TF2 i EXF2 związanych z licznikiem T2. Ich zerowanie musi być realizowane programowo w programie obsługi przerwania.
Należy zauważyć, że wspomniane pary znacznikiów mają przypisany ten sam wektor przerwania. Dlatego aby poprawnie reagować na przerwanie związane z portem szeregowym i licznikiem T2, program jego obsługi powinien uwzględniać sprawdzenie, w wyniku uystawienia którego znacznika nastąpiło jego wywołanie.
Przerwania zewnętrzne INT0 i INT1
Przerwania zewnętrzne INT0 i INT1 mogą być generowane zarówno niskim poziomem jaki i opadającym zboczem sygnału doprowadzonego do zewnętrznych wyprowadzeń P3.2 (INT0) i P3.3 (INT1) mikrokontrolera w zależności od ustawienia bitów IT1 i IT0 rejestru TCON. Domyślnie bity te są wyzerowane co oznacza, że przerwania są zgłaszane niskim poziomem sygnału.
Obydwa wyprowadzenia INT0 i INT1 mikrokontrolera związane z przerwaniami zewnętrznymi działają identycznie oraz posiadają taki sam zbiór bitów sterujących i informacyjnych. Dlatego aby nie omawiać dwókrotnie tych samych informacji zastosowano ogólne oznaczenia z literą "i" zamiast cyfr 0 i 1.
Ustawienie bitu ITi na 1 powoduje, że przerwanie jest zgłaszane opadającym zboczem sygnału. Kiedy na danym wejściu INTi pojawi się odpowiedni stan sygnału, ustawiany jest znacznik zgłoszenia przerwania IEi. Nowa wartość znacznika IEi będzie aktywna podczas sprawdzania przez mikrokontroler zgłoszeń przerwań dopiero w następnym cyklu maszynowym w stosunku do tego, w którym został ustawiony.
Rejestr | TCON | |||||||
---|---|---|---|---|---|---|---|---|
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Adres bitu | 8Fh | 8Eh | 8Dh | 8Ch | 8Bh | 8Ah | 89h | 88h |
Oznaczenie bitu | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
Bit | Symbol | Funkcja |
TCON.3 | IE1 | Znacznik zgłoszenia przerwania od wejścia INT1 |
TCON.2 | IT1 | Bit sterujący sposobem zgłaszania przerwania na wejściu INT1 |
TCON.1 | IE0 | Znacznik zgłoszenia przerwania od wejścia INT0 |
TCON.0 | IT0 | Bit sterujący sposobem zgłaszania przerwania na wejściu INT0 |
Ponieważ stan linii INTi jest próbkowany raz w każdym cyklu maszynowym, dlatego dany stan na linii powinien być utrzymany co najmniej przez czas równy 12 okresom sygnału zegarowego taktującego mikrokontroler, aby zapewnić jego poprawne wykrycie. Jeśli przerwanie zewnętrzne jest aktywowane opadającym zboczem sygnału, to w celu jego poprawnego wykrycia, stan wysoki, a następnie niski, powinien być utrzymany co najmniej przez czas trwania jednego cyklu maszynowego.
Jeśli przerwanie zgłaszane jest niskim poziomem, to stan aktywny musi zniknąć przed zakończeniem wykonywania programu obsługi przerwania, tzn. przed wykonaniem rozkazu RETI, ponieważ tylko wtedy znacznik IEi zgłoszenia przerwania zostanie wyzerowany. W przeciwnym razie znacznik IEi pozostanie ustawiony i przerwanie zostanie przyjęte ponownie. Dlatego w przypadku źródeł przerwań wymagających potwierdzenia przyjęcia przerwania, w programie obsługi przerwania należy umieścić fragment kodu, który wyśle potwierdzenie, informujące o konieczności zmiany sygnału doprowadzonego do wejścia INTi w stan wysoki. W przypadku przerwań zgłaszanych opadającym zboczem, znacznik IEi jest zerowany automatycznie w czasie przyjęcia przerwania.
Poziomy i priorytety przerwań
Każde ze źródeł przerwań może być indywidualnie zaprogramowane na jeden z dwóch poziomów ważności poprzez ustawienie (wyższy poziom) lub wyzerowanie (niższy poziom) odpowiednich bitów w rejestrze IP. Podczas wykonywanie programu obsługi przerwania, które znajduje się na niższym poziomie, może być przyjęte przerwanie z wyższego poziomu, co spowoduje zatrzymanie wykonywania aktualnego programu przerwania, wykonanie programu przyjętego przerwania i powrót do wykonywania przerwanego programu obsługi przerwania.
Podczas wykonywania programu obsługi przerwania znajdującego się na wyższym poziomie, nie będzie przyjęta żadne zgłoszenie przerwania. Zatem program obsługi przerwania z wyższego poziomu jest nieprzerywalny.
Rejestr | IP | |||||||
---|---|---|---|---|---|---|---|---|
Numer bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Adres bitu | BFh | BEh | BDh | BCh | BBh | BAh | B9h | B8h |
Oznaczenie bitu | - | - | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
Bit | Symbol | Funkcja |
IP.7 | - | Rezerwa |
IP.6 | - | Rezerwa |
IP.5 | PT2 | Bit priorytetu przerwania od licznika czasomierza T2 |
IP.4 | PS | Bit priorytetu przerwania od protu szeregowego |
IP.3 | PT1 | Bit priorytetu przerwania od licznika czasomierza T1 |
IP.2 | PX1 | Bit priorytetu przerwania od wejścia zewnętrznego INT1 |
IP.1 | PT0 | Bit priorytetu przerwania od licznika czasomierza T0 |
IP.0 | PX0 | Bit priorytetu przerwania od wejścia zewnętrznego INT0 |
W przypadku jednoczesnego zgłoszenia przerwań umieszczonych na różnych poziomach, obsługiwane jest przerwanie z wyższego poziomu. Jeśli natomiast jednocześnie zgłoszone są przerwania z tego samego poziomu, to kolejność przyjęcia przerwań określona jest przez sztywno ustalony priorytet przedstawiony w poniższej tablicy.
Żródło przerwania | Priorytet |
---|---|
Zewnętrzne INT0 | Najwyższy |
Licznik-czasomierz T0 | |
Zewnętrzne INT1 | |
Licznik-czasomierz T1 | |
Port szeregowy | |
Licznik-czasomierz T2 | Najniższy |
Poniżej przedstawiono kilka przykładów pokazujących w jaki sposób poziomy i priorytety przerwań wpływają na ich obsługę.

W pierwszej z rozpatrywanych sytuacji zakłada się, iż w programie zaimplementowano obsługę przerwań od wejścia INT0 oraz INT1. W celu obrazowego przedstawienia różnych zależności, zmiany stanów bitów przedstawiono w sposób graficzny na wykresach czasowych. Zakłada się przy tym, że obydwa przerwania znajdują się na tym samym poziomie, tzn. bity PX0 oraz PX1 w rejestrze IP mają wartość równą 0. Jeśli w pierwszej kolejności nastąpi zmiana stanu linii INT0 z 1 na 0 (chwila t1) i ustawiono spsób zgłaszania tego przerwania zboczem opadającym, to zmiana stanu linii INT0 skutkuje ustawieniem bitu IE0 w rejestrze TCON. W wyniku przyjęcia przerwania przez mikrokontroler następuje automatyczne zerowanie bitu IE0 (chwila t2), a w nastepnej kolejności wykonanie instrukcji związanych z obsługą tego przerwania aż do chwili napotkania instrukcji RETI.
Jeśli podczas trwania obsługi przerwania od wejścia INT0 nastąpi zmiana stanu wejścia INT1 (chwila t3), to skutkuje to zmianą stanu bitu IE1 będącego znacznikiem zgłoszenia przerwania od wejścia INT1. Ponieważ w momencie ustawienia bitu IE1 wciąż wykonywana jest obsługa przerwania od wejścia INT0, to obsługa przerwania od wejścia INT1 nie zostaje rozpoczęta. Obsługa przerwania od wejścia INT1 zostanie rozpoczęta dopiero po zakończeniu obsługi przerwania od wejścia INT1 (chwila t4).
Podobnie wystąpienie zbocza opadającego na linii INT0 (chwila t5) podczas obsługi przerwania od wejścia INT1 nie ma wpływu na realizację tej obsługi. Przerwanie od wejścia INT0 zostanie obsłużone dopiero po zakończeniu obsługi przerwania od wejścia INT1 (chwila t6).
Jeśli w rozpatrywanym wcześniej przypadku nastąpi jednoczesne zgłoszenie przerwań będących na tym samym poziomie, to jako pierwsze zostanie obsłużone przerwanie o wyższym priorytecie (INT0). Dopiero po zakończeniu obsługi tego przerwania nastąpi przejście do obsługi przerwania od wejścia INT1 (patrz poniższy rysunek).

Inaczej ma się sprawa, gdy jedno z przerwań znajduje się na wyższym poziomie. Poniżej przedstawiono wykresy czasowe obrazujące taki przypadek przy założeniu, że przerwanie od wejścia INT0 przesunieto na wyższy poziom przez ustawienie bitu PX0 na 1 (bit PX1 ma dalej wartość 0).

Podobnie jak w pierwszym z prezentowanych przypadków, również tutaj pojawienie się źródła przerwania od wejścia INT1 w czasie obsługi przerwania od wejścia INT0 (chwila t3) nie powoduje przerwania tej obsługi. Natomiast pojawienie się źródła przerwania od wejścia INT0 w czasie obsługi przerwania od wejścia INT1 powoduje przerwanie wykonywania tej obsługi p rzejście do obsługi przerwania od wejścia INT0.