Tutorials - PIC18 by Data Sheet

 

Accesso alla Memoria Dati

 


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  value1value2  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 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. 

 


Riassunto dei bonus

I PIC18F, di default dopo il reset, permettono di accedere senza problemi di switches di banchi o pagine a:

  • tutta la memoria programma
  • tutto il banco 0 della memoria dati
  • tutti i registri speciali
  • tutta la memoria dati con l'istruzione movff

Il che non è male.

Nei PIC18F4321 questo mette a disposizione:

  • l' Access Ram da 00h a 7Fh, pari a 128 bytes
  • la RAM del Banco 0, da 80h a FFh, pari a 128 bytes

per un totale di 256 bytes.

Se serve maggiore memoria da trattare con istruzioni diverse da movff, occorrerà utilizzare i BSR.
Settando BSR a 1, ad esempio, nei PIC18F4321 si otterrà un ulteriore bonus, potendo accedere a:

  • tutta la memoria programma
  • tutto il banco 1 della memoria dati
  • tutti i registri speciali
  • tutta la memoria dati con l'istruzione movff

Questo mette a disposizione:

  • l' Access Ram da 00h a 7Fh, pari a 128 bytes
  • la RAM del Banco 1, da 100h a 1FFh, pari a 256 bytes

per un totale di 384 bytes.

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.