Tutorials - PIC18 by Data Sheet

 

Pag 67


Da pagina 67 il foglio dati inizia una trattazione dei metodi di indirizzamento, che abbiamo gia visto parzialmente nei capitoli precedenti riguardanti la memoria dati.

Vediamo ora i metodi di indirizzamento indiretto.


Modalità di indirizzamento indiretto nella Memoria Dati.

Anche le modalità di indirizzamento indiretto implementate nei PIC18 sono una robusta novità rispetto a quelle dei PIC16.

            Sono disponibili ben 5 modalità diverse:

  • Indirizzamento indiretto semplice

  • Indirizzamento indiretto post incrementato

  • Indirizzamento indiretto post-decrementato

  • Indirizzamento indiretto pre-icrementato

  • Indirizamento indiretto con offset


Vediamoli nei particolari.


Indirizzamento indiretto semplice

Gli enhanced offrono non uno, ma tre puntatori indiretti: FSR0, 1, 2, ciascuno di due bytes. 
Si avrà quindi un FSR0H e FSR0L, FSR1H e FSR1L, ecc.

Il meccanismo è analogo a quello dei mid-range:
L'indirizzamento indiretto è operato attraverso un INDFx, mappato negli SFR, ma non registro fisico.

Esiste un INDF per ogni coppia di FSR.

Leggendo e scrivendo il particolare INDFx relativo ad una coppia FSRx si accede all' area puntata da questa coppia.

Ad esempio, una lettura di INDF1 leggerà il contenuto del registro all' indirizzo indicato da FSR1H:FSR1L.

Dato che l' indirizzamento indiretto usa 12 bit, può raggiungere qualsiasi punto della memoria dati senza l' uso del Banked.

Nell' esempio della figura, FSR1 punta la locazione ECCh, che si trova nel banco 14.
La linea

addwf  INDF1, 1

somma il contenuto di WREG a quello della locazione puntata. Come detto, non occorre alcuno switch di banco per raggiungere il Bank 14, pure trovandosi nel ad operare dal Bank 0.

Per caricare il puntatore, se è pur sempre valida la classica scrittura : 

movlw   low(target)    ; low dell’ indirizzo target  
movwf    FSR0L           ; al puntatore  
movlw    high(target)    ; high dell’ indirizzo target
movwf    FSR0H           ; al puntatore  

una istruzione specifica (codificata su 4 bytes) semplifica anche questo passo : 

lsfr     FSR0, target   ; puntatore su target

che, in una sola linea, compie il lavoro di quattro e, tra l’ altro, non modifica WREG.

LSFR è una istruzione a 32 bit (4 bytes).

L’ accesso indiretto opera su tutta la RAM senza alcuna necessità di cambiamento del banco attraverso il BSR (il bit IRP dei PIC16 non esiste più). 
Una notevole conseguenza di questo fatto è che si dispone immediatamente di una estensione dell’ area di memoria a tutta la RAM disponibile, posizionando tabelle e buffer in banchi diversi da quello puntato da BSR ed accedendovi in modo indiretto.

 


AVVERTENZA:

Non tutti i processori hanno le stesse quantità di memoria RAM disponibili. 
Verificate i fogli dati prima di indirizzare aree vuote
(operazione per cui l' Assembler non può fornire segnalazioni di errore)
in cui la scrittura va perduta e la lettura rende sempre 0. 
 
 

 

Mentre i PIC16 disponevano di un INDF, gli enhanced ne hanno 3, INDF0, 1, 2, collegati ai rispettivi FSR. Quindi la lettura di un dato indiretto si sviluppa come al solito :

lsfr   FSR0, target      ; puntatore su target
movf   INDF0, w          ; legge dato

  e se si trattasse di un altro puntatore, ad esempio il 2 ::

lsfr   FSR2, target      ; puntatore su target
movf   INDF2, w          ; legge dato

FSRxH e FSRxL sono concatenati per formare un indirizzo a 16 bit. Quando FSRxL in incremento deborda, il carry viene passato come incremento a FSRxH. Dunque il limite di azione di FSRx è FFFFh (64 k).

I registri indiretti si possono usare anche contemporaneamente, essendo tutti indipendenti:

lsfr   FSR0, target      ; puntatore 0 su target
lsfr   FSR1, source      ; puntatore 1 su source
movf   INDF0, w          ; legge dato
source

movwf  INDF1             ; salva in target     

 


AVVERTENZA:

La procedura FAST non salva i registri FSR.

Se questi sono utilizzati, occorrerà provvedere manualmente al loro salvataggio.

 

 


 

 

 

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