Il ritorno dall' interrupt
Il ritorno dalle routine di interrupt avviene con la
classica istruzione RETFIE, indipendentemente si tratti di alta o bassa
priorità.
Rispetto ai mid-range, la famiglia
PIC18F ha come caratteristica il salvataggio automatico dei registri
principali WREG, STATUS e BSR se viene usata la modalità FAST
RETURN.
La chiamata di interrupt nei PIC18 salva
automaticamente i registri principali, cioè WREG, STATUS e BSR in un gruppo
di registri speciali non accessibili e, con la dichiarazione
retfie FAST
si ottiene il restore automatico dei registri salvati. Molto
comodo.
Questa possibilità esiste nel modo senza priorità e nel
modo con, dove, però, riguarda solamente l' alta priorità. Questo richiede
che eventuali salvataggi di registri per chiamate di interrupt a bassa
priorità siano a cura dell' utente, evitando confusioni con il salvataggio
e il restore automatico.
Se questo non
viene usato o si utilizza la doppia priorità, può rendersi necessario il
salvataggio di questi e di altri registri, come nell' esempio seguente; l'
istruzione MOVFF
permette l' allocazione diretta in qualsiasi banco:
;
save registers
MOVWF W_TEMP
; W_TEMP is in virtual bank
MOVFF STATUS, STATUS_TEMP
; STATUS_TEMP located anywhere
MOVFF BSR, BSR_TEMP
; BSR_TMEP located anywhere
; ....
; USER ISR CODE
; ....
; restore registers
MOVFF BSR_TEMP, BSR
; Restore BSR
MOVF W_TEMP,
W
; Restore WREG
MOVFF STATUS_TEMP,
STATUS ; Restore STATUS |
Breve
riassunto
Quanto visto si
può riassumere come segue :
-
le sorgenti
di interrupt nei PIC18F sono molteplici e si dividono in due famigli :
gli interrupt non-periferici (Timer0, PORTB change, External INT) e
quelli periferici (EUSART, MSSP, Timer 1,2 e 3, ecc).
-
nei PIC18F
esistono due livelli di priorità dell' interrupt, uno alto e uno basso;
ogni sorgente può essere assegnata ad un livello.
Esiste però un bit IPEN che determina a priori se si desidera o no il
doppio livello di priorità; infatti è possibile operare con un solo
livello, con compatibilità alla famiglia mid-range.
-
ad ogni
sorgente di interrupt sono associati tre bit :
- un bit xxxIE che abilita o disabilita la funzione
- un bit xxxIF che va a 1 quando l'interrupt relativo viene attivato .
Questo bit va cancellato via
software
- un bit xxxIP che assegna alla sorgente di interrupt una delle due
priorità
-
come per i
PIC mid-range, l' aver abilitato il singolo interrupt richiede ancora di
abilitare un bit GIE che attiva la globalità degli interrupt presenti.
Se sono impegnati interrupt periferici occorre abilitare anche il bit
PEIE.
Dato che la struttura prevede il doppio livello di priorità, nel caso
esso sia scelto, si ha uno sdoppiamento del bit GIE in GIEH che abilita
globalmente gli interrupt programmati ad alta priorità e un GIEL che
abilita globalmente gli interrupt a bassa priorità.
-
I flag IF
vanno azzerati a cura dell' utente dopo aver servito l' interrupt (e,
per sicurezza, prima di abilitare la sorgente)