Pubblicità

Un interrupt è un segnale al processore emesso da hardware o software che indica un evento che richiede attenzione immediata. Ogni volta che si verifica un interrupt, il controller completa l’esecuzione dell’istruzione corrente e inizia l’esecuzione di una Interrupt Service Routine (ISR) o Interrupt Handler. L’ISR dice al processore o al controller cosa fare quando si verifica l’interrupt. Gli interrupt possono essere sia hardware che software.

Hardware Interrupt

Un interrupt hardware è un segnale elettronico di avviso inviato al processore da un dispositivo esterno, come un controller di disco o una periferica esterna. Per esempio, quando premiamo un tasto sulla tastiera o muoviamo il mouse, si attivano degli interrupt hardware che fanno sì che il processore legga la pressione del tasto o la posizione del mouse.

Interrupt software

Un interrupt software è causato da una condizione eccezionale o da un’istruzione speciale nel set di istruzioni che causa un interrupt quando viene eseguita dal processore. Per esempio, se l’unità logica aritmetica del processore esegue un comando per dividere un numero per zero, per causare un’eccezione divide per zero, causando così che il computer abbandoni il calcolo o mostri un messaggio di errore. Le istruzioni di interruzione software funzionano in modo simile alle chiamate di subroutine.

Che cos’è il polling?

Lo stato di monitoraggio continuo è noto come polling. Il microcontrollore continua a controllare lo stato di altri dispositivi; e mentre lo fa, non fa altre operazioni e consuma tutto il suo tempo di elaborazione per il monitoraggio. Questo problema può essere affrontato usando gli interrupt.

Nel metodo dell’interrupt, il controller risponde solo quando si verifica un’interruzione. Così, il controllore non è tenuto a monitorare regolarmente lo stato (bandiere, segnali ecc.) dei dispositivi interfacciati e incorporati.

Interrupts v/s Polling

Ecco un’analogia che differenzia un interrupt dal polling –

Interrupt Polling
Un interrupt è come un negoziante. Se uno ha bisogno di un servizio o di un prodotto, va da lui e lo informa dei suoi bisogni. Nel caso degli interrupt, quando le bandiere o i segnali vengono ricevuti, essi notificano al controllore che hanno bisogno di essere serviti. Il metodo del polling è come un venditore. Il venditore va di porta in porta chiedendo di comprare un prodotto o un servizio. Allo stesso modo, il controllore continua a monitorare le bandiere o i segnali uno per uno per tutti i dispositivi e fornisce il servizio a qualsiasi componente che ha bisogno del suo servizio.

Interrupt Service Routine

Per ogni interrupt, ci deve essere un interrupt service routine (ISR), o gestore di interrupt. Quando si verifica un interrupt, il microcontrollore esegue l’interrupt service routine. Per ogni interrupt, c’è una posizione fissa in memoria che contiene l’indirizzo della sua interrupt service routine, ISR. La tabella delle locazioni di memoria messe da parte per tenere gli indirizzi degli ISR è chiamata Interrupt Vector Table.

Esecuzione dei programmi

Interrupt Vector Table

Ci sono sei interrupt incluso RESET nell’8051.

Interruzioni Localizzazione ROM (Hex) Pin
Interruzioni Localizzazione ROM (HEX)
Com seriale (RI e TI) 0023
Timer 1 interrupts(TF1) 001B
External HW interrupt 1 (INT1) 0013 P3.3 (13)
Interruzione HW esterna 0 (INT0) 0003 P3.2 (12)
Timer 0 (TF0) 000B
Reset 0000 9
  • Quando il pin di reset viene attivato, l’8051 salta alla posizione di indirizzo 0000. Questo è il reset all’accensione.

  • Due interrupts sono impostati per i timer: uno per il timer 0 e uno per il timer 1. Le posizioni di memoria sono rispettivamente 000BH e 001BH nella tabella degli interrupt vector.

  • Due interrupt sono riservati agli interrupt hardware esterni. I pin 12 e 13 della porta 3 sono rispettivamente per gli interrupt hardware esterni INT0 e INT1. Le posizioni di memoria sono rispettivamente 0003H e 0013H nella tabella degli interrupt vector.

  • La comunicazione seriale ha un singolo interrupt che appartiene sia alla ricezione che alla trasmissione. La posizione di memoria 0023H appartiene a questo interrupt.

Passi per eseguire un interrupt

Quando un interrupt si attiva, il microcontrollore passa attraverso i seguenti passi –

  • Il microcontrollore chiude l’istruzione in esecuzione e salva l’indirizzo della prossima istruzione (PC) sullo stack.

  • Salva anche lo stato attuale di tutti gli interrupt internamente (cioè, non sullo stack).

  • Salta alla posizione di memoria della tabella degli interrupt vector che contiene l’indirizzo della routine di servizio degli interrupt.

  • Il microcontrollore ottiene l’indirizzo dell’ISR dalla tabella degli interrupt vector e vi salta. Inizia ad eseguire la subroutine di servizio d’interruzione, che è RETI (return from interrupt).

  • Eseguendo l’istruzione RETI, il microcontrollore ritorna alla posizione in cui è stato interrotto. Per prima cosa, ottiene l’indirizzo del contatore di programma (PC) dallo stack facendo un popping dei byte superiori dello stack nel PC. Poi, inizia l’esecuzione da quell’indirizzo.

