L' istruzione MOVFF
Al meccanismo dei banchi visto precedentemente fa eccezione l' istruzione MOVFF, a
due word, che, utilizzando un indirizzo integrato a 12 bit, può accedere direttamente a
qualsiasi locazione della Memoria Dati indipendentemente dai BSR. Questa
istruzione permette di ridurre le righe di codice. Vogliamo, ad esempio,
spostare il contenuto del registro 020h in quello del registro 32Fh.
I PIC16 ci costringono ad una scrittura come questa :
bcf
STATUS, RP0 ; al banco 0
bcf STATUS, RP1
movf 0x20, w ;
contenuto di 20h in w
bsf STATUS, RP0 ; al banco 3
bsf STATUS, RP1
movwf 0x2F, f ;
contenuto di W in 32Fh |
il che, anche usando macro per lo switch dei
banchi, è una delle cose più odiosette dei PIC16.
Per il PIC18F, procedendo
con le istruzioni ordinarie :
movlb 0x0
; Set BSR a bank 0
movf 0x20,W,banked ; modo BSR -
contenuto di 20h in w
movlb 0x3
; Set BSR a bank 3
movwf 0x2F,F,banked ; modo BSR -
contenuto di W in 32Fh |
il che richiede 4 istruzioni ( 4 word di memoria
programma), per un tempo di 4 cicli.
Da notare che movlb
carica i BSR senza modificare il valore contenuto in w.
Usando la MOVFF , si occupa una sola linea di sorgente (2 word in
memoria, però) con un tempo di 2 cicli e senza nessuna dipendenza dai BSR :
movff
0x020,0x32F ; move file to file |
La differenza è evidente.
La sintassi dell' istruzione MOVFF è semplice :
[Label ]
movff
source, destination
; commento
La sua comodità e funzionalità è evidente :
anche se è una istruzione a 32 bit, il tempo di esecuzione è solo 2 cicli e la
semplicità di scrittura e rilettura è impareggiabile.
La stessa cosa è ottenibile nei PIC 16 con una
macro, che comunque richiede diversi cicli per essere eseguita; a questo
proposito è opportuno ricordare che questa macro usualmente si chiama proprio
MOVFF : passando un programma scritto per PIC16 a PIC18F, va eliminata la
definizione della macro.
MOVFF ha un ulteriore vantaggio : non solo non
interessa il registro W, ma non modifica alcun bit dello STATUS, il che è molto
pratico in svariate situazioni. Va da se. comunque, che essendo W un registro
utilizzabile come qualsiasi un' altro (ma non ilo contrario !), W stesso può
essere oggetto di MOWFF, anche se esistono le classiche istruzioni di lavoro in
W.
Una nota particolare si trova nelle documentazioni
Microchip a riguardo dell' uso di MOVFF in una situazione particolare : quella
della manipolazione dei registri legati agli interrupt (INTCON; PIE, PIR, ecc).
Microchip sconsiglia di utilizzare MOVFF per accedere a questi registri quando
un interrupt è stato attivato. La motivazione è semplice : MOVFF è a 32 bit e
una chiamata di interrupt può capitare mentre la prima parte dell' istruzione
è in corso di esecuzione, ma non lo è ancora la seconda.
Questo non comporta
alcun problema in qualsiasi altro punto del programma : l' interrupt sospende l'
istruzione in corso, viene eseguita la gestione della chiamata e poi il PC si
riposiziona là dove era partito e completa l' istruzione a 32 bit come se
niente fosse successo. Però, se la destinazione del MOVFF è uno dei registri
della gestione dell' interrupt stesso, il sospendere a metà l' operazione e
riprenderla una volta esaurita la chiamata, potrebbe portare a risultati diversi
da quelli voluti dal programmatore, dando origine a problemi "strani"
quanto mai difficili da debuggare.
Si potrebbe obbiettare che è un caso remoto, ma è anche abbastanza remoto il
caso in cui si senta la necessità di accedere ai registri di interrupt con un
MOVFF, perchè è raro trasferire una variabile in uno di questi, dato che
solitamente si manipolano i singoli bit.
Comunque, dovendo fare una cosa del
genere, esistono istruzioni di mov a 16 bit che è possibili usare senza
alcuna limitazione, dato che non ci sono problemi di indirizzamento : ricordare
che tutti i registri sono accessibili direttamente con l' Access Bank. Quindi
non c'è alcuna necessità di una istruzione estesa a 32 bit.
In ogni caso, quanto sopra va detto, in quanto fa parte dei perfidi gotchas
sempre pronti ad aggredire alle spalle l' incauto programmatore.
L' uso di movff
prende il nome di Indirizzamento diretto lungo ed è un ulteriore bonus
dei PIC18.
Infatti, se consideriamo
la situazione fino ad ora esemplificata, applicandola ad un PIC18F2321,
semplicemente mettendo BSR = 1, abbiamo l’ accesso diretto, senza sforzo da
parte nostra a :
Acesso diretto in Access Bank agli SFR (nella seconda metà
del Banco 15)
Acesso diretto ai 256 bytes del Banco 1 puntato da BSR
Accesso diretto con movff a tutti gli altri registri di
qualsiasi altro banco
Vi sembra poco ?
Se dobbiamo agire su un registro posto in un banco diverso con una istruzione
che non sia il movff , sarà sufficiente cambiare il valore di BSR per quella
operazione specifica.
Nota : in processori che hanno memoria RAM
nella seconda metà del Banco0 e della prima metà del Banco15, queste
aree di RAM sono AL DI FUORI dell' Access Ram : per poterle utilizzare occorre
ricorrere al BSR, oppure, come vedremo più avanti, all' indirizzamento
indiretto.
E veniamo all' Access RAM, un vero punto di
forza dei PIC18.
|
|
Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.
|