Memoria RAM/FLASH/EEPROM



La memoria dati (memoria RAM)



La memoria RAM del PIC 16F84 ha una dimensione di 90 byte, 22 byte per i SFR (Special Function Register) e i restanti 68 byte per i 68 GPR (General Purpose Register). Ogni registro occupa sempre ed esattamente un byte.
Gli SFR sono registri che controllano il funzionamento e le periferiche del microcontrollore (ad esempio, e' qui che sono mappate le porte A e B): tali registri non possono quindi essere utilizzati come memoria RAM per i programmi utente ma semplicemente fungono da pannello di controllo per l'intero microcontrollore.
I GPR sono invece 68 registri liberi a disposizione dell'utente.
Le aree di memoria colorate in azzurro non sono implementate; qualsiasi lettura in queste locazioni ritorna sempre con valore zero, mentre le scritture non hanno effetto.





La memoria RAM e' suddivisa in due banchi distinti (banco 0 e banco 1). Per poter accedere ad un registro e' quindi necessario specificare sia l'indirizzo di memoria che il banco. Ad esempio, all'indirizzo 01h e banco 0 abbiamo TMR0, mentre all'indirizzo 06h e banco 1 abbiamo TRIS B.
Alcuni registri sono "copiati" in entrambi i banchi; cio' significa che per accede a quel registro e' sufficiente specificarne l'indirizzo di memoria, non importa quale banco sia abilitato in quel momento. Ad esempio, per accedere al registro PCL possiamo portarci all'indirizzo 02h e banco 0, ma anche all'indirizzo 02h e banco 1. I registri di questo tipo sono: Indirect addr., PCL, STATUS, FSR, PCLATH, INTCON e tutti e 68 i registri GPR.


I registri SFR


Come appare poco evidente dalla composizione della memoria RAM, i registri SFR sono solo 16 (sembrerebbero 22 scartando le 2 sole aree in azzurro, ma ovviamente quelli mappati in ambedue i banchi contano sempre per uno solo, quindi sono effettivamente 16!). Eccoli elencati e suddivisi in gruppi:

Registri SFR di controllo del PIC
  • INDF
  • TMR0
  • OPTION_REG
  • PCL
  • STATUS
  • FSR
  • PCLATH
  • INTCON
Registri SFR per le porte di I/O
  • PORT_A
  • TRIS_A
  • PORT_B
  • TRIS_B
Registri SFR per l'utilizzo della memoria EEPROM interna
  • EEDATA
  • EECON1
  • EEADR
  • EECON2
Tutti i registri verranno analizzati nel corso del tutorial e nelle rispettive sezioni. Ad esempio, i registri per l'utilizzo delle memoria EEPROM sono approfonditi nella sezione "Utilizzo della memoria EEPROM". I registri piu' trasversali, cioe' che riguardano e toccano piu' argomenti diversi, vengono approfonditi all'occorrenza.


I registri GPR


I registri GPR, come detto in precedenza, sono tutti quelli che vanno dall'indirizzo di memoria 0Ch a 4Fh inclusi. Sono 68 ed ognuno di essi e' mappato in entrambi i banchi RAM.



La memoria di programma (memoria FLASH)



I programmi inseriti nel PIC vengono registrati in questa memoria. La memoria contiene esattamente 1024 locazioni (da 0000h fino a 03FFh) ed ogni locazione puo' contenere una sola istruzione (le istruzioni del PIC 16F84 sono a 14 bit, quindi ogni locazione memorizza esattamente 14bit). Per questo motivo un programma deve necessariamente essere costituito da un massimo di 1024 istruzioni.
La memoria istruzioni non e' accessibile da programma, cioe' non e' possibile indirizzarne lo spazio di memoria come per la memoria RAM; a livello utente (livello di programmazione) e' possibile dimenticarsi completamente dell'esistenza di questa memoria.



Una volta acceso (o resettato), il microcontrollore inizia ad eseguire il programma a partire dalla locazione 0000h, detta anche "vettore di reset", per poi proseguire con le istruzioni successive.
Esiste pero' una locazione speciale, cioe' l'indirizzo 0004h, che assolve ad un compito speciale; ogni qualvolta si verifica un interrupt (secondo le modalita' descritte che si vedranno in seguito) il PIC salta immediatamente a questa locazione.
In questo modo, se si desidera creare una routine di gestione delle interruzioni occorre farla cominciare da questa precisa locazione (0004h) in modo tale che essa verra' eseguita non appena si verifichera' un interrupt. Ovviamente prima della locazione 0004h occorrera' inserire un salto incondizionato per poter "oltrepassare" la routine di gestione delle interruzioni: di solito il salto e' inserito proprio in prima posizione, cioe' in 0000h, cosiche' il microcontrollore, una volta accesso o resettato, passera' immediatamente ad eseguire il salto e quindi si posizionera' alla locazione opportuna scelta dal programmatore.
In figura si mostra graficamente il concetto di salto al vettore di interrupt:



