MCS-51
Architektura

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.

Źródła przerwań w mikrokontrolerze MCS-51.

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

Uwaga 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ę.

Priorytety przerwań

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

Priorytety przerwań

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

Priorytety przerwań

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.