I Modi di Indirizzamento
Si possono elencare i 5 modi di indirizzamento supportati
dal set di istruzioni enhanced :
-
Indizizzamento letterale
-
Indirizzamento in ACCESS BANK
-
Indirizzamento a banchi (BANKED)
-
Indirizzamento diretto lungo
-
Indirizzamento indiretto
Indizizzamento letterale
L’ indizizzamento
letterale è identico a quello dei PIC16, in cui il valore è
“letteralmente” compreso nell’ istruzione ::
Gli indicatori della radice in cui è espresso il
"letterale" caricato in W sono i soliti di MPASM.
Indirizzamento a banchi (BANKED)
Se nei PIC 16 la commutazione dei banchi avviene
con i bit RP1:0 dello STATUS, nei PIC 18F la selezione dei banchi ha un
meccanismo analogo, ma molto più pratico ed efficace.
Un indirizzo completo nella Memoria dati richiede
12 bit : 8 di essi sono embedded nell' istruzione e gli altri 4
sono fornibili esternamente con il Bank Select Register (BSR) in cui i bit
BSR3:0 sono dedicati a questo scopo.
Il valore di BSR (4 bit) si somma si somma a quello dell' indirizzo contenuto
nell' istruzione (8 bit) per formare l' indirizzo completo della destinazione (a
12 bit).
Come gli
RP, i BSR mantengono l' ultimo valore che è stato scritto fino ad una nuova
scrittura o al reset del micro; rispetto ai PIC16, però, nella famiglia 18F
esiste una specifica istruzione per maneggiare questi bit, ovvero
MOVLB
che scrive il valore assegnato nel registro BSR.
Questo rende molto più
semplici le operazioni di indirizzamento, anche perchè il registro BSR contiene solo
i 4 bit BSR3:0, mentre gli altri 4 sono inutilizzati e quindi non richiede la cura
necessaria a maneggiare gli RP1:0 nello STATUS dei PIC16, che contiene altri bit
sensibili.
Tra l' altro, il numero che va caricato nel registro BSR è lo stesso del banco
a cui si vuole accedere, per cui ilo Banco 2 si raggiungerà con un movlb
0x02 ed il banco 14 con un movlb
d'14' oppure movlb 0x0E
Con i BSR è possibile raggiungere qualsiasi posizione della Memoria Dati (le
aree di memoria non implementate sono lette come 00h e una loro scrittura non da
alcun risultato).
Per fare un esempio, se nel PIC 16 è necessario
scrivere :
bsf
STATUS,RP0 ; al Banco1
bcf STATUS,RP1
movf location, w ; per accedere a location |
per il PIC18F diventerà :
movlb 1
; BSR al Banco1
movf location, w, BANKED ; per accedere a location |
dove l'istruzione movlb
carica il valore del banco richiesto nel registro BSR.
Tra l' altro, dato che il registro BSR contiene solo i bit BSR, c'è una
corrispondenza diretta tra il valore numerico di questi bit ed il banco
interessato (BSR = 0 da accesso al banco 0, BSR = 5 da accesso al banco 5, ecc)
il che rende ancora più semplice il muoversi tra i banchi.
BSR viene modificato solo da un RESET o da una scrittura diretta, per cui, una
volta puntato su un banco, questo permane fino ad una volontaria modifica, come
d' altronde capita per gli RP dei PIC16.
Il parametro BANKED indica la volontà di accedere ad una risorsa che sta in un
banco indicizzato da BSR. Anche qui parrebbe una sciagura il dover aggiungere
il suffisso, dovendo per altro ricordarsi che la risorsa sta in un certo banco.
Ma anche qui , ci viene in aiuto uno
degli automatismi di MPASM che identifica la posizione nei banchi dei registri
dato e registro0 e automaticamente produce il codice corretto. Per cui la
scrittura sarà semplicemente :
movlb 1
; BSR al Banco1
movf location, w ; per accedere a location |
MPASM si incaricherà di creare il corretto codice
per l' istruzione
movf riconoscendo la necssità di indirizzamento in
banco, senza alcun intervento del programmatore.
Data l' ortogonalità dei registri che nei PIC18 è
reale, si potrà scrivere : :
movlb 1
; BSR al Banco1
movf dato, w ;
dato in W
movwf
location ; e salva |
Va osservato che, dato che il valore di BSR viene
conservato fino a che non viene cambiato, per l’ esempio precedente,
senza alcuna altra operazione dopo il 1,ci si
trova a poter accedere immediatamente, senza alcuna scrittura addizionale :
-
a tutti i registri RAM della prima metà del Banco 0
-
a tutti gli SFR (in Banco 15)
-
e a tutti i registri RAM del Banco 1
il che è molto,
molto comodo.
Dovendo passare ad un’ area di RAM in un altro banco, basterà
impostare in BSR il valore del banco richiesto. Dato che i banchi hanno ampiezza
di 256 bytes, per programmi ordinari, di solito non c’è necessità di ricorre
a banchi superiori all’ 1; mentre i compilatori di linguaggi ad alto livello
provvedo automaticamente a questa gestione.
Note :
-
Alcuni processori hanno la seconda metà del Banco1 e la
prima metà del Banco15 non accessibili (scrittura perduta e lettura sempre
0), mentre altri processori hanno RAM disponibile nella seconda metà del
Banco0.
Ora, questa seconda metà del Banco0 NON fa parte dell’ Access Bank, il
che vuol dire che per accedervi è necessario scrivere 0 in BSR.
-
Non tutti i processori hanno la stessa quantità di RAM in
Access Bank: ad esempio il PIC18F2321 ne ha 128 e nessuno in Banco15, mentre
il PIC18F8722 ne ha 96 e altri 96 nella prima metà del Banco15.
Quindi è opportuno SEMPRE leggere il foglio dati del componente, onde
evitare problemi di cui poi non è semplice venire a capo.
Una nota addizionale .
Nel caso
specifico della movimentazione di dati tra registri, che è una delle operazioni
più comuni, il set di istruzioni enhanced dispone di una “super
istruzione”, a 4 bytes, che consente di accedere a qualsiasi registro in
qualsiasi banco senza tener conto del contenuto di BSR. Si tratta della movff
(Move File to File).
|