Le istruzioni di accesso alla Memoria Dati.
Mentre la sintassi delle istruzioni del set a 14 bit
per manipolare la memoria Dati era del tipo :
[Label]
opcode
f
; commento
movwf 0x03, f
per i PIC18F l' oggetto si estende a:
[Label]
opcode
f, a
; commento
movwf 0x03, f , 0
dove a è il bit che specifica se attivare l' Access Bank o no.
Abbiamo detto che questo bit può essere omesso in MPASM perchè l' Assembler stabilisce se usare
i BSR o meno a seconda dell' indirizzo di f. Questo automatismo è
estremamente comodo e funzionale, almeno finchè si sta in aree di memoria
raggiungibili dall' Access Bank, ma può riservare qualche sorpresa se non si fa attenzione.
Supponiamo di voler caricare con 03h i registro all' indirizzo
020h e 220h; essi si trovano in banco zero e 2.
La tabella evidenzia gli indirizzi in forma binaria : ricordiamo che gli 8 bit
più bassi sono quelli forniti dall' opcode, mentre i 4 bit più alti dipendono
da BSR.
Registro |
Indirizzo a 12 bit |
Banco |
BSR |
Embedded
nell' opcode |
020h |
0000 |
0010 0000 |
0 |
220h |
0010 |
0010 0000 |
2 |
Possiamo facilmente notare come gli 8 bit specificati nell'
opcode siano identici per entrambi gli indirizzi; la scelta della destinazione
reale è effettuata dal valore dei BSR.
Con i PIC16F possono essere usate queste istruzioni :
BANK0
; set to bank 0
movlw 0x05 ;
load value on w
movwf 0x20 ; move w to
file
BANK2
; set to bank 2
movwf 0x220 ; move w to file |
dove BANK0 e BANK2 sono le classiche macro per commutare i
banchi e che equivalgono a :
BANK0 macro
bcf
RP0
bcf
RP1
endm
BANK2 macro
bcf
RP0
bsf
RP1
endm |
Per i PIC18F posso procedere analogamente :
movlb 0x00
; Set BSR a Bank 0
movlw 0x05 ; load
valore in w
movwf 0x020,1 ; a = 1 usa BSR e
muove w a 020h
movlb 0x02
; Set BSR a Bank 2
movlw 0x05 ; load
valore in w.
movwf 0x020,1 ; a = 1 usa BSR e
muove w a 220h |
che poteva anche essere scritto meglio così :
movlb 0x02
; Set BSR a Bank 0
movlw 0x05 ;
load valore in w.
movwf 0x220,1 ; a = 1 attiva BSR - muove
a 220h
movwf 0x020,0 ; a = 0 usa Access Bank -
muove a 020h |
Non sono più necessarie macro per lo switch dei banchi perchè
l' isruzione MOVLB è molto chiara; comunque, volendo, è sempre possibile
creare macro del genere :
BANK0 macro
movlb 0x00
endm
BANK2 macro
movlb
0x02
endm
ecc... |
Ha lo stesso risultato scrivere :
movlb 0x02 ; Set BSR a BANK 2
movlw 0x05
movwf 0x020,f,0 ; Usa Access Bank
e w va a 020h.
movwf 0x020,f,1 ; Usa BSR (prima
settato a 2) per cui
; w va a 220h |
in cui l' indirizzo appare lo stesso, ma la reale destinazione
è determinata dalla scelta dei BSR.
Se, però, avessi scritto come segue, ci sarebbe stato un problema :
movlb 0x00
; Set BSR a BANK 0
movlw 0x05
movwf 0x020,f,0 ; Usa Access Bank
e w va a 020h.
movwf 0x220,f,1
; Usa BSR (prima
settato a 0) per cui
; w finisce a 020h e non a 220h |
Abbiamo detto che non è obbligatorio specificare il bit a
: MPASM decide di porre a = 0 per indirizzi di destinazione in banco 0,
usando quindi l' Access Bank, mentre impone a = 1 se l' indirizzo è al
di fuori del banco 0, usando quindi i BSR. Comunque è sempre
meglio specificare se si intende usare BSR o Access mode, perchè così è meno
facile cadere in errore :
movlb 0x02
; Set BSR a BANK 2
movlw 0x05
movwf 0x020,f,0 ; Usa Access Bank
e w va a 020h.
movwf 0x220,f ; bit
a non espresso - MPASM decide
; ed assume a = 1 (BSR)
; per cui w finisce a 220h (BSR = 2) |
ma se i BSR non sono a posto :
movlb 0x00
; Set BSR a BANK 0
movlw 0x05
movwf 0x020,f ;
bit a non espresso - MPASM decide
; ed assume a = 0 per accesso in
; banco 0 (Access Mode)
; w va a finire giustamente in 20h
movf 0x220,f ;
bit a non espresso - MPASM decide
; ed assume a = 1 usando BSR,
; ma w va a finire in 020h e non in
; 220h perchè BSR è stato messo a 0
|
mentre va bene :
movlb 0x02
; Set BSR a BANK 2
movlw 0x05
movwf 0x020,f ;
bit a non espresso - MPASM decide
; ed assume a = 0 - w va
a 020h.
movwf 0x220,f ;
bit a non espresso - MPASM decide
; e w va a 220h perchè BSR
; è stato messo correttamente a 2 |
Va osservato che, dopo un reset, il valore di BSR è uguale a 0, ovvero punta
sul banco 0. Quindi, in queste condizioni sono accessibili :
-
tutti i 256 bytes del banco
0
-
il banco 15 , con Access Bank, per quanto riguarda
l' area dei registri speciali.
E questo avviene senza che il programmatore debba fare alcuna speciale
manovra, grazie anche agli automatismi introdotti in MPASM. Infatti, con BSR = 0, se scriviamo :
value1 equ 0x020
value2 equ 0x0AA
movf value1, w ; load primo valore
movwf TRISA ; set TRISA
movf value2, w ; load secondo valore
movwf PORTA ; set PORTA |
in cui value1 e value2
sono in banco 0, mentre TRISA e PORTA sono nella seconda metà del banco 15, MPASM compilerà :
movf value1,w, a
; primo valore, in Access Bank
movwf TRISA, a ; set TRISA, in
Access Bank
movf value2,w, banked ; secondo valore, con BSR (=0)
movwf PORTA, a ; set PORTA,
in Access Bank |
Quindi, in pratica, tutti registri speciali e 256 bytes di RAM del banco 0
sono accessibili senza alcuna manovra sui BSR.
Ovviamente la cosa non funziona se value1 o value2
non sono in banco 0; in questo caso sarebbe necessario modificare i BSR.
Però disporre al reset di 256 bytes di RAM e di tutti i registri accessibili senza
pensiero non è affatto male ed è ben più di quanto è possibile con i PIC16.
Comunque, il fatto che il valore contenuto nel registro BSR sia modificato
solo da un Reset o da una scrittura diretta, fa si che si possano avere
disponibili immediatamente un altro banco di memoria con una sola manovra
aggiuntiva, puntando BSR sul banco che si vuole aggiungere e sfruttando sia la
funzione di switch dei banchi, sia l Access Bank :
value1 equ 0x020
value2 equ 0x120
movlb
0x01 ;
BSR per banco 1
movf value1,w, a
; primo valore, in Access Bank
movwf TRISA, a ; set TRISA, in
Access Bank
movf value2,w, banked ; secondo valore, in
BSR
movwf PORTA, a ; set PORTA,
in Access Bank
|
BSR punta al banco 1 dove si trova la variabile
value2 , assieme ad altre 255 variabili, che saranno
accessibili in modalità BSR, mentre resterà disponibile l' area dell' Access
Bank. Il tutto senza lavoro particolare del programmatore, in quanto la sua
scrittura sarà semplicemente :
value1 equ 0x020
value2 equ 0x120
movlb
0x01 ;
BSR per banco 1
movf value1, w
; primo valore, in Access Bank
movwf TRISA ; set
TRISA, in
Access Bank
movf value2, w ; secondo
valore, in BSR
movwf PORTA ; set PORTA,
in Access Bank
|
con MPASM che si preoccuperà di dare i giusti parametri.
Ne consegue comunque che:
-
Nel campo della didattica o dell' auto istruzione, la struttura dei PIC18F consente all' utente di
concentrarsi sul programma e sulle funzioni del processore piuttosto che
dissipare energie nel braccio di ferro con pagine e banchi.
-
Nell' impiego del chip, finchè l' applicazione necessita di risorse di
memoria limitate, ci si può dimenticare completamente dei banchi e
sfruttare gli automatismi dell' Assembler.
In sostanza, in applicazioni "normali" e ben scritte, nei PIC18F il
cambio del banco può diventare un fatto eccezionale, mentre nei PIC16 era all'
ordine del giorno.
Una discreta soddisfazione ed una ragione in più per passare
dai mid-range agli enhanced.