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