Senza approfondire troppo, l'ultima istruzione della routine di gestione delle interruzioni dovra' essere un RETFIE per poter ritornare ad eseguire il programma da dove era stato interrotto, ma tutto questo verra' approfondito alla sezione relativa agli interrupt.
Ovviamente se non e' prevista alcuna gestione di interrupt e quindi non c'e' alcuna routine di servizio delle interruzioni tutto il discorso puo' essere anche trascurato.


Il program counter


Il microcontrollore tiene traccia dello stato di avanzamento del programma grazie ad uno specifico puntatore, il program counter. Nel caso del 16F84, il program counter e' un puntatore a 13 bit che indica l'istruzione corrente da eseguire (solo i primi 10 bit dell program counter vengono utilizzati, per un totale di 2^10 = 1024 locazioni indirizzabili). Al reset del pic il program counter vale 0 (prima istruzione in cima alla memoria di programma), successivamente, per ogni istruzione eseguita, esso viene incrementato di uno. Le istruzioni di salto (condizionato o no) modificano esplicitamente il program counter quando sono eseguite, imponendo un salto opportuno nel normale flusso di esecuzione del programma.
Gli 8 bit meno significativi del program counter sono accessibili in lettura e scrittura dal registro PCL, quindi da tale registro e' possibile sia modificare gli 8 bit meno significativi del program counter che leggerne lo stato. Il registro PCL viene costantemente aggiornato e rispecchia sempre lo stato dei 8 bit meno significativi del program counter. Per i restanti 2 bit del program counter il discorso e' differente: tali bit sono nascosti e non sono visibili all'utente, ma possono essere modificati andando a cambiare i due bit meno significativi del registro PCLATH. PCLATH non viene mai aggiornato e quindi il suo stato non corrisponde a quello dei 2 bit piu' significativi del program counter.
La figura mostra come sono relazionati i registri PCL e PCLATH con il program counter:




In definitiva, durante il funzionamento normale del microcontrollore (esecuzione delle istruzioni, salti condizionati, salti incondizionati, chiamate a funzione etc..) il program counter viene aggiornato correttamente e non occorre preoccuparsi del suo stato. Occorre invece fare attenzione solo nel caso in cui una istruzione di programma modifichi esplicitamente il registro PCL: ogni volta che una qualche istruzione effettua una scrittura nel registro PCL, il contenuto di tale registro viene posto nei 8 bit meno significativi del program counter come detto in precedenza, ma anche i due bit meno significativi del registro PCLATH vengono copiati nei due bit piu' significativi del program counter (bit 8 e 9).
Cio' significa che se una istruzione tenta di incrementare forzatamente il registro PCL di 10 unita' (al fine di effettuare un salto in avanti nel programma di 10 istruzioni senza usare apposite istruzioni di salto) puo' farlo, ma occorre ricordarsi che i due bit meno significativi del registro PCLATH vengono automaticamente copiati nei due bit piu' significativi del program counter. Quindi, ogni volta che ci si appresta a scrivere in PCL, occorre far in modo che lo stato dei bit 0 e 1 di PCLATH corrisponda a quello dei bit 8 e 9 del program counter, pena un salto ad una locazione non desiderata. 



La EEPROM



La EEPROM interna e' una memoria secondaria ad accesso relativamente lento (20ms per un cliclo di lettura o scrittura) di 64 bytes. La EEPROM puo' essere scritta e letta da programma attraverso gli appositi registri SFR ed il suo contenuto permane anche a microcontrollore spento; in effetti la durata massima di ritenzione dei dati puo' arrivare fino a 40 anni.
La EEPROM verra' approfondita alla sezione "EEPROM interna".