Memoria Programma
Le differenze riguardano sia la memoria programma che la memoria dati.
Per quanto riguarda la prima, non esistendo più le pagine, non c'è neppure
più la necessità di maneggiare il PCLATH per spostarsi nei vari blocchi.
Non occorrono più e vanno abolite le macro per le long
call e i long goto , dato che l' istruzione call
e l' istruzione goto
coprono l' intero spazio della memoria. SI tratta di istruzioni a 32 bit,
che, dove sia possibile, possono essere sostituite da rcall
e bra ,con
indirizzamento più limitato, ma occupanti solo 16 bit.
Per quanti riguarda il Program Counter, i PIC16 dispongono di 13 bit,
mentre i PIC18F usano 21 bit, il che fa consistere il PC di tre elementi : PCU,
PCH e PCL.
Scrivendo PCL, si ha come conseguenza che che PCLATH e PCLATU vengono
copiati in PCH e PCU come nei PIC16, e leggendo PCL si trasferiranno PCLATH e
PCLATU in PCH e PCU.
Va osservato , come già detto per il problema dell' uso del simbolo $, che
le istruzioni degli enhanced sono a 16 o 32 bit, quindi il PC avanza di un
numero pari di passi e questo richiede anche una modifica nelle tabelle dei
salti calcolati utilizzando l' istruzione RETLW. L' AN716 riporta un
esempio di come modificare l'incipit delle tabelle RETLW.
Quindi, goto attraverso le tabelle di RETLW possono essere implementati anche
sui PIC18F, ma questo limita ad un solo byte la lunghezza del dato e a 256 bytes
la dimensione massima della tabella.
Una gestione ben più potente delle tabelle deve essere implementata
usando le istruzioni TABLxxx ed i corrispondenti registri del set esteso di 18F.
Azione
Eliminare Long Call e Long GOTO e sostituirli con
CALL e GOTO |
Memoria Dati
Nei PIC16 i registri speciali (SFR) e la RAM sono distribuiti su diversi
banchi. Questo richiede una gestione speciale effettuata agendo sui bit RP0 e
RP1 dello STATUS, cosa particolarmente gravosa nella interrogazione o modifica
degli SFR, in quanto assai spesso i registri necessari per utilizzare una
funzione hardware sono sparpagliati in almeno due banchi diversi.
Nei PIC18F tutti gli SFR sono in un unico banco (sono raggruppati nella seconda metà del banco
15) e la RAM è organizzata su un massimo di 15 banchi da 256 bytes ognuno .
Detto così, a prima vista, sembra una complicazione e non una semplificazione,
dato che il passaggio da un banco all' altro deve avvenire sempre con un sistema di
switch.
In pratica, però, non lo è
in quanto esiste un meccanismo detto Access Bank per cui tutti i registri
ed una parte della RAM del banco 0 (ovvero la prima metà del banco 0 e la
seconda metà del banco 15) sono prontamente accessibili senza alcuna
manovra addizionale sugli switch dei banchi !!!
Da questo deriva che se la quantità di memoria RAM usata dal programma è
compresa nello spazio a cui si accede con l' Access Bank (circa 128 bit,
solitamente più di quanto viene utilizzato da gran parte dei programmi che
girano su mid range), non occorre alcuna modifica al sorgente, mentre il BANKSEL o altro sistema per accedere agli SFR non è più
necessario e va abolito.
Nel caso in cui si voglia utilizzare agli altri banchi, il
sistema RP1:0 è sostituito da un registro BSR, con il vantaggio che il numero con cui è
caricato il pointer, attraverso una specifica istruzione (MOVLB), corrisponde al banco a
cui si vuole accedere (ad esepio, per accedere al banco 8 si caricherà 8 in BSR).
BSR non ha più alcuna connessione con lo STATUS, il che,
se da una parte è un vantaggio indubbio, dall' altra richiede che , se usato,
deve essere compreso nel numero dei registri da salvare nel passaggio a routine di
interrupt.
Un grande vantaggio nella scrittura del sorgente è offerto dall' Assembler
MPASM, che utilizza automaticamente l' Access Bank quando un operando ha un
indirizzo inferiore a 0x80 (area di RAM iniziale del banco 0) e quando ha un
indirizzo superiore a 0xF80 (area degli SFR), ignorando la gestione BSR dei
banchi. Questo consente di disporre di una parte della RAM e di tutti i registri
abolendo completamente qualsiasi gestione di switch dei banchi. Ovviamente
questo richiede che nel sorgente si siano utilizzati nomi simbolici e non valori
assoluti, in quanto le denominazioni di molti SFR restano identiche tra PIC16 e
PIC18, ma il loro indirizzo assoluto in memoria è completamente diverso.
Il meccanismo dell' Access Bank è automatico quando sono utilizzati aree
di memoria indirizzabili su 12 bit (fino a 0080h - GPR del Bank0) oppure
superiore a 0F80h (SFR nella seconda metà del Banco 15).
Quando si accede a locazioni nell' area 0000h-007Fh o 0F80h-0FFFh, il
contenuto di BSR è ignorato.
Si intende che per sfruttare l' automatismo sarà necessario utilizzare non i
valori assoluti, ma le label indicative sia dei GPR che degli SFR.
Da notare che buona parte dei nomi degli SFR è invariata rispetto a quelli
usati nei mid-range.
Azione
Microchip consiglia i seguenti passi :
- assicurarsi che le variabili usate siano con indirizzo a 12 bit, allocate
in banco 0
- se il codice richiede un clear di RP1:0 , sostituirlo semplicemente con
CLRF BSR
- eliminare ogni riferimento a RP0 e RP1
|
|