Dĺžka impulzu prerušenia i8080

Z PMD 85 Infoserver

Dĺžka impulzu prerušenia i8080

Mikroprocesor i8080 poskytuje maskovateľné prerušenie, čo mu umožňuje spracovávať asynchrónne udalosti, ktoré prichádzajú "zvonku". K tomu slúži vstupný pin INT mikroprocesora, ktorý je citlivý na úroveň H.

Mikroprocesor testuje INT v dvoch prípadoch:

  • po ukončení aktuálne vykonávanej inštrukcie
  • ak je μP v stave HALT, teda po vykonaní inštrukcie HLT

V oboch prípadoch je prerušenie akceptované iba v prípade, že je prerušenie povolené inštrukciou EI.

Signál INT nie je testovaný v dvoch prípadoch:

  • ak je μP v stave NOT READY - vstupný pin READY je na úrovni L - využívalo sa obvykle pri pomalých pamätiach, ktoré potrebovali väčší čas na vystavenie/spracovanie dát na zbernici
  • ak je μP v stave HOLD - rovnomenný vstupný pin HOLD je na úrovni H - využíva sa pre DMA

Ak μP zaregistruje požiadavku na prerušenie a zároveň je prerušenie povolené, μP potvrdzuje túto požiadavku vyslaním stavového slova INTERRUPT ACKNOWLEDGE. V prípade, že je ako budič zbernice použitý obvod i8228 (tiež prípad PMD 85), tak je požiadavka na prerušenie potvrdzovaná signálom -INTA. Obvod, ktorý prerušenie vyvolal, musí počas aktivity signálu -INTA dodať na zbernicu kód inštrukcie, ktorá prerušenie "spracuje" (obvykle je to jedna z Restart inštrukcií RST x). i8228 umožňuje pripojením signálu -INTA na pull-up +12V zabezpečiť automatické dodanie inštrukcie RST 7.

Aby bolo prerušenie akceptované, musí byť, okrem vyššie uvedeného, splnená ešte jedna dôležitá podmienka. Prerušovací impulz na pine INT musí trvať dostatočnú dobu a zároveň by tento impulz nemal byť príliš dlhý.

Ak nie je μP v stavoch HALT, HOLD a NOT READY, tak je pin INT testovaný počas posledného taktu inštrukčného cyklu. Teoreticky by teda stačilo, aby mal prerušovací impulz dĺžku jedného taktu procesora (≈ 0,5μs). To by ale znamenalo, že by tento impulz musel prísť vždy presne na konci inštrukcie, čo je aj vzhľadom na rôzne trvanie jednotlivých inštrukcií prakticky nemožné. Prerušenie je asynchrónna udalosť a tak môže prísť kedykoľvek, aj uprostred vykonávania inštrukcie. Takýto krátky impulz by bol v tomto prípade vlastne "ignorovaný", čo je nežiadúce.

Prerušovací impulz by mal byť teda aspoň taký dlhý, aby bol akceptovaný, ak by prišiel počas vykonávania ktorejkoľvek inštrukcie. Z toho plynie, že by mal mať dĺžku aspoň ako najdlhšie trvajúca inštrukcia. Tou je inštrukcia XTHL, ktorá trvá 18T a to je ≈ 9μs.

Dĺžka prerušovacieho impulzu by zároveň nemala byť príliš dlhá, pretože by mohlo dôjsť k opätovnému vyvolaniu prerušenia pokiaľ by impulz neskončil pred opätovným povolením prerušenia.

Majme kód, ktorý využíva prerušenie iba na presné časovanie. Prerušenie je vyvolávané pravidelne napr. každých 20ms.

; Hlavná slučka programu.
      EI          ; povol prerušenie
Loop: HLT         ; čakaj na prerušenie
      ...         ; pravidelne vykonávaný kód
      ...
      JMP Loop    ; návrat do slučky

; Rutina obsluhy prerušenia. Vyvolanie prerušovacej rutiny je pomocou
; inštrukcie RST 7 (viď. vyššie), ktorá trvá 11T.
Intr: EI         ;  4T
      RET        ; 10T

Rutina obsluhy prerušenia v tomto prípade nerobí nič, iba opätovne povolí prerušenie (ktoré bolo zakázané automaticky pri akceptovaní prerušenia) a prevedie návrat z tejto rutiny. Pomocou inštrukcie HLT sa čaká na prerušenie. Po akceptovaní prerušenia, trvá obsluha prerušenia minimálne 1+11+4+10=26T a to je ≈ 12,7μs. Ak by mal prerušovací impulz dĺžku väčšiu, ihneď po inštrukcii RET, by bolo prerušenie opäť vyvolané.

Prerušovací impulz by mal teda mať dĺžku asi 9μs až 12,5μs. Ak je využívaný mechanizmus pozastavovania procesora pomocou signálov READY alebo HOLD, tak by mala byť dĺžka prerušovacieho impulzu predĺžená pomerne k dobe pozastavovania.