Tutorials - PIC18 by Data Sheet

 

Pagina 54-72

 


 

I vettori

Nella memoria programma (User Memory Space) dobbiamo rilevare alcuni punti salienti:

  • il vettore di RESET, posizionato all' indirizzo 0000h
     

  • Il vettore di Interrupt ad Alta Priorità (High Priority Interrupt Vector), posizionato a 0008h
     

  • Il vettore di Interrupt a Bassa Priorità (Low Priority Interrupt Vector), posizionato a 0018h
     

  • L' area della Memoria Programma vera e propria, che nwelle immagini qui sopra arriva rispettivamente a 0FFFh e 1FFFh.

 


AVVERTENZA:

Il resto della memoria indirizzabile, che arriva fino a 1FFFFFh, negli esempi qui sopra non è implementata. E in generale, la quantità di memoria programma disponibile varia a seconda del modello di PIC, avendo comunque un' area non implementata (in grigio negli schemi).. 

Cercando di accedere all' area non implementata si ottiene che:

  • in scrittura, il dato scritto va perduto
  • e in  lettura, riporta sempre il valore 00h.

Inserire nel sorgente operazioni nell' area di memoria non implementata può non produrre errori segnalati nell' assemblaggio. Quindi occorre un minimo di controllo sulle disponibilità di memoria del processore che si sta usando.

 

Come detto, si tratta di memoria in tecnologia Flash, che conserva i dati scritti anche in mancanza di tensione di alimentazione, per un periodo che il costruttore dichiara di almeno 100 anni.

E' da notare che i vettori di RESET e degli INTERRUPT non sono strettamente consecutivi, ma sono distanziati tra di loro in modo da riservare alcuni bytes.

 

  • Tra il vettore di RESET e quello dell' Interrupt HP sono disponibili 8 bytes.
  • tra quello dell' Interrupt HP  e quello dell' Interrupt LPsono disponibili 16 bytes.
  • il vettore dell' interrupt LP confina direttamente con il resto della memoria programma


Ovvero:

  • Tra il vettore di RESET e quello dell' Interrupt HP sono inseribili 2 istruzioni a due bytes e una a 4 bytes

  • Tra quello dell' Interrupt HP  e quello dell' Interrupt LPsono inseribili 6 istruzioni a due bytes e una a 4 bytes

  • Dal vettore dell' Interrupt LP in avanti non ci sono altri punti salienti.

Questo spazio servirà per inserire istruzioni di salto alle routines di gestione degli eventi.

Va però ben compreso questo meccanismo dei vettori, per evitare confusioni o interpretazioni errate.

Vettore di RESET:

La locazione 0000h viene forzata nel PC al momento del RESET. Questo fa si che la prima istruzione che verrà eseguita è quella posta in questa locazione e da questa partirà la sequenza delle istruzioni che compongono il programma.

Questa situazione è comune a tutti i sistemi a microprocessore e, in generale, a tutti i sistemi che eseguono un programma, anche se in altri componenti il vettore potrà trovarsi posizionato in altre aree della memoria.

Dunque, a 0000h inizierà il programma. Il vettore di RESET, dunque, è un elemento indispensabile, di cui non si può fare a meno.

Esso si trova nella memoria programma, scrivibile dall' utente, proprio perchè ha a che fare con la sequenza delle istruzioni che vengono inserite con il dispositivo di programmazione nella memoria del chip.

 

Vettore Interrupt ad Alta Priorità (HP)

L' indirizzo 0008h viene forzato nel PC quando è operativa una chiamata interrupt a priorità alta, oppure senza priorità. Questo fa si che il flusso del programma sia interrotto e che riparta dall' istruzione posta in questa locazione. 
L' indirizzo successivo a quello abbandonato al momento dell' interrupt sarà salvato nello Stack e ricaricato in PC all' istruzione RETFIE, ripristinando la sequenza principale.

Altri microprocessori hanno vettori di interrupt più complessi, ma anche questa situazione è comune a tutti i sistemi computerizzati, in quanto è necessario che l' evento di interrupt trovi subito una gestione sicura. 

Dunque, a 0008h inizierà il programma di gestione dell' interrupt HP.  Dato che è possibile programmare se si intende utilizzare la priorità o meno, nel caso di interrupt senza priorità, il vettore di Interrupt è ancora 0008h.

Esso si trova nella memoria programma, scrivibile dall' utente, proprio perchè ha a che fare con la sequenza delle istruzioni che vengono inserite con il dispositivo di programmazione nella memoria del chip.
Però va anche considerato che l' interrupt può non essere utilizzato dal programma e quindi un vettore interrupt può non essere necessario.

 

Vettore Interrupt a Bassa Priorità (LP)

L' indirizzo 0018h viene forzato nel PC quando è operativa una chiamata interrupt a priorità bassa (e non viene considerato nel caso in cui si sia selezionata una modalità di funzionamento con interrupt senza priorità). 
Questo fa si che il flusso del programma sia interrotto e che riparta dall' istruzione posta in questa locazione quando il discriminatore della sorgente di interrupt identifica un interrupt a bassa priorità. 

