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.
|