L'8051 ha in generale tre tipi di memoria.
Per programmare efficacemente l'8051 e' necessario avere una conoscenza di base di questi tipi di memoria.
I tipi di memoria sono illustrati nel figura sottostante.
Essi sono: Memoria On-Chip, Memoria di programma esterna (External Code)
e RAM esterna (External RAM).
La memoria On-Chip si riferisce a quella che fisicamente risiede
nel componente. Essa puo'
essere di tipi diversi, ma non preoccupatevi, la affronteremo presto
nel seguito.
La memoria di programma esterna e' quella che contiene il codice
e risiede fuori dal chip.
Questa si presenta generalmente sotto forma di una EPROM esterna.
La RAM esterna e' la RAM che risiede fuori dal chip.
Questa si presenta generalmente sotto forma di una RAM statica o di
una FLASH RAM.
La memoria di programma e' quella che contiene le istruzioni che l'8051 deve eseguire.
Questa memoria e' limitata a 64K e viene fornita in diverse forme e formati.
La memoria programma (codice) puo' essere contenuta all'internodel chip sotto forma di ROM oppure di EPROM.
Il codice puo' essere anche memorizzato in una ROM esterna o, piu' comunemente, in una EPROM.
La FLASH RAM e' un altro metodo molto usato per memorizzare un programma.
Possono essere usate diverse combinazioni di tipi di memoria, per esempio: e' possibile avere 4K di memoria di codice nella prom interna del chip e 64K di memoria di codice esterna in una EPROM.
Quando il programma e' memorizzato nella prom interna del chip i 64K massimi si riducono a 4k, 8k o 16k in funzione della versione di 8051 usata.
Ciascuna versione offre specifiche prestazioni. Un modo per distinguere i chip e' quello relativo alla quantita' di ROM/EPROM disponibile internamente.
Comunque, la memoria di programma e' comunemente implementata con una EPROM esterna. Questo e' specialmente vero nei sistemi di sviluppo a basso costo e nei sistemi sviluppati dai studenti.
Oltre alla RAM interna, l'8051 supporta anche la RAM esterna.
Come suggerisce anche il nome, la RAM esterna e' una memoria ad accesso casuale situata fuori dal chip. Essendo esterna, essa non e' flessibile in termini di accesso ed e' anche piu' lenta di quella interna. Per esempio, per incrementare una locazione di RAM interna e' richiesta una sola istruzione ed un solo ciclo d'istruzione, mentre per incrementare una variabile residente nella RAM esterna sono necessarie 4 istruzioni e 7 cicli d'istruzione. In questo caso la memoria esterna diventa 7 volte piu' lenta.
Quello che perde in velocita' lo guadagna pero' in ampiezza. Mentre
la RAM interna e' limitata a 128 bytes (256 bytes nell'8052), quella esterna
puo' arrivare fino a 64K.
Come menzionato all'inizio di questo capitolo, l'8051 include internamente una certa quantita' di memoria. In effetti la memoria interna (On-Chip Memory) e' di due tipi: RAM interna e Area Registri Speciali (SFR memory).
Lo schema della memoria interna dell'8051 e' riportato nella mappa seguente:
Come illustrato nella mappa, l'8051 ha un banco di 128 bytes di RAM interna. Questa tipo di RAM e' la piu' veloce e la piu' flessibile in lettura e scrittura. La RAM interna pero' e' volatile, per cui, quando l'8051 viene resettato essa si cancella.
I 128 bytes di RAM interna sono divisi in porzioni come illustrato nella mappa di memoria.
I primi 8 bytes (00h-07h) sono il banco di registri 0. Cambiando il valore di alcuni registri SFR e' possibile scegliere di usare anche i banchi 1, 2, 3. Questi banchi di registri alternativi risiedono nella RAM interna agli indirizzi da 08h a 1Fh. Discuteremo dei "banchi di registri" con maggior dettaglio in un capitolo successivo. Per ora e' sufficiente sapere che essi esistono e fanno parte della RAM interna.
Anche la memoria a bit risiede nella RAM interna. Parleremo in maniera piu' approfondita della memoria a bit molto presto, ma per ora tenete soltanto a mente che essa risiede nella RAM interna a partire dall'indirizzo 20h fino all'indirizzo 2Fh.
I restanti 80 bytes della RAM interna, dall'indirizzo 30h a 7Fh, possono
essere usati come variabili utente che richiedono accessi frequenti e veloci.
Questa area e' anche utilizzata dal microcontrollore come area di memoria
per le operazioni di stack. Cio' limita moltissimo l'ampiezza dell'area
di stack dell'8051 che e' al massimo di 80 bytes e anche meno. In realta'
gli 80 byte sono usati anche dalle variabili d'utente.
L'8051 usa i registri "R" che sono richiamati da molte delle sue istruzioni.
Questi registri "R" sono numerati da 0 a 7 (R0, R1, R2, R3, R4, R5, R6,
e R7). Essi sono generalmente usati per memorizzare un dato temporaneo
o per muovere dati da una locazione di memoria ad un'altra.
Per esempio, per addizionare il valore di R4 al valore dell' Accumulatore,
noi eseguiremo la seguente istruzione:
Comunque, come mostrato nella mappa di memoria, il registro R4 e' realmente parte della RAM interna, in particolare il suo indirizzo e' 04h. Questo puo' essere visto nella sezione verde della mappa di memoria. Anche l'istruzione seguente ottiene il medesimo risultato:
Ma osservate! Come mostra la mappa di memoria, l'8051 dispone di 4 distinti banchi di registri. All'accensione, l'8051 usa il banco 0 (indirizzi da 00h a 07h) come default. Ma il vostro programma puo' richiedere all'8051 di usare un banco di registri diverso da 0 (es. 1, 2, 3). In questo caso, R4 non si trovera' piu' all'indirizzo 04h. Per esempio, se il programma chiede all'8051 di selezionare il banco di registri numero 3, il registro R4 diventera' sinonimo di RAM interna alla locazione 1Ch.
Il concetto di banchi di registri aggiunge un livello di elevata flessibilita'
all'8051, specialmente quando parliamo di interrupt (affronteremo l'argomento
interrupt piu' avanti). In ogni caso, ricordate sempre che i banchi di
registri risiedono nei primi 32 bytes della RAM interna.
L'8051, e' un microcontrollore orientato alla trasmissione dati e , come tale, da all'utente la possibilita' di accedere ad un numero di variabili a bit. Queste variabili possono assumere o il valore 1 o il valore 0.
Ci sono 128 variabili a bit disponibili all'utente, numerate da 00h a 7Fh. L'utente puo' far uso di queste variabili con comandi quali SETB e CLR. Per esempio, per porre il bit numero 24(hex) al valore 1 dovreste eseguire la seguente istruzione:
e' equivalente a:
SETB 00h
SETB 01h
SETB 02h
SETB 03h
SETB 04h
SETB 05h
SETB 06h
SETB 07h
oppure potreste eseguire quest'altra istruzione:
SETB 80h
I registri speciali (SFR) sono aree di memoria che controllano specifiche funzionalita' dell'8051. Per esempio, 4 registri SFR consentono l'accesso alle 32 linee di input/output dell'8051. Un altro registro SFR consente di leggere e scrivere sulla porta seriale dell'8051. Altri registri SFR permettono all'utente di: impostare il baud rate della seriale, controllare ed accedere ai timer e configurare il sistema degli interrupt dell'8051.
Quando state programmando, i registri SFR vi danno l'illusione di risiedere nella Memoria Interna. Per esempio se volete scrivere il valore "1" alla locazione 50 hex dovete eseguire la seguente istruzione: