Sei sulla pagina 1di 6

13/1/2017

Guida pratica al PIC 16F 84 - Memoria RAM /FLASH/EEPROM

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 .

http://gianluca82.altervista.org/pic16f84/data/memorie.html

1/6

Guida pratica al PIC 16F 84 - Memoria RAM /FLASH/EEPROM

13/1/2017

MEMORIA RAM

Banco 0

Banco 1

noh

INDF

INDE

Olh

TMRO

OPTION_ REG

02 h

PCL

PCL

03 h

STATUS

STATUS

04 h

FSR

FSR

05 h

PORT A

TRISA

06 h

PORT B

TRIS B

08 h

PEDATA

EECQN 1

OGh

EEADR

EECON 2

(10)

OAh

PCL TH

PCLATH

(11)

OBh

INTCON

INTCON

(12)

OCh

SFR

Speda !
Function
Register

07 h

GPR
SB registri GPR
( 63 bytes)

(79)

4Fh

(80)

5uh

copia dei
68 registri GPR

General
Purpose
Register

7Fh

Locazione ( i) di memoria non imp ! eme ntata ( e )

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 Olh e banco 0 abbiamo TMRO, mentre
all 'indirizzo 06h e banco 1 abbiamo TRIS B.
Alcuni registri sono " copiati " in entrambi i banchi ; ci ' significa che per accede a
quel registro e ' sufficiente specificarne l 'indirizzo di memoria, non importa quale
http://gianluca82.altervista.org/pic16f84/data/memorie.html

2/6

Guida pratica al PIC 16F 84 - Memoria RAM /FLASH/EEPROM

13/1/2017

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

TMRO
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
EECON 2

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, cio ' che
riguardano e toccano piu' argomenti diversi, vengono approfonditi all 'occorrenza .

I registri GPR

(General Purpose Register)

I registri GPR, come detto in precedenza, sono tutti quelli che vanno dall 'indirizzo
di memoria OCh a 4Fh inclusi . Sono 68 ed ognuno di essi e ' mappato in entrambi i
12
79
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 OOOOh fino a 03 FFh) ed ogni locazione pu '
(0)
http://gianluca82.altervista.org/pic16f84/data/memorie.html

(1023)
3/6

Guida pratica al PIC 16F 84 - Memoria RAM /FLASH/EEPROM

13/1/2017

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, cio ' 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 .

MEMORIA DI PROGRAMMA

(1023)

QOOOh

Reset vector

nno4 h

Interrupt vector

U 3 FFh

Una volta acceso ( o resettato), il microcontrollore inizia ad eseguire il programma


a partire dalla locazione OOOOh, detta anche " vettore di reset ", per poi
proseguire con le istruzioni successive.
Esiste pero ' una locazione speciale, cio ' l 'indirizzo 0004h, che assolve ad un
compito speciale; ogni qualvolta si verifica un interrupt ( secondo le modalit '
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 verr ' eseguita non appena si verificher ' un interrupt. Ovviamente prima
della locazione 0004h occorrer ' inserire un salto incondizionato per poter
" oltrepassare " la routine di gestione delle interruzioni : di solito il salto e ' inserito
proprio in prima posizione, cio ' in OOOOh, cosiche ' il microcontrollore, una volta
accesso o resettato, passera ' immediatamente ad eseguire il salto e quindi si
posizioner ' alla locazione opportuna scelta dal programmatore .
In figura si mostra graficamente il concetto di salto al vettore di interrupt :

http://gianluca82.altervista.org/pic16f84/data/memorie.html

4/6

Guida pratica al PIC 16F 84 - Memoria RAM /FLASH/EEPROM

13/1/2017

MEMORIA D! PROGRAMMA
OOOOh GOTO inizio programma

GljfMh

Inizio routine

RETFIE

Arrivo della
Interruzione

inizio programma

Istruzione interrotta

(1023)

G 3 FFh

Senza approfondire troppo, l 'ultima istruzione della routine di gestione delle interruzioni dovr ' essere
un RETFIE per poter ritornare ad eseguire il programma da dove era stato interrotto, ma tutto questo
verr ' approfondito alla sezione relativa aali interrupt.
Ovviamente se non e ' prevista alcuna gestione di interrupt e quindi non c 'e ' alcuna routine di servizio
delle interruzioni tutto il discorso pu ' 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 pie 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 PCLATFI. 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 :

http://gianluca82.altervista.org/pic16f84/data/memorie.html

5/6

Guida pratica al PIC 16F 84 - Memoria RAM /FLASH/EEPROM

13/1/2017

Program Counter ( 1 G bit)

bit 9 bitG bit 7 bitB bit 5 bit 4 bit 3 bit 2 bit 1 bit G

JL

bit 1 bit

PCLATH

JL

1r

ir

ir

ir

bit 7 bitG bit 5 bit 4 bit 3 bit 2 bit 1 bit 0


PCL

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) .
Ci ' 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 ) pu ' 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 eliclo di lettura o scrittura ) di 64 bytes. La EEPROM pu ' 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 pu ' arrivare fino a 40 anni .
La EEPROM verr ' approfondita alla sezione " EEPROM interna " .

Torna all 'indice

http://gianluca82.altervista.org/pic16f84/data/memorie.html

6/6