Gli interrupt dell' 8051

L' 8051 prevede cinque sorgenti di interruzione distinte. Solo due linee di richiesta interruzione sono messe a disposizione dell'utente (INT0 e INT1). Le altre tre sorgenti di interruzione sono il timer 0, il timer 1 e I'interfaccia seriale.  

In figura sono schematizzati i vari blocchi di controllo che gestiscono i segnali di interruzione:

(La posizione a riposo degli interruttori corrisponde allo zero del Bit che li pilota)

Gli interrupt esterni possono essere attivi o sul fronte o sul livello, a seconda del valore impostato nei bit ITO e IT1 del registro TCON (si veda la parte relativa ai timer).

Se un'interruzione viene generata da una transizione, il flag corrispondente viene settato (TF0, TF1 per i timer, IE0 e IEI per gli interrupt esterni, si veda ancora la parte relativa ai timer) per poi essere automaticamente posto a 0 quando il salto al relativo sottoprogramma di gestione viene portato a termine.
Se l'interruzione è stata attivata sul livello, allora il flag viene controllato direttamente dalla sorgente richiedente.

L'interruzione generata dalla porta seriale viene ottenuta dall'or fra i due flag TI e RI (si veda la parte relativa alla porta seriale) .
Quando si ha il salto al sottoprogramma di gestione, nessuno dei due flag viene azzerato
. Ciò permette al sottoprogramma di gestione di stabilire se l'interruzione è stata generata dal flag TI oppure RI.

Tutti i bit che generano un'interruzione possono essere modificati via software. Ciò permette di generare interruzioni software oppure cancellare interruzioni non ancora servite

Ogni sorgente di interruzione può essere abilitata o disabilitata a generare I'interruzione. Per far questo 1'8051 mette a disposizione un registro di mascheramento (IE) interruzioni.

La struttura del registro IE è la seguente:

EA -- -- ES ET1 EX1 ET0 EX0

(1=abilitato; 0=disabilitato)

EA (IE.7): abilitazione e disabilitazione generale delle interruzioni.

ES (IE.4) : bit di abilitazione interruzione per la porta seriale.

ET1 (IE.3) : bit di abilitazione interruzione per il timer 1.

EX1 (IE.2) : bit di abilitazione interruzione esterna INTI.

ETO (IE.1): bit di abilitazione interruzione per il timer 0.

EXO (IE.0): bit di abilitazione interruzione esterna INT0.

A ciascuna sorgente di interruzione è possibile associare uno fra i due livelli di priorità gestiti da11'8051.

La priorità di ciascuna sorgente di interruzione viene memorizzata in un apposito registro di priorità (IP):

- - - PS PT1 PX1 PT0 PX0

PS, PT1, PX1, PT0 e PX0 (IP.4 - IP.0): rappresentano rispettivamente le priorità delle sorgenti di interruzione porta seriale, timer 1, interruzione esterna INT1, timer 0 e interruzione esterna INT0.

La priorità viene attivata settando il bit relativo al segnale.
La priorità di un segnale fa sì che il microprocessore possa rispondere alla richiesta di interruzione anche mentre stà eseguendo un servizio di interruzione. Naturalmente si deve trattare di un servizio di interruzione chiamato da un segnale senza priorità attivata.

Il microprocessore, sempre durante l'esecuzione di una routine di servizio, non può rispondere a una richiesta di interruzione che abbi la stessa priorità di quella che sta servendo.

Se due interruzioni a medesima priorità pervengono contemporaneamente, mentre il micro sta eseguendo un normale programma, una sequenza interna di polling decide quale deve essere asservita:

  1. INTO
  2. Timer 0
  3. INT1
  4. Timer 1
  5. Porta seriale

Quando un'interruzione viene riconosciuta, 1'8051 effettua una LCALL ad uno dei seguenti indirizzi della memoria dei programmi solo se l'istruzione in corso è diversa da RETI e da un'istruzione che modifica il contenuto dei registri IP ed EI:

Indirizzo di salto Sorgente interruzione Indirizzo di memoria scheda DB8051
0003H(3) INTO 80A1H
000BH(11) Timer0 80A4H
0013H (19) INT1 80A7H
001BH(27) Timerl 80AAH
0023H (35) Porta seriale 80ADH

Si noti che tra un indirizzo di salto e l'altro vi sono a disposizione 8 byte. Se il sottoprogramma di gestione occupa uno spazio minore o uguale ad 8 byte può essere inserito direttamente tra l'indirizzo di salto e il successivo. I1 sottoprogramma deve terminare con un'istruzione RETI. L'istruzione RETI si differenzia dall'istruzione RET semplicemente per il fatto che RETI informa la CPU che il sottoprogramma di gestione interruzione è terminato ed è quindi possibile accettare ulteriori richieste di interruzione. Dal punto di vista dell'utilizzo dello stack (recupero dell'indirizzo di ritorno) RET e RETI si comportano in modo identico.

Nel caso si utilizzi la scheda emulatore DB8051 siccome non è possibile scrivere in Eprom per associare la routine di servizio al segnale richiedente basta immettere nella cella di memoria RAM indicata l'indirizzo di partenza della subroutine di servizio.

Esempio:

il servizio di interruzione per INT1 di trova alla 8500h

MOV DPTR,#80A7H
MOV A,#85H
MOVX @DPTR,A
INC DPTR
MOV A,#00
MOVX @DPTR,A