Edge Triggering vs. Level Triggering

I moduli di interruzione sono di due tipi – level-triggered o edge-triggered.

Level Triggered Edge Triggered
Un modulo di interrupt a livello genera sempre un interrupt ogni volta che il livello della sorgente di interrupt è affermato. Un modulo di interrupt edge-triggered genera un interrupt solo quando rileva un bordo affermato della sorgente di interrupt. Il bordo viene rilevato quando il livello della sorgente di interrupt cambia effettivamente. Può anche essere rilevato dal campionamento periodico e rilevare un livello asserito quando il campione precedente è stato de-asserito.
Se la sorgente di interrupt è ancora asserita quando il gestore di interrupt del firmware gestisce l’interrupt, il modulo di interrupt rigenererà l’interrupt, causando l’invocazione di nuovo del gestore di interrupt. I moduli di interrupt edge-triggered possono essere agiti immediatamente, non importa come si comporta la sorgente di interrupt.
Gli interrupt attivati dal bordo sono ingombranti per il firmware. Gli interrupt attivati dal bordo mantengono bassa la complessità del codice del firmware, riducono il numero di condizioni per il firmware e forniscono più flessibilità quando gli interrupt sono gestiti.

Abilitazione e disabilitazione di un interrupt

Al reset, tutti gli interrupt sono disabilitati anche se sono attivati. Gli interrupt devono essere abilitati via software affinché il microcontrollore risponda a questi interrupt.

Il registro IE (interrupt enable) è responsabile dell’abilitazione e disabilitazione dell’interrupt. IE è un registro bit-indirizzabile.

Registro di abilitazione degli interrupt

EA ET2 ES ET1 EX1 ET0 EX0
  • EA – Attiva/disattiva globale.

  • – – Non definito.

  • ET2 – Abilita l’interrupt del timer 2.

  • ES – Abilita l’interrupt della porta seriale.

  • ET1 – Abilita l’interrupt del timer 1.

  • EX1 – Abilita interrupt esterno 1.

  • ET0 – Abilita interrupt Timer 0.

  • EX0 – Abilita interrupt esterno 0.

Per abilitare un interrupt, facciamo i seguenti passi –

  • Il bit D7 del registro IE (EA) deve essere alto per permettere al resto del registro di avere effetto.

  • Se EA = 1, gli interrupt saranno abilitati e risponderanno, se i loro bit corrispondenti in IE sono alti. Se EA = 0, nessun interrupt risponderà, anche se i loro pin associati nel registro IE sono alti.

Priorità degli interrupt nell’8051

Possiamo modificare la priorità degli interrupt assegnando la priorità più alta a uno qualsiasi degli interrupt. Questo viene realizzato programmando un registro chiamato IP (priorità di interrupt).

La figura seguente mostra i bit del registro IP. Al reset, il registro IP contiene tutti 0. Per dare una priorità più alta a uno qualsiasi degli interrupt, rendiamo alto il bit corrispondente nel registro IP.

PT1 PX1 PT0 PX0
IP.7 Non implementato.
IP.6 Non implementato.
IP.5 Non implementato.
IP.4 Non implementato.
PT1 IP.3 Definisce il livello di priorità dell’interrupt del Timer 1.
PX1 IP.2 Definisce il livello di priorità dell’interrupt esterno 1.
PT0 IP.1 Definisce il livello di priorità dell’interrupt del timer 0.
PX0 IP.0 Definisce il livello di priorità dell’Interrupt 0 esterno.

Interrupt inside Interrupt

Cosa succede se l’8051 sta eseguendo un ISR che appartiene a un interrupt e un altro si attiva? In questi casi, un interrupt ad alta priorità può interrompere un interrupt a bassa priorità. Questo è noto come interrupt inside interrupt. In 8051, un interrupt a bassa priorità può essere interrotto da un interrupt ad alta priorità, ma non da un altro interrupt a bassa priorità.

Interrompere un interrupt via software

Ci sono momenti in cui abbiamo bisogno di testare un ISR tramite simulazione. Questo può essere fatto con le semplici istruzioni per impostare l’interrupt alto e quindi causare il salto dell’8051 alla tabella dei vettori di interrupt. Per esempio, impostate il bit IE a 1 per il timer 1. Un’istruzione SETB TF1 interromperà l’8051 in qualsiasi cosa stia facendo e lo costringerà a saltare alla tabella degli interrupt vector.

Pubblicità