Tutorials - PIC18 by Data Sheet

 

MOVFF

 


 

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 :

  • Accesso diretto (in Access Bank) a 128 bytes di RAM nella prima metà del Banco0
     

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