Tabelle RETLW
Particolarmente utilizzate nei mid-range, le tabella con RETLW richiedono
modifiche se utilizzate anche negli enhanced, modificando l' offset prima di
chimare la tabella.
Nel caso di tabelle di subroutines, sarà necessario modificare l' offset
nella tabella.
Poichè un computed GOTO causa un salto del PC all' istruzione RETLW,
PCL<0> deve essere a zero, dato che negli enhanced il passo delle
istruzioni è pari (2 byte per passo).
Questo richiede che l' offset sia moltiplicato per due per raggiungere la
corretta locazione nella tabella.
L' esempio seguente schematizza le modifiche da effettuare ad un computed
GOTO del genere.
Si tratta di una tabella a 256 ingressi (offset da 0 a 255).
Occorrerà una locazione temporanea di RAM ed una label all' ingresso della
tabella.
movf OFFSET,w ; OFFSET= 0x00 - 0xFF
call
table
...
ORG
0x3C0
table movwf taboff
; salva l' offset della table
bcf STATUS,C
; clear Carry per shift
rlcf
taboff,F ; taboff = taboff * 2
movlw
HIGH(tab_st1) ; high byte di table
btfsc
STATUS,C ; test carry
incf
WREG,W
movwf
PCLATH ; modifica PCLATH se
richiesto
movlw
LOW(tab_st1) ; low byte di table
addwf
taboff,W ; somma all' offset
btfsc
STATUS,C ; test per overflow
incf
PCLATH,F ; incrementa se
necessario
movwf
PCL ;
PCLATH e PCLATU sono scritti in
;
PCH e PCU
tab_st1
retlw 0x00
; primo ingresso, offset=0
retlw
0x01 ; (256
entry, 256 word/512 byte)
.....
|
Da notare la rlcf taboff,F
che moltiplica l' offset per 2.
PCLATU, la parte upper del PC, non viene modificata se si sta lavorando in una
memoria al di sotto dei 32K.
Le tabelle RETLW sono quindi possibili anche negli enhanced senza
particolari problemi, ma va notato che viene tabellato un solo byte di dato in
ogni coppia di bytes dell' istruzione e la tabella è limitata a 256 entry.
Utilizzando le istruzioni di TABLE_READ e TABLE_WRITE proprie del set degli
enhanced si può meglio sfruttare la memoria, senza limiti per il numero degli
elementi della tabella.
Azione
E'opportuno sostituire la gestione delle tabelle con la modalità
che impiega le nuove istruzioni.
Se si mantiene il vecchio sistema, occorre modificare i puntatori x 2
o x 4. |
Table Reads
I PIC18 dispongono di un puntatore a 21 bit, quindi in grado d coprire
tutta l'estensione della memoria, che può essere caricato con l' indirizzo
del dato da leggere.
Questo puntatore comprende tre registri a 8 bit:
Una specifica istruzione, TBLRD*, rende nel registro TABLAT il contenuto
della memoria puntata. In sostanza, i registri TBLPTR sono equivalenti agli
SFR, ma nell'area flash.
Alcune variazioni dell' istruzione TBLRD* consentono di incrementare o
decrementare il puntatore in modo automatico.
Istruzione |
Effetto |
TBLRD* |
Copia il registro puntato in TABLAT |
TBLRD*+ |
Copia il registro puntato in TABLAT e incrementa TBLPTR dopo la
lettura |
TBLRD*- |
Copia il registro puntato in TABLAT e decrementa TBLPTR dopo la
lettura |
TBLRD+* |
Incrementa TBLPTR, poi copia il registro puntato in TABLAT |
Per utilizzare queste istruzioni bastano tre passi:
- caricare in TBLPTR l' indirizzo desiderato (che può essere pari
o dispari)
- eseguire una istruzione TBLRD*
- leggere il risultato nel registro TABLAT
Un esempio:
; copia una stringa
di testo su PORTB
;
RdStr movlw HIGH(string)
movwf TBLPTRH
; high byte nel pointer (0x12)
movlw LOW(string)
movwf TBLPTRL
; low byte nel pointer (0x34)
read tblrd*+
; leggi un byte e incrementa il pointer
movff TABLAT,PORTB
; metti il byte su PORT B
tstfsz TABLAT
; dato = 0 ?
goto read
; no, altro loop
return
; si, fine tabella
ORG 0x1234
String DW "This is a
test.",0x00 ; text string
|
Da osservare l' istruzione MOVFF - Move File to File, a 32 bit, che
raggiunge qualunque posizione di memoria dati in modo del tutto automatico.
Azione
E'opportuno sostituire la gestione delle tabelle con la modalità
che impiega le nuove istruzioni. |
|