Procedury obsługi przerwań (część 3 z 3)
Dzisiaj bez demota :)
Kiedy mikrokontroler otrzyma sygnał przerwania, natychmiast przestaje wykonywać swój program i automatycznie wykonuje skok LCALL do procedury obsługi przerwania. Jest to zwykły skok pod odpowiedni adres:
INT0 - 0003h
T0 - 000Bh
INT1 - 0013h
T1 - 001Bh
Port Szeregowy - 0023h
T2 - 002Bh
Pod tym adresem należy umieścić procedurę, która zostanie wykonana gdy nastąpi przerwanie. Procedura powinna zakończyć się instrukcją RETI (return from interrupt). Kiedy mikrokontroler ją napotka, zakończy obsługę przerwania i wróci do wykonywania programu w miejscu, w którym przerwał.
Rozpoczęcie programu po wektorach przerwań
Przestrzeń dla procedur obsługi przerwań znajduje się na samym początku pamięci programu. Aby wykorzystać przestrzeń, pod którą mikrokontroler wykonuje skok podczas przerwania, musimy przesunąć resztę programu poza nią. Polega to na tym, że pod adresem 0000h umieszczamy skok pod adres położony poza używanymi przez nas wektorami przerwań. Mamy na to pierwsze 3 bajty pamięci programu, więc na pewno się zmieścimy:
ORG 0000h
JMP START
ORG 000Bh
... procedura obsługi przerwania ...
RETI
START:
... nasz program ...
8 bajtów to mało miejsca
Adresy, od których zaczynają się procedury obsługi przerwania, są oddalone od siebie o 8 bajtów. To nie oznacza, że mamy tylko 8 bajtów na naszą procedurę obsługi. Procedura może znajdować się gdzie indziej, ważne tylko, by na jej końcu znalazła się instrukcja powrotu z przerwania RETI.
Zmodyfikujmy nasz niby-program, który był powyżej:
ORG 0000h
JMP START
ORG 000Bh
JMP PRZER_T0
ORG 0013h
JMP PRZER_INT1
START:
... nasz program ...
PRZER_T0:
... obsługa przerwania T0 ...
RETI
PRZER_INT1:
... obsługa przerwania INT1 ...
RETI
Dzięki takiemu zabiegowi mamy do dyspozycji na nasze przerwania prawie całą dostępną pamięć programu w naszym układzie.
Co powinno się znaleźć w procedurze obsługi przerwania
Procedura obsługi przerwania to dowolny, zwykły program, który wykonuje wymagane przez nas czynności.
W zasadzie nie ma żadnych wytycznych co do tego, co powinno się w nim znajdować. Możemy na przykład umieścić w procedurze obsługi przerwania T0 instrukcję, która zapali lub zgasi nam diodę LED. Przy porcie szeregowym przerwanie służy do pobierania lub wysyłania danych (o tym innym razem).
Nawet instrukcja RETI nie jest konieczna, ale tylko w sytuacji, gdy po otrzymaniu przerwania nie chcemy z niego wrócić do dawnego programu.
Koniec części trzeciej
OK, seria zakończona (choć oczywiście nie wszystkie tematy w niej poruszyłem). Dlatego zapraszam do zadawania pytań w komentarzach. Jeśli pytań zbierze się dużo, napiszę jeszcze jeden tekst, w którym na nie odpowiem.
Co to są przerwania (część 1 z 3)
To jest pierwszy z serii trzech tekstów na temat przerwań. Moim zamiarem jest objąć w tej serii podstawowe informacje o przerwaniach (część 1), konfigurację systemu przerwań (część 2) i procedury obsługi przerwań (część 3). W pierwszej części gościnnie wystąpią Demotywatory.
W dziedzinie mikroprocesorów przerwania są to sygnały kontrolujące wykonywanie programu przez procesor. Wystąpienie przerwania powoduje, że procesor przestaje wykonywać swoje obecne czynności i przeskakuje do procedury obsługi przerwania. Gdy uC zakończy obsługę przerwania, wraca do miejsca, w którym przerwał wykonywanie programu.
program ----> przerwanie -----|
^------------------------------
Można to sobie wyobrazić na przykładzie sytuacji z życia wziętej. Zaprosiłeś znajomych i oglądacie film na kompie.
Hmmm....

O wiele lepiej
Oglądacie film, a w kuchni szykuje się żarełko. No, powiedzmy niech będą frytki w piekarniku. Co, nie mogą być? Oczywiście, że mogą, bo pasują do tego przykładu. Nie chcesz, żeby się przypaliły, więc nastawiasz sobie budzik w komórce na odpowiednią godzinę i problem z głowy.
Komóra dzwoni, ty wciskasz pauzę. I to jest właśnie przerwanie, no bo w końcu coś przerwało wam oglądanie filmu. Robisz chwilę przerwy, żeby zająć się frytkami i jak skończysz, wracasz do znajomych z pełnymi talerzami - to się zowie obsługą przerwania. Teraz wciskasz play i już możecie kontynuować oglądanie filmu, a dodatkowo jest smaczna przekąska - innymi słowy powrót z przerwania w dobrym stylu.
Proste, nie?
3 typy przerwań w uC51
Przerwania zewnętrzne. Jeśli pamiętasz oznaczenia nóżek AT89C51 i kompatybilnych układów, to przypomnij sobie dwie nóżki portu P3, oznaczone INT0# i INT1#. Te dwie nóżki mogą służyć do wysyłania sygnałów o przerwaniu zewnętrznym. # (negacja) oznacza, że podanie 0 na nóżkę wywoła przerwanie. Tego rodzaju przerwanie możesz zatem wygenerować sam, w dowolnym momencie.
Przerwania z timera. Timer działa na zasadzie zliczania impulsów generowanych przez mikrokontroler w każdym cyklu. Zliczanie odbywa się na rejestrze 8- lub 16-bitowym i gdy rejestr osiągnie wartość maksymalną, wywołane zostaje przerwanie (po czym timer zaczyna liczenie od początku).
Przerwania z portu szeregowego. Port szeregowy generuje przerwanie gdy odbierze lub wyśle 8 bitów (czyli pełny bajt). Przerwanie to oznacza, że coś trzeba zrobić w sprawie portu szeregowego: albo wysłać kolejny bajt, albo zrobić coś z bajtem przed chwilą odebranym.
W następnej części (już jest) konfiguracji systemu przerwań. Aby otrzymać informację o pojawieniu się nowego artykułu, sugeruję zapisanie się na newsletter lub kanał RSS.

