interrupt

Interruzioni (Interrupt) 16F84
Come utilizzare il funzionamento ad
interrupt nel microcontrollore
16F84
Interrupt - P IC 16F84A
1. L’interrupt rappresenta un evento esterno al
microcontrollore che determina una interruzione
dell’esecuzione del main() del programma.
2. Quando si verifica questa particolare condizione
il programma “salta” alla cosiddetta ISR
(Interrupt Service Routine) ovvero routine di
servizio dell’interruzione.
3. Eseguita tutta la ISR l’esecuzione riprende dalla
istruzione del main che era stata interrotta.
Analogia con un fatto
quotidiano
Sto preparando
il pane
Squilla il telefono,
mi fermo e vado a rispondere
Riprendo la
preparazione del
pane dal punto in
cui mi sono
interrotto
Parlo al
telefono per
il tempo
necessario
Riaggancio la
cornetta
P erché si usano gli interrupt?
Accesso all’I/O in Polling
• Per effettuare la lettura di un dato si acquisisce
continuamente lo stato della periferica in attesa che il dato
risulti disponibile: nel caso di periferiche lente (stampante)
o pilotate direttamente dall'uomo (tastiera/mouse) l'attesa
del dato determina inevitabilmente una grave inefficienza.
E sempio del pulsante usato in ese
4
•
•
•
•
•
•
while(1)
{
while (RA2==0);
while (RA2==1);
i++;
PORTB=i;
•
}
//Attende il fronte di salita
/Attende il fronte di discesa
//Visualizzazione del valore
//sui led
Se premo il pulsante ogni secondo quante volte viene eseguita
l’istruzione while (RA2==0); fra una “pressione” e l’altra?
N.B. Supponiamo che while (RA2==0); venga eseguita in un ciclo
istruzione del microcontrollore (Fclock=8MHz)
Interrupt - P IC 16F84A
Accesso all’I/O a Interrupt
Il microcontrollore può effettuare le operazioni
all’interno del main() e quando si verifica
l’interrupt, ad esempio, leggere il dato che
arriva dalla stampante o da un pulsante.
Interrupt - P IC 16F84A
void main(void){
.....
….
K++;
J++;
PORTA=0;
….
}
1 INTERRUPT
2
void interrupt isr(void){
i++;
3
PORTB=i;
}
Sequenza eventi:
1. L’interruzione accade in corrispondenza dell’istruzione k++ del main.
2. Il programma salta alla isr e la esegue tutta.
3. L’esecuzione del main riprende dall’istruzione j++.
S alvataggio contesto attuale
1. Per far sì che tutto funzioni in modo corretto
quando il programma viene interrotto bisogna
salvare le condizioni del momento (contesto
attuale) e ripristinarlo quando finisce la ISR.
2. Questo modo di operare di una funzione in
termini informatici è detto “rientrante” (RETI).
Vettore interrupt periferiche
Il vettore di interruzione è alla locazione
0004h
P eriferiche che generano interrupt
nel 16F84A
Le sorgenti di interrupt sono 4:
• External RB0/INT pin
• TMR0 timer overflow
• PORTB<7:4> interrupt-on-change
• Data EEPROM write complete
N.B. Le sorgenti sono 4 ma la ISR è una sola.
Interrupt
Abilitazione e Flag
• La gestione software degli interrupt avviene:
1. Tramite un bit di abilitazione generale GIE che
permette l’abilitazione/disabilitazione di tutte le
interruzioni.
2. Mediante singoli bit di abilitazione INTE, RBIE,
(TOIE, EEIE) .
3. Mediante i Flag INTF, RBIF, (TOIF, EEIF).
4. Per l’interrupt su RBO/INT c’è anche il bit
INTEDG per decidere se attivarlo sul fronte di
discesa o di salita.
Funzionamento bit di Flag
•
•
•
Ciascuno dei 4 flag viene messo a 1 dal
microcontrollore quando la sorgente
corrispondente ha generato un’interruzione.
Ad es. se interrupt su RB0/INT  INTF=1.
oppure se interrupt è causato da un
cambiamento su RB7-RB4  RBIF=1
C ome viene usato il bit di Flag
dell’interruzione
1. All’interno della ISR per capire quale sorgente
ha generato l’interruzione.
2. Sempre all’interno della ISR per riabilitare
l’interruzione, ovvero il flag deve essere
riazzerato per abilitare successive interruzioni.
O verflow Timer 0
• Un overflow del timer 0, cioè un passaggio
• FFh  00 del registro TMR0, mette a 1 il
flag T0IF.
• L’interrupt può essere abilitato/disabilitato
mettendo a 1 o a 0 il bit T0IE.
INTE R R UP T S U R B0/INT
• L’interrupt viene generato quando in ingresso alla
linea RB0/INT arriva un fronte di salita o discesa.
• Se il bit INTEDG è a 1 l’ingresso è sensibile al
fronte di salita, viceversa con INTEDG=0 è
sensibile al fronte di discesa.
• L’interrupt può essere abilitato/disabilitato
mettendo a 1 o a 0 il bit INTE.
• Questo interrupt può “svegliare” il 16F84 da una
condizione di SLEEP.
C ambiamento stato R B 7-R B 4
• Un cambiamento di stato delle linee di
ingresso del porto B RB7, RB6, RB5 o RB4
causa il settaggio del flag RBIF.
• L’interrupt può essere abilitato/disabilitato
mettendo a 1 o a 0 il bit RBIE.
• N.B. Affinché la variazione sia riconosciuta
l’impulso deve durare almeno 1 Tcycle.
C ambiamento stato R B 7-R B 4
Nel data sheet del 16F84 viene specificato che per riazzerare
l’interrupt il programmatore nella ISR deve:
1. Effettuare una scrittura o lettura del PORTB.
2. Azzerare il bit di flag RBIF.
•
•
Questo tipo di interruzione inoltre può “svegliare” il 16F84
da una condizione di SLEEP.
Si raccomanda gli studenti di leggere almeno una volta la
parte del data-sheet dedicata a questo tipo di interrupt.
S crittura su E E P R O M
• Quando viene completato un ciclo di
scrittura dei dati sulla EEPROM del 16F84 il
bit di flag EEIF viene posto a 1.
• L’interrupt può essere abilitato/disabilitato
mettendo a 1 o a 0 il bit EEIE.
Registri per la gestione
interruzioni nel 16F84
Registri OPTION e INTCON
Registro Option Register: RB0/INT
Registro INTCON: abilitazioni
Abilitazioni
Registro INTCON: Flag
Flag
Interrupt on-change RB7-RB5
Come si dichiara la ISR
Per usare una funzione come ISR:
Prototipo/Dichiarazione:
void interrupt nome_funzione(void);
Definizione:
void interrupt nome_funzione(void){
....................
}
Pratico (programma funzionante
da non modificare)
•
Indentare in modo corretto il programma
• Commentare e Intestare in modo
adeguato il programma
• Usare il debugger: step into, step over,
step out, watch variabili, stopwatch
• Creazione stimulus tipo asincrono e clock