Tutorials - PIC18 by Data Sheet

 

Indirizzamento

 


 

I Modi di Indirizzamento

 

Si possono elencare i 5 modi di indirizzamento supportati dal set di istruzioni enhanced :

 

  • Indizizzamento letterale

  • Indirizzamento in ACCESS BANK

  • Indirizzamento a banchi (BANKED)

  • Indirizzamento diretto lungo

  • Indirizzamento indiretto


Indizizzamento letterale

L’ indizizzamento letterale è identico a quello dei PIC16, in cui il valore è “letteralmente” compreso nell’ istruzione ::

movlw    0x55    

Gli indicatori della radice in cui è espresso il "letterale" caricato in W sono i soliti di MPASM.

 


Indirizzamento a banchi (BANKED)  

Se nei PIC 16 la commutazione dei banchi avviene con i bit RP1:0  dello STATUS, nei PIC 18F la selezione dei banchi ha un meccanismo analogo, ma molto più pratico ed efficace. 

Un indirizzo completo nella Memoria dati richiede 12 bit : 8 di essi sono embedded nell' istruzione e gli altri 4 sono fornibili esternamente con il Bank Select Register (BSR) in cui i bit  BSR3:0 sono dedicati a questo scopo.

Il valore di BSR (4 bit) si somma si somma a quello dell' indirizzo contenuto nell' istruzione (8 bit) per formare l' indirizzo completo della destinazione (a 12 bit).

Come gli RP, i BSR mantengono l' ultimo valore che è stato scritto fino ad una nuova scrittura o al reset del micro; rispetto ai PIC16, però, nella famiglia 18F esiste una specifica istruzione per maneggiare questi bit, ovvero 

MOVLB

che scrive il valore assegnato nel registro BSR. 

Questo rende molto più semplici le operazioni di indirizzamento, anche perchè il registro BSR contiene solo i 4 bit BSR3:0, mentre gli altri 4 sono inutilizzati e quindi non richiede la cura necessaria a maneggiare gli RP1:0 nello STATUS dei PIC16, che contiene altri bit sensibili.

Tra l' altro, il numero che va caricato nel registro BSR è lo stesso del banco a cui si vuole accedere, per cui ilo Banco 2 si raggiungerà con un   movlb 0x02  ed il banco 14 con un  movlb d'14'  oppure  movlb 0x0E
Con i BSR è possibile raggiungere qualsiasi posizione della Memoria Dati (le aree di memoria non implementate sono lette come 00h e una loro scrittura non da alcun risultato).

Per fare un esempio, se nel PIC 16 è necessario scrivere :

bsf    STATUS,RP0    ; al Banco1
bcf    STATUS,RP1
movf   location, w   ; per accedere a location

per il PIC18F diventerà :

movlb  1                     ; BSR al Banco1
movf   location, w, BANKED   ; per accedere a location

dove l'istruzione movlb  carica il valore del banco richiesto nel registro BSR.
Tra l' altro, dato che il registro BSR contiene solo i bit BSR, c'è una corrispondenza diretta tra il valore numerico di questi bit ed il banco interessato (BSR = 0 da accesso al banco 0, BSR = 5 da accesso al banco 5, ecc) il che rende ancora più semplice il muoversi tra i banchi.
BSR viene modificato solo da un RESET o da una scrittura diretta, per cui, una volta puntato su un banco, questo permane fino ad una volontaria modifica, come d' altronde capita per gli RP dei PIC16.

Il parametro BANKED indica la volontà di accedere ad una risorsa che sta in un banco indicizzato da BSR. Anche qui parrebbe una sciagura il dover aggiungere il suffisso, dovendo per altro ricordarsi che la risorsa sta in un certo banco. Ma anche qui , ci viene in aiuto uno degli automatismi di MPASM che identifica la posizione nei banchi dei registri dato e registro0 e automaticamente produce il codice corretto. Per cui la scrittura sarà semplicemente :

movlb  1                     ; BSR al Banco1
movf   location, w           ; per accedere a location

MPASM si incaricherà di creare il corretto codice per l' istruzione movf   riconoscendo la necssità di indirizzamento in banco, senza alcun intervento del programmatore.

Data l' ortogonalità dei registri che nei PIC18 è reale, si potrà scrivere : :

movlb  1                 ; BSR al Banco1
movf   dato, w           ; dato in W
movwf  location          ; e salva

Va osservato che, dato che il valore di BSR viene conservato fino a che non viene cambiato, per l’ esempio precedente, senza alcuna altra operazione dopo il 1,ci si trova a poter accedere immediatamente, senza alcuna scrittura addizionale :

  • a tutti i registri RAM della prima metà del Banco 0

  • a tutti gli SFR (in Banco 15)

  • e a tutti i registri RAM del Banco 1

il che è molto, molto comodo.

Dovendo passare ad un’ area di RAM in un altro banco, basterà impostare in BSR il valore del banco richiesto. Dato che i banchi hanno ampiezza di 256 bytes, per programmi ordinari, di solito non c’è necessità di ricorre a banchi superiori all’ 1; mentre i compilatori di linguaggi ad alto livello provvedo automaticamente a questa gestione.




Note :

  1. Alcuni processori hanno la seconda metà del Banco1 e la prima metà del Banco15 non accessibili (scrittura perduta e lettura sempre 0), mentre altri processori hanno RAM disponibile nella seconda metà del Banco0. 
    Ora, questa seconda metà del Banco0 NON fa parte dell’ Access Bank, il che vuol dire che per accedervi è necessario scrivere 0 in BSR.

  2. Non tutti i processori hanno la stessa quantità di RAM in Access Bank: ad esempio il PIC18F2321 ne ha 128 e nessuno in Banco15, mentre il PIC18F8722 ne ha 96 e altri 96 nella prima metà del Banco15.
    Quindi è opportuno SEMPRE leggere il foglio dati del componente, onde evitare problemi di cui poi non è semplice venire a capo.

Una nota addizionale.

Nel caso specifico della movimentazione di dati tra registri, che è una delle operazioni più comuni, il set di istruzioni enhanced dispone di una “super istruzione”, a 4 bytes, che consente di accedere a qualsiasi registro in qualsiasi banco senza tener conto del contenuto di BSR. Si tratta della movff  (Move File to File).

 

 

 


 

 

 

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