Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Tłumaczenie: mgr Jerzy Wałaszek |
©2021 mgr Jerzy Wałaszek |
Przerwanie pozwala urządzeniom peryferyjnym zawiesić bieżące działanie mikroprocesora i zmusić go do wykonania procedury obsługi danego urządzenia. Ta procedura obsługi wymaga zwykle wymiany danych, statusu lub informacji kontrolnej pomiędzy mikroprocesorem a danym urządzeniem. Gdy procedura obsługi zostanie zakończona, mikroprocesor powraca do wykonywania przerwanego zadania.
Mikroprocesor Z80 posiada dwa wejścia przerwań, maskowane
programowo wejście INT oraz
niemaskowane wejście NMI.
Przerwanie niemaskowane nie może być zablokowane przez programistę i jest
przyjmowane zawsze, gdy urządzenie peryferyjne go zażąda. Drugi rodzaj
przerwania, maskowane INT, jest zarezerwowane zwykle dla bardzo ważnych funkcji,
które programista możne selektywnie blokować lub odblokowywać. Dzięki temu
programista może zablokować to przerwanie w okresach, gdy jego program ma
ograniczenia czasowe nie pozwalające obsługiwać przerwań. W mikroprocesorze Z80
znajduje się przerzutnik flip-flop aktywacji obsługi przerwań
(IFF - Interrupt Flip-Flop), który jest ustawiany lub zerowany przez
programistę przy pomocy instrukcji EI
(Enable Interrupt -
włączenie obsługi przerwań) i DI
(Disable Interrupt -
wyłączenie obsługi przerwań). Gdy przerzutnik IFF jest wyzerowany,
mikroprocesor nie akceptuje przerwań INT.
Dwa przerzutniki flip-flop aktywacji obsługi przerwań IFF1 i IFF2.
IFF1 | IFF2 | ||
Wyłącza obsługę przerwań |
Tymczasowe miejsce przechowywania stanu IFF1 |
Stan przerzutnika IFF1 jest używany do blokowania obsługi przerwań, natomiast przerzutnik IFF2 wykorzystuje się jako tymczasowe miejsce pamiętania stanu przerzutnika IFF1.
Reset mikroprocesora wymusza wyzerowanie obu przerzutników IFF1 i
IFF2, co blokuje obsługę przerwań. Obsługę tę można w każdej chwili włączyć
programowo instrukcją EI
. Gdy instrukcja EI
jest w trakcie wykonywania, to nie
jest przyjmowane żadne aktywne przerwanie aż do momentu wykonania następnej po
EI
instrukcji. To opóźnienie jednej instrukcji jest konieczne, gdy następną
instrukcją jest instrukcja powrotu. Przerwania nie będą obsługiwane aż do
zakończenia wykonywania instrukcji powrotu. Instrukcja EI
ustawia oba
przerzutniki IFF1 i IFF2 na stan włączony. Gdy mikroprocesor przyjmuje
przerwanie maskowane, oba IFF1 i IFF2 zostają automatycznie wyzerowane, co
blokuje obsługę dalszych przerwań aż programista wyda nową instrukcję EI
. Zwróć
uwagę, iż we wszystkich poprzednich przypadkach IFF1 i IFF2 są zawsze równe.
Przeznaczeniem IFF2 jest przechowanie stanu IFF1, gdy pojawi się
przerwanie niemaskowane. Gdy zostanie ono zaakceptowane, IFF1 resetuje się w
celu zapobieżenia przyjmowaniu dalszych przerwań aż do ponownego włączenia ich
obsługi przez programistę. W ten sposób po przyjęciu przerwania niemaskowanego
przerwania maskowane są zablokowane, lecz poprzedni stan IFF1 został
zapamiętany, zatem kompletny stan mikroprocesora sprzed przerwania niemaskowanego można w każdej chwili przywrócić. Przy instrukcjach LD A,I
(Load Register A with Register I
- ładuj
akumulator A rejestrem przerwań I) oraz LD A,R
(Load
Register A with Register R
- ładuj akumulator A rejestrem
odświeżania R) stan przerzutnika IFF2 zostaje skopiowany do znacznika
parzystości, gdzie można go testować lub zapamiętywać.
Drugą metodą odtwarzania stanu IFF1 jest wykonanie instrukcji
RETN
(Return From Non-Mascable Interrupt
- powróć
z przerwania niemaskowanego). Instrukcja ta oznacza, iż procedura
obsługi przerwania niemaskowanego została zakończona i zawartość IFF2 jest teraz
kopiowana z powrotem do IFF1, aby stan tego przerzutnika został odtworzony
automatycznie z okresu przed przyjęciem przerwania niemaskowanego.
Tablica 1 jest podsumowaniem efektów różnych instrukcji na te dwa przerzutniki flip-flop.
Tablica 1. Przerzutniki flip-flop Włączania/Wyłączania Obsługi Przerwań
Operacja | IFF1 | IFF2 | Komentarz |
Reset mikroprocesora | 0 | 0 | Wyłączona obsługa przerwań maskowanych INT |
Wykonanie instrukcji DI |
0 | 0 | Wyłączona obsługa przerwań maskowanych INT |
Wykonanie instrukcji EI |
1 | 1 | W\łączona obsługa przerwań maskowanych INT |
Wykonanie instrukcji LD A,I |
* | * | IFF2 → Znacznik Parzystości |
Wykonanie instrukcji LD A,R |
* | * | IFF2 → Znacznik Parzystości |
Przyjęcie NMI | 0 | * | Wyłączona obsługa przerwań maskowanych INT |
Wykonanie instrukcji RETN |
IFF2 | * | IFF2 → IFF1 oznacza zakończenie procedury obsługi przerwania niemaskowanego |
Mikroprocesor zawsze akceptuje przerwanie niemaskowane. Gdy
wystąpi, mikroprocesor ignoruje następną, pobraną już instrukcję i zamiast niej
wykonuje restart od adresu 0066H
. Mikroprocesor działa tak, jakby wykonywał
instrukcję restartu, lecz do adresu innego, niż jeden z ośmiu programowych
adresów restartu. Restart jest jedynie wywołaniem podprogramu leżącego w
specyficznym obszarze strony 0 w pamięci.
Obsługa przerwania maskowanego przez mikroprocesor może być zaprogramowana do wykonywania w jednym z trzech możliwych trybów.
Ten tryb przypomina reakcję na przerwania mikroprocesora 8080A. W trybie 0 urządzenie przerywające może umieścić na magistrali danych dowolną instrukcję a mikroprocesor ją wykona. Zatem urządzenie przerywające dostarcza następnej instrukcji do wykonania. Często jest to instrukcja restartu, gdyż urządzenie przerywające musi w takim przypadku dostarczyć tylko jednobajtową instrukcję. Jednakże może zostać wykonana dowolna inna instrukcja, przykładowo 3-bajtowy skok do jakiejkolwiek lokacji w pamięci.
Liczba cykli zegarowych niezbędnych do wykonania tej instrukcji jest o dwa większa od normalnej liczby cykli dla tej instrukcji. Dzieje się tak z tego powodu, iż mikroprocesor automatycznie dodaje dwa stany oczekiwania do cyklu odpowiedzi na przerwanie, aby udostępnić wystarczająco dużo czasu na implementację sterowania zewnętrzną kolejką przerwań priorytetowych. Na rys.9 i rys.10 przedstawione są szczegółowe przebiegi czasowe przy odpowiedzi na przerwanie. Po zastosowaniu RESET mikroprocesor automatycznie wchodzi w Tryb 0.
Ten tryb jest wybierany przez programistę, mikroprocesor reaguje
na przerwanie przez wykonanie restartu od adresu 0038H
. Zatem reakcja jest
identyczna jak reakcja na przerwanie niemaskowane, z tą różnicą, iż adresem
wywoływanym jest 0038H
zamiast 0066H
. Liczba cykli wymaganych do wykonania
instrukcji restartu jest o dwa większa od normalnej z powodu dodanych dwóch
stanów oczekiwania.
Ten tryb jest najmocniejszym trybem reakcji na przerwanie. Za pomocą pojedynczego bajtu od użytkownika może zostać wykonane pośrednie wywołanie do dowolnego miejsca w pamięci.
W tym trybie programista tworzy tablicę 16-bitowych adresów
startowych dla każdej procedury obsługi przerwania. Tablica ta może być
umieszczona w dowolnym miejscu w pamięci. Gdy przerwanie zostanie przyjęte, musi
zostać utworzony 16-bitowy wskaźnik w celu pobrania z tej tablicy adresu
startowego pożądanej procedury obsługi przerwania. Górne osiem bitów tego
wskaźnika tworzy zawartość rejestru I. Rejestr I musi zostać załadowany
odpowiednią wartością przez programistę, np. instrukcją LD I,A
I
, aby był zainicjowany na 0.
Dolne osiem bitów wskaźnika musi przekazać urządzenie przerywające. Od
urządzenia tego wymagane jest tylko siedem bitów, ponieważ najmniej znaczący bit
będzie zawsze ustawiony na zero. Potrzebne dlatego, iż wskaźnik zostanie użyty
do pobrania dwóch sąsiednich bajtów, aby utworzyły kompletny 16-bitowy adres
procedury obsługującej to przerwanie, a adresy muszą zawsze być umieszczane w
pamięci na adresach parzystych.
Rys.16 Reakcja na przerwanie w trybie 2
Pierwszy bajt tablicy jest najmniej znaczącym (dolną połówką adresu). Programista musi wypełnić tę tablicę poprawnymi adresami przed przyjęciem jakiegokolwiek przerwania.
Programista może zmieniać zawartość tej tablicy umieszczając ją w RAM, co również pozwala na obsługiwanie tych samych urządzeń zewnętrznych przez różne procedury.
Gdy urządzenie przerywające dostarczy dolną część wskaźnika, mikroprocesor automatycznie umieszcza na stosie licznik programu, pobiera adres startowy z tablicy i wykonuje skok pod ten adres. Ten tryb reakcji wymaga 19 okresów zegara (siedem do pobrania dolnych 8 bitów od urządzenia przerywającego, sześć do zapisu licznika programu i sześciu do pobrania adresu skoku).
Urządzenia peryferyjne systemu Z80 posiadają łańcuchową strukturę priorytetów przerwań, która automatycznie przekazuje mikroprocesorowi zaprogramowany wektor podczas potwierdzenia przyjęcia obsługi przerwania. Więcej informacji na ten temat znajdziesz w Instrukcji Użytkownika dla Urządzeń I/O mikroprocesora Z80.
![]() |
Zespół Przedmiotowy |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.