Dunque, a 0018h inizierà il programma di gestione dell' interrupt LP, che, come i precedenti, si trova nella memoria programma, scrivibile dall' utente.
Però va considerato sia che l' interrupt può non essere utilizzato dal programma sia che la gestione impostata sia senza priorità.e quindi il vettore interrupt LP può non essere necessario, 

 

Cosa si intende con " può non essere necessario"?

  • Se il programma non usa interrupt, non avverranno mai chiamate a interrupt e il PC non verrà mai forzato ai valori 0008h o 0018h. 
    Quindi, in queste condizioni, è come se i punti salienti dei vettori di interrupt non esistessero è sarà possibile utilizzare la memoria programma in modo continuo a partire da 0000h

Quindi, se non viene del tutto utilizzato l' interrupt, il programma si può svolgere direttamente dalla locazione del vettore di Reset, ignorando i vettori dell' interrupt (che, non essendo usati, sono solamente celle di memoria Flash di uso generale).

;============================================================================= 
;                 VETTORE del RESET
- Nessun Interrupt utilizzato
;=============================================================================
 

      ORG 0x00 
       nop               ; per debugger

KILLINT                  ; blocca ogni interrupt
       bcf  INTCON,GIEL   
       bcf  INTCON,GIEH

INITIO call InitIO       ; inizializza IO
       call InitLCD      ; inizializza LCD
; ecc

Il fatto che sia scritta l' area da 0008h a 0018h non presenta alcun problema, nè logico, nè funzionale.

 

  • Se non viene usato il doppio livello di interrupt, il vettore senza priorità è a 0008h e da qui in avanti si potrà piazzare la gestione dell' evento, ignorando il vettore a bassa priorità.

;============================================================================= 
;            VETTORE INTERRUPT
SENZA PRIORITA'
;============================================================================= 

      ORG 0x08
 
   
movff FSR0, fsr0l      ; salva FSR0L
    movff FSR0H,fsr0h      ; e FSR0H

; Gestione interrupt senza priorità
    btfss INTCON3,INT2IE   ; INT2 attivo ?
     bra  intr2            ; no - test successivo
    btfss INTCON3,INT2IF   ; si - flag attivato ?
     bra  intr2            ; no - test successivo
    rcall INT2Manager      ; gestione INT2
intr2                      ; ecc

Il fatto che si sia sovrascritto il vettore dell' Interrupt a bassa priorità, se questo non è usato, non riveste alcuna importanza: va compreso che i vettori sono indirizzi di memoria programma che vengono puntati dal PC quando richiesto. E se non viene richieste, non sono altro che registri di memoria ordinari.

  • Se viene usato il doppio livello di interrupt, il vettore HP è a 0008h e quello LP a 0018h. Quindi, solo in questo caso sarà necessario inserire in entrambi le istruzioni di partenza delle relative gestioni.

Ad esempio:

;============================================================================= 
;                 VETTORE del RESET
;============================================================================= 


      ORG 0x00 
   nop             ; per debugger
   bra  init       ; salta alle routines di inizializzazione
;=============================================================================
;=============================================================================
;            VETTORE INTERRUPT ALTA PRIORITA'
;=============================================================================

      ORG 0x08 
    bra interhp   ; salta alle routines di gestione dell' interrupt HP

;============================================================================= 
;            VETTORE INTERRUPT BASSA PRIORITA'
;============================================================================= 

     ORG 0x18 
    bra interlp   ; salta alle routines di gestione dell' interrupt LP

 

Se la distanza tra i vettori e le routines di gestione è elevata, il salto bra sarà sostituito dal salto goto.

Si potrebbe eccepire che la necessità di iniziare la gestione di un interrupt con un salto (che impegna tempo) potrebbe essere la soluzione non ottimale in alcuni casi in cui il management dell' evento di interrupt sia critico, ma si tratta di tempi di esecuzione limitati e superabili con un eventuale incremento della frequenza di clock del processore (si ricorda che i PIC18F possono operare a 40 MHz e oltre, con ciclo di istruzione di soli 100 ns).


NOTE

Anche se non si utilizzano i vettori di Interrupt, onde evitare possibili problemi, è opportuno occuparli in qualche modo, ad esempio con una trappola che arresti il programma in debug nel caso in cui, per un errore nella programmazione, si sia abilitato un interrupt indesiderato. 
Questo serve anche per attenersi ad un template ordinato e per avere spazio per introdurre i vettori nel caso in cui, durante lo sviluppo del programma se ne veda la necessità.

;============================================================================= 
;                 VETTORE del RESET
;============================================================================= 

      ORG 0x00 
   nop             ; p
er debugger
   bra 
INIT       ; salta alle routines di inizializzazione
;============================================================================= 
;            VETTORE INTERRUPT ALTA PRIORITA'
;============================================================================= 

      ORG 0x08 
INTHP
   bsf LEDHP      ; accende LED diagnostico
   bra INTHP      ; trappola per interrupt HP

;============================================================================= 
;            VETTORE INTERRUPT BASSA PRIORITA'
;============================================================================= 

     ORG 0x18 
INTLP
   bsf LEDLP      ; accende LED diagnostico
   bra INTLP      ; trappola per interrupt LP

;============================================================================= 
; Inizio Programma
INIT  nop

; ecc

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.