La memoria
Riserviamo per ultima una trattazione della memoria, che interesserà principalmente chi vuole capire più a fondo
il funzionamento dei PIC e chi programma in Assembly; meno importante per
chi programma in C o simili.
In questi PIC troviamo due tipi di memoria:
- un' area di memoria FLASH, che comprende la memoria programma (program
memory), la configuration word e il registro ID
- un' area di memoria RAM che comprende la RAM dati e gli SFR
Trovate
qui qualche chiarimento, se occorre, per quanto riguarda il problema di
banchi e pagine.
Memoria programma
|
PIC12F510 ha un program counter (PC) 10 bit, in grado di indirizzare un programma
1k x 12 (ricordiamo
che l' ampiezza delle istruzione dei Baseline è 12 bit, mentre il bus
dati è a 8 bit - ved. architettura
Harvard), ovvero tutto lo spazio disponibile.
Questo è diviso in due pagine: i primi 512 x 12 (0000h-01FFh)
costituiscono la pagina 0 e gli altri 512 (0200-03FFh) costituiscono
la pagina 1.
Un accesso all' area non implementata causerà un wrap-around
verso l' area implementata.
L' area complessiva di 1k è divisa in due pagine da 512 ciascuna a
causa della limitatezza dell' indirizzo che è contenibile negli
opcodes. L' accesso alle pagine si ottiene agendo sul bit PA0 dello
STATUS.
Il vettore di reset, ovvero la locazione a cui va posta la prima
istruzione del programma, si trova, come solito per i PIC, a 0000h.
In effetti, l' istruzione iniziale è quella posta alla
locazione 03FFh,
che contiene il valore di calibrazione dell'oscillatore
interno. Questo valore non deve essere cancellato o sovra scritto,
come abbiamo visto nelle pagine dedicate al clock.
Lo stack a 12 bit è di soli due livelli, quindi limita il numero
degli annidamenti di chiamate a subroutine. Non ci sono meccanismi che
indichino un overflow o underflow dello stack; quindi è
responsabilità del programmatore di evitare questi errori.
Nel set Baseline
non ci sono istruzioni di manipolazione dello stack.
|
La memoria FLASH conserva quanti scritto anche al mancare della tensione di
alimentazione, quindi il contenuto delle locazioni da 0000h a 03FFh resta
invariato fino a che non viene volontariamente cancellato e/o riscritto.
Memoria RAM
La memoria di dati è composto di registri o byte di RAM, ovvero di memoria
scrivibile e leggibile a volontà, ma che perde quanto contenuto al momento in
cui la tensione scende sotto un valore minimo di mantenimento o viene a
mancare del tutto. .Nella stessa area sono implementati i registri di
controllo SFR.
In effetti, Microchip divide i registri in due gruppi funzionali:
- Special Function Registers (SFR)
- e registri di uso generale (General Purpose Register - GPR).
I registri SFR includono TMR0, il Program Counter (PCL), lo STATUS, i registri di I/O e il file
di indirizzamento indiretto (FSR). Inoltre, sono SFR anche tutti i
registri utilizzati per controllare la configurazione delle risorse interne.
I registri di uso generale sono la vera e propria RAM dati, sotto il comando delle
istruzioni del programma.
|
Per il PIC12F510 ci sono:
- 10 SFR, da 00h a 09h
- 6 bytes tra 0Ah e 0Fh
- 16 bytes di RAM da 10h a 1Fh
- 16 bytes di RAM da 30h a 3Fh (banco 1)
L' area RAM occupa due banchi, per cui esiste la necessità
di commutarli per accedere a queste risorse di memoria, il che è uno
degli aspetti "antipatici" dei PIC, principalmente per chi
programma in Assembly.
La situazione dei due banchi, però, è tale che l' area tra 00h e
0Fh del banco 0 viene mappata identicamente nel banco 1, per cui
indirizzando una locazione tra 20h e 2Fh darà l' accesso alla
corrispondete locazione tra 00h e 0Fh; ad esempio 08h o 28h si
accederà in ogni caso a ADCON0. Questo riguarda sia i registri
SFR, sia una piccola area di RAM per uso dati collocata tra 0Ah e 0Fh
che ha come alias gli indirizzi tra 2Ah e 2Fh.
Questo consente di accedere a tutti gli SFR e a una parte di RAM
indipendentemente dalla selezione del banco. |
Per l' accesso alla rimanente area di RAM tra 30 e 3Fh sarà necessario
ricorrere allo switch di banco effettuato dal bit 5 di FSR:
- FSR<5> = 0 -> Banco 0
- FSR<5> = 1 -> Banco 1
Da notare che, seppure General Purpose Register e SFR sono
entrambi "RAM", i primi non vanno usati per conservate dati,
poichè sono in relazione con la gestione delle varie funzioni del
processore; solamente i GPR saranno da impiegare come aree di memoria
volatile per i dati.
La situazione di 16F506 è più complessa, data la maggiore
quantità di RAM disponibile:
|
La RAM dei General Purpose Register è suddivisa in 4 banchi da 16
bytes ciascuno, il cui accesso si otiene attraverso l' indirizzamento con i bit 6:5 del registro FSR. Come per
12F510, l' area da 00h a 0Fh viene mappata come alias nei
banchi successivi.
Così, gli SFR sono accessibili sempre come alias del
contenuto del banco 0 in tutti i banchi. Quindi, ad esempio, l'
indirizzamento a, per cui, accedendo a 05h o 25h o 45h o 65h si
accederà comunque a OSCCAL.
Lo stesso per l' area RAM da 0Dh a 0Fh. Quindi, ad esempio, l'
indirizzamento a 0Dh, 2Dh, 4Dh o 6Dh consente comunque l' accesso alla
stessa locazione di RAM.
|
L' accesso al rimanente della RAM dei banchi 1/2/3 (30h-3Fh, 50h-5Fh,
60h-6Fh, 70h-6Fh) si ottiene attraverso l' indirizzamento con i bit 6:5 del registro
FSR:
- FSR<6:5> = 00 ->
Banco 0 20h-3Fh
- FSR<6:5> = 01
-> Banco 1 40h-5Fh
- FSR<6:5> = 10 ->
Banco 2 60h-6Fh
- FSR<6:5> = 11
-> Banco 3 80h-7Fh
Attenzione:
- la prima locazione di RAM dati in 12F510 si trova a 0Ah
- in 16F506, invece, la prima locazione di RAM dati si
trova a 0Dh, dato che ci sono SFR in più rispetto a 12F510.
|
Possiamo anche notare che i registri TRISGPIO
e OPTION non appaiono nella mappa della memoria in quanto sono SFR speciali a
sola scrittura, accessibili rispettivamente ed esclusivamente con le
istruzioni tris e option.
Può essere utile riportare anche la tabella riassuntiva degli SFR, in cui
appaiono i valori di default al reset.
La tabella riporta:
- l' indirizzo assoluto del registro nella mappa della memoria RAM
- il nome (label) del registro
- gli mnemonici relativi ai bit
- il valore di default al POR (x indica un valore casuale)
- la pagina del foglio dati dove sono sono descritti nel dettaglio questi
registri
In particolare:
- il bit 5 dello STATUS costituisce lo switch di pagina per accedere alla
parte superiore della memoria programma:
- PA0 = 0 -> primi 512 bytes
- PA0 = 1 -> restanti 512
bytes
- il bit 5 di FSR costituisce lo switch per accedere ai banchi:
- FSR<5> = 0 -> Banco 0
- FSR<5> = 1 -> Banco 0
Per il 16F506 si tratta di bit 6 e bit 5.
Queste informazioni riguardano la programmazione Assembly, dove è cura del
programmatore il dirigere il flusso di istruzioni alla giusta
destinazione. Nell' uso di compilatori, invece, è il compilatore che
provvede a commutare banchi o pagine a seconda della necessità.
- Sempre nello STATUS, il bit 7 (GPWUF) va a 1 dopo un reset prodotto dal
wake-up dovuto al cambio di stato dei pin
Per 16F506 la situazione è analoga, con la variazione dovuta al
maggior numero di periferiche integrate:
Si nota la presenza dei registri di controllo del secondo comparatore
(CM2CON0), della tensione di riferimento programmabile (VRCON)
e del controllo dei due port (PRTB/PORTC e TRISB/TRISC).
|