Tutorials - PIC

 

 

Il PC e PCLATH


Il PCLATH nelle tabelle RETLW

Parlando delle tabelle RETLW, abbiamo accennato al fatto che il PCL è un registro a 8 bit e che un suo aumento oltre il valore limite FFh (o decremento sotto 00h) è effettivo solamente per il PCL steso; non c'è un meccanismo che aggiorni anche la parte alta (PCH) del Program Counter.

Ne deriva che, nella classica tabella RETLW dei PIC Base-Mid:

Retlw_table
     addwf   PCL, f

    retlw "A"
    retlw "B"
    retlw "C"
    retlw "D"
    retlw "E"
    retlw "F
    retlw "G"
    retlw "H"
    ....

Si deve prestare attenzione a che:

  • la tabella non superi FFh locazioni
  • non sia a cavallo di due pagine
  • non sia in una pagina diversa da quella chiamante

Si verifica la situazione che, se per  CALL o GOTO lo spazio indirizzabile è 800h instruzioni, l' ampiezza del PCL limita a sole 100h, così ogni tavola oltre i 256 valori "incrocia" una pagina seguente.
E, se non si apportano correzioni, il programma va in crash a causa dell' errato valore che viene a caricarsi nel PC.

MPASM non dispone di sistemi di avviso per queste situazioni, ma è semplice implementarli. 
Ad esempio è possibile aggiungere un Warning in funzione della posizione della tabella, automaticamente calcolato dall' Assembler in base al valore dell' indirizzo di partenza e di fine della tabella stessa:

Retlw_table
     addwf   PCL, f

tableR:
    retlw "A"
    retlw "B"
    retlw "C"
    retlw "D"
    retlw "E"
    retlw "F
    retlw "G"
    retlw "H"
    ...

      IF ((HIGH ($)) != (HIGH (tableR)))
       ERROR "La tabella è a cavallo di due pagine !"
   ENDIF
 

Per risolvere il caso di programmi complessi, dove il posizionamento delle tabelle in memoria dipende dalla compilazione, può essere utile inserire un meccanismo, sempre calcolato dall' Assembler, per adeguare il Program Counter:

; Chiamata della tabella
       movlw  high (tableR:)
   movwf  PCLATH
   movf   offset,w
   addlw  tableR:
   btfsc  STATUS, C
    incf  PCLATH,f
   movwf  PCL

tableR:
    retlw "A"
    retlw "B"
    retlw "C"
    retlw "D"
    retlw "E"
    retlw "F
    retlw "G"
    retlw "H"
    ...

      IF ((HIGH ($)) != (HIGH (tableR)))
       ERROR "La tabella è a cavallo di due pagine !"
   ENDIF
 

Ovvero, inizialmente si opera l' aggiornamento di PCLATH se la somma di PCL+ l' offset supera FFh.

Anche qui, va notato che non ci sono problemi per il ritorno dalle chiamate in quanto a seguito delle istruzioni RETURN, RETLW e RETFIE il Program Counter viene caricato con il contenuto del top dello stack. Essendo lo stack a  bit, esso conserva l' indirizzo di ritorno completo della parte bassa e alta.

Analoga struttura si userà volendo riportare questo codice ai PIC18 (oltre al raddoppio dell' offset e al limite di capacità dela tabella dimezzato), ma non è la via migliore per accedere alle tabelle in memoria programma per questi processori,che dispongono nel set di istruzioni di potenti opcodes e registri dedicati alla scrittura/lettura di tabelle (TABLAT) e che permetto implementazioni molto più semplici di quelle dei PIC inferiori, più efficienti e più veloci.


 

     

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 12/01/13 .