Tutorials - PIC18

 

Passare da PIC16 a PIC18

 


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:

  1. 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.
     
  2. Rinominare INT come INT0, INTF come INT0IF e INTE come INT0IE
     
  3. Cambiare la linea OPTION, NOT_RBPU con INTCON2, NOT_RBPU per escludere i weak pull up
     
  4. cambiare OPTION, INTEDG con INTCON2, INTEDG0

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 05/06/19.