ELEMANIA
PIC16F690 - Indirizzamento indiretto
Indirizzamento indiretto

Ci sono molti casi in cui si ha la necessità di accedere sequenzialmente a una serie di locazioni di memoria (cioè di registri), per esempio allo scopo di assegnare a tutti uno stesso identico valore (es. zero). Il modo più rapido per realizzare questo è un ciclo. Il problema che con un ciclo non è possibile incrementare l'indirizzo di un registro in un'istruzione del PIC, poiché tale indirizzo deve sempre essere fornito con una costante numerica (oppure un nome, che corrisponde a un valore numerico). Facciamo un esempio per chiarire il problema. Con le istruzioni

         BSF 03,5 ; Seleziona il banco 1
         BCF 03,6
 
         CLRF 0C ;  pulisce (azzera) il contenuto del registro di indirizzo 0C nel banco 1

posso azzerare il contenuto del registro 0C. Supponiamo ora di voler azzerare anche i registri collocati anche agli indirizzi seguenti (cioè 0D, 0E, 0F eccetera). Per fare questo sarebbe molto comodo poter incrementare l'indirizzo 0C di uno e fare un ciclo. Peccato che questo non sia possibile, perché in assembly non esistono variabili (come quelle dei linguaggi di programmazione ad alto livello, come il C) e dunque non si può assegnare 0C a una variabile e poi incrementarla progressivamente.

Tuttavia il PIC offre un meccanismo per affrontare questi casi, meccanismo che, sebbene non sia in verità particolarmente elegante, è per lo meno efficace. In pratica c'è un registro a 8 bit detto FSR e collocato all'indirizzo 04 in tutti i banchi di memoria. Questo registro funge da puntatore, ovvero il suo contenuto rappresenta un indirizzo in memoria. Siccome con 8 bit non si possono codificare tutti i 512 indirizzi necessari per la RAM, il PIC ricorre allo stratagemma di aggiungere un bit al contenuto di FSR prelevandolo dal bit 7 (detto IRP) dello STATUS register, in modo da formare un indirizzo completo:

Il registro FSR deve essere inizializzato con l'indirizzo base dell'area di memoria che si vuole modificare. Per esempio facendo riferimento all'esempio precedente, all'inizio bisognerà scrivere in FSR il valore 8C, che corrisponde all'indirizzo (assoluto) del registro iniziale da azzerare (nel nostro caso PIE1, ma è solo un esempio). L''inizializzazione di FSR può avvenire nel seguente modo:

         BCF STATUS,IRP ; Azzera il bit IRP di STATUS (in modo da selezionare i banchi 0 e 1)
         MOVLW 8C         ; Scrive il valore 8C nel registro W
         MOVWF FSR       ; Copia W nel registro FSR

A questo punto per accedere al registro (cioè alla locazione di memoria) puntata da FSR, il PIC usa un trucco. Esaminando la mappa di memoria del microcontrollore, si noterà che l'indirizzo 0 di ogni banco non corrisponde a nessun registro. Questa sorta di "registro fittizio" ha anche un nome INDF. Il punto è che ogni istruzione che modifica il contenuto di INDF in realtà non va a scrivere su INDF (che non esiste nemmeno), ma scrive all'indirizzo puntato da FSR. Dunque per azzerare il registro 8C usando questo meccanismo dovremmo scrivere:

         BCF STATUS,IRP ; Azzera il bit IRP di STATUS (in modo da selezionare i banchi 0 e 1)
         MOVLW 8C         ; Scrive il valore 8C nel registro W
         MOVWF FSR       ; Copia W nel registro FSR

         CLR INDF           ; Azzera il registro puntato da FSR

Il meccanismo è abbastanza tortuoso, ma consente di risolvere il problema di cui si è detto prima. Volendo fare un ciclo per azzerare una sequenza di registri, basterà dunque incrementare semplicemente FSR e poi ripetere l'istruzione CLR INDF.

Il meccanismo di indirizzamento indiretto, sia detto per inciso, bypassa completamente il normale meccanismo di selezione dei banchi di memoria, che utilizza invece i bit RP1 e RP0 dello STATUS register. Ma vi avevamo anticipato che non è un metodo particolarmente elegante, no?

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it