INTERRUPT
I PIC enhanced dispongono di un sistema di interrupt a due livelli di
priorità, ma, per default, la gestione è a livello singolo ed è quindi
compatibile con quella dei mid-range.
Quindi, non evvettuando variazioni nel configuratore iniziale, la struttura
dell' interrupt è analoga; si potrà portare al doppio livello solamente
attraverso una linea opportuna nel CONFIG.
Ci sono però alcune variazioni nelle funzioni.
Pin di Interrupt esterno e relativi registri
Come per alcuni mid range, RB0 ha funzione di chiamata di interrupt da
segnale esterno e negli enhanced è rinominato come INT0, dato che esiste la
possibilità di attivare la stessa funzione sui pin RB1 e RB2, che sono
chiamati per questo INT1 e INT2.
Nel registro INTCON i bit INTE e INTF sono rinominati come INT0IE e INT0IF.
Nel registro INTCON2 sono aggiunti i bit di controllo del fronte di
attivazione dell' interrupt per INT0, 1, e 2.
INTCON2 contiene anche la priorità di interrupt di Timer0 e PORTB (interrupt
on change), come pure il controllo dei pull up del port B.
L' attivazione di INT1 e INT2 è stata posta nel registro INTCON3 e i
relativi flag e selezione della priorità. Quindi, se questi ingressi non sono
usati, non creano problemi di compatibilità.
In sostanza, se non si effettua una specifica programmazione al reset, per
default è implementato il modo ad un solo livello di priorità, del tutto
compatibile con i PIC16 (salvo il diverso posizionamento del vettore di
interrupt).
I bit di abilitazione degli interrupt si trovano nel registro PIEx, i flag
nel registro PIRx e il controllo della priorità nel registro IPIRx, che non
esiste nei mid-range.
Per quanto riguarda la priorità dell' interrupt, il controllo avviene con
il bit IPEN, RCON<7> (Interrupt Priority Enable) che al POR è a 0 e
quindi, se non alterato, origina la compatibilità ad un solo livello.
Da notare che il meccanismo di priorità è il seguente:
- una interruzione a priorità alta non viene interrotta da una altra
richiesta di interruzione; i flag restano settati fino a cancellazione
da programma, così da poter mantenere presenti le chiamate avvenute
durante l'interruzione. In questo senso il funzionamento della priorità
alta è del tutto analoga a quello dell'interrupt singolo dei PIC16
- una interruzione a priorità bassa può essere interrotta da una
richiesta a priorità alta.
Se si intende sfruttare il doppio livello, occorre documentarsi
sufficientemente sulle manovre necessarie, dato che vengono apportati
sostanziali cambiamenti alla gestione. In breve:
- Quando IPEN = 1 le funzioni di GIE, INTCON<7> e PEIE,
INTCON<6> vengono modificate.
Con interrupt ad un solo livello, GIE è l' abilitazione generale dell'
interrupt, mentre PEIE solo quella degli interrupt periferici.
Nella doppia priorità GIE diventa GIEH e abilita tutti gli interrupt,
mentre PEIE diventa GIEL ed abilita gli interrupt a basso livello. Si
viene così a formare una differenza non tra interrupt globale e interrupt
periferici, ma tra interrupt globale e interrupt a basso livello di
priorità, che richiede una piccola revisione della filosofia di approccio.
- Ogni sorgente di interrupt ha associato un bit che permette di gestirla
a bassa o alta priorità.
Se il bit di controllo della priorità è a 1, all' interrupt viene
assegnato il livello superiore e viceversa.
La gestione a doppia priorità genera un secondo vettore di interrupt a
0018h di cui bisognerà tenere conto.
Se una sorgente di interrupt ha il flag nel bit x di PIR1 o PIR2, il
corrispondente bit x di IPIR1 o IPIR2 sarà l' indicatore del livello di
priorità e il corrispondente bit x dei registri PIE1 p o PIE2 sarà l'
abilitazione.
- Le priorità non contenute in questi registri si ritrovano in INTCON2 e
INTCON3.
Timer0 e RBIF hanno il settaggio in TMR0IP, INTCON2<2> e RBIP,
INTCON<2>. Così pure i controlli di INT1 e INT2, che si trovano in
INTCON3
Azione
Il passaggio da mid-range a 18F richiede di:
- cambiare il vettore di interrupt da 0004h a 008h. Dato che non esiste
priorità nei mid-renge e INT0 è sempre a priorità alta, il vettore di
bassa priorità a 0018h può essere ignorato.
- Rinominare INT come INT0, INTF come INT0IF e INTE come INT0IE
- Cambiare la linea OPTION, NOT_RBPU con INTCON2, NOT_RBPU per escludere i
weak pull up
- cambiare OPTION, INTEDG con INTCON2, INTEDG0
|
|