System przerwań

System przerwań (ang. interrupt system) mikrokomputera 8048 może obsługiwać dwa zgłoszenia:
- przerwanie zewnętrzne (podawane na wejście /INT),
- przerwanie z układu czasowo-licznikowego.

Wyższy priorytet ma przerwanie zewnętrzne - to ono będzie przyjęte jako pierwsze w przypadku jednoczesnego zgłoszenia obu przerwań. System jest jednopoziomowy - w czasie wykonywania programu obsługi przerwania nie jest przyjmowane nowe zgłoszenie. Każde z przerwań może być indywidualnie maskowane. Po wyzerowaniu mikrokomputera oba przerwania są zamaskowane (system przerwań jest wyłączony). Przerwania włącza się następującymi rozkazami: EN I - włączenie przerwań zewnętrznych, EN TCNTI - włączenie przerwań z układu czasowo- licznikowego.

Zamaskowanie przerwań następuje w wyniku wykonania rozkazów:
DIS I - wyłączenie przerwań zewnętrznych,
DIS TCNTI - wyłączenie przerwań z układu czasowo-licznikowego.

W czasie przyjęcia przerwania przez procesor są wykonywane następujące czynności:
- zablokowanie systemu przerwań,
- zapisanie na stosie zawartości licznika rozkazów PC i czterech bardziej znaczących bitów stanu PSW,
- wpisanie do licznika rozkazów adresu początku programu obsługi przerwania:
03 - dla przerwania zewnętrznego,
07 - dla przerwania z układu czasowo-licznikowego.

Odblokowanie systemu przerwań następuje w wyniku wykonania rozkazu powrotu z przerwania (RETR), którym powinien kończyć się program obsługi - zostaje wtedy zdjęty ze stosu stan licznika rozkazów i słowo stanu. Przed wykonaniem rozkazu powrotu - RETR - nie zostaje przyjęte żadne zgłoszenie przerwania. Na rysunku pokazano schemat logiczny systemu przerwań:

Przerwanie zewnętrzne jest zgłaszane przez podanie stanu niskiego na wejście /INT, który musi trwać przez co najmniej trzy cykle maszynowe. Stan wejścia przerywającego /INT jest próbkowany (wpisywany do przerzutnika INTR) podczas ostatniego cyklu maszynowego każdego rozkazu. Jeśli przerwania zewnętrzne są otwarte (zapalony przerzutnik INTE) oraz w danej chwili nie jest obsługiwane inne przerwanie (zgaszony przerzutnik IP), to wpisanie zera do przerzutnika INTR powoduje zapalenie przerzutnika IP (zablokowanie przerwań) i wpisanie jedynki do IR. Oznacza to, że po zakończeniu bieżącego cyklu maszynowego są wykonywane wymienione wyżej czynności przyjęcia przerwania zewnętrznego. Podczas obsługi przerwania (przy zapalonym IP) próbkowanie wejścia /INT jest zablokowane do chwili wykonania rozkazu RETR, zerującego przerzutnik IP. Kolejne sprawdzenie stanu wejścia przerywającego nastąpi w czasie drugiego cyklu maszynowego rozkazu RETR. Zgłoszenie przerwania zewnętrznego (stan niski na wejściu /INT) musi zniknąć podczas wykonywania programu obsługi - przed wykonaniem rozkazu RETR; w przeciwnym bowiem razie zgłoszenie zostanie przyjęte ponownie. Ponieważ nie jest wytwarzany zewnętrzny sygnał potwierdzenia przyjęcia przerwania, skasowanie zgłoszenia musi być dokonane programowo - w programie obsługi.

Przerwanie wewnętrzne z układu czasowo-licznikowego jest zgłaszane przez sygnał przepełnienia licznika. Jeśli przerwania z układu czasowo-licznikowego są otwarte (zapalony przerzutnik TCNTE), to sygnał przepełnienia zapala przerzutnik zgłoszenia TCNTR. Jeśli w danej chwili nie jest obsługiwane inne przerwanie (IP=0) oraz nie ma zgłoszenia przerwania zewnętrznego (INTR=0), to zostaje zapalony przerzutnik IP (zablokowanie przerwań) i wyzerowany IR. Oznacza to, że po zakończeniu bieżącego cyklu maszynowego zostaną wykonane znane czynności przyjęcia przerwania wewnętrznego. Jeśli przerzutnik zgłoszenia TCNTR zostanie zapalony w czasie, gdy IP=1, to zgłoszenie będzie przyjęte natychmiast po wykonaniu rozkazu RETR, kończącego obsługę poprzedniego przerwania (o ile nie będzie zgłoszenia przerwania zewnętrznego).

Należy zwrócić uwagę, że przy wyłączonych przerwaniach z układu czasowo-licznikowego pojawienie się sygnału przepełnienia licznika nie powoduje zapalenia przerzutnika zgłoszenia TCNTR. Niewskazane jest zatem wyłączanie przerwań wewnętrznych we fragmentach programu głównego w celu uczynienia go nieprzerywalnym. Jeśli przepełnienie licznika nastąpi podczas zablokowania przerwań, to przerwanie nie zostanie zgłoszone.

Powrót