Tutorials - PIC18

 

Passare da PIC16 a PIC18

 


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

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 05/06/19.