L' indirizzamento indiretto
Si tratta di un meccanismo che permette l' accesso alla memoria RAM
attraverso un puntatore, che è costituito dal registro FSR e dal registro
INDF.
Il registro INDF appare nella lista degli SFR, ma non è un registro fisico.
Indirizzando INDF effettivamente si indirizza il registro il cui indirizzo è contenuto
in FSR: FSR è un puntatore.
FSR è un registro con 5 bit utili (in 12F508/509): i primi 4 identificano
la locazione nell' area 00h-1Fh e il bit 5 indica il banco di RAM a cui
accedere (00-1Fh, Bank 0 o 20h-3Fh, Bank 1).
Con questo metodo è possibile accede alla RAM del Bank 1.
Ad esempio, la locazione di RAM all' indirizzo 07h contiene il valore
CCh. La locazione 08 contiene il valore 0Ah.
Se carichiamo l' indirizzo 07h in FSR, leggendo INDF si otterrà CCh, ovvero
il valore contenuto nella locazione puntata. Incrementando di uno FSR
(07+1=08) la lettura di INDF renderà 0Ah, dato che ora il puntatore indica la
locazione all' indirizzo 08.
Una applicazione : azzerare la RAM da 10h a 1Fh
MOVLW 0x10
;inizializza il puntatore
MOVWF FSR
;alla locazione da cui iniziare
NEXT CLRF INDF
;azzera indiretto (INDF)
INCF FSR,F
;puntatore + 1
BTFSC FSR,4
;fine area RAM (>1Fh)?
GOTO NEXT
;no, un altro loop
CONT
;si, fine loop |
La lettura INDF (FSR = 0) produrrà 00h. Un tentativo di scrivere
indirettamente INDF si traduce in
nessuna operazione (anche se i bit dello STATUS possono essere modificati).
In PIC16F505, il meccanismo è del tutto analogo, ma, data la maggiore
estensione dei banchi, FSR utilizza un bit in più.
Per riassumere:
- PIC12F508 ha un solo banco di RAM e non richiede manovre per l'
accesso. FSR<7:5> non sono
non implementati e se letti rendono '1'.
- PIC12F509 ha due banchi. Utilizza FSR <5> per l'
accesso al secondo banco. FSR <7:6> non sono implementati e se letti
rendono '1'.
- PIC16F505 ha 4 banchi di RAM. Utilizza FSR<6:5> per l'
accesso ai banchi. FSR <7> è non implementato e se letto rende '1'.
Dopo quanto detto potrebbe essere utile un riepilogo dell' organizzazione della
memoria. Ricordiamo che in base all' architettura Harvard memoria dati e
memoria programma stanno su bus diversi.
Questo comporta che ci sarà un indirizzo 00h per il bus dati, corrispondente
ad una locazione di RAM (in questo caso il registro INDF).
E un indirizzo 00h sul bus della memoria programma, corrispondente ad una
locazione della Flash (in questo caso, il vettore di Reset).
La memoria programma:
- In tecnologia Flash, è organizzata in "bytes" da 12 bit
ciascuno
- Contiene i codici di istruzione e quant' altro serve nell' esecuzione
del programma
- Il suo contenuto è creato dalla compilazione del file sorgente del
programma e resta invariato anche se manca la tensione di alimentazione
- Il suo contenuto non può essere alterato durante l' esecuzione del
programma
- Ci si accede in scrittura e lettura attraverso un dispositivo di
programmazione (ICSP)
- In questi PIC è ripartita in:
- una sola pagina per 12F508
- in due pagine per 12F509 e 16F505
da 512 bytes ciascuna. L' accesso alle pagine si effettua con l' aiuto del
bit PA0 dello STATUS
La memoria dati:
- In tecnologia RAM, è organizzata in bytes da 8 bit ciascuno
- Comprende sia l' area di RAM dati vera propria, sia l' area dei
registri SFR
- Il suo contenuto è modificabile durante l' esecuzione del programma e
va perso se manca la tensione di alimentazione
- Il contenuto della RAM dati è indefinito all' accensione, mentre per
quanto riguarda gli SFR essi sono inizializzati dai default
- Ci si accede in scrittura e lettura attraverso le istruzioni del
programma
- In questi PIC è ripartita in:
- un solo banco per 12F508
- in due banchi per 12F509
- in 4 banchi per 16F505
L' accesso ai banchi si effettua con l' aiuto del con l' aiuto del bit di FSR.
PIC12F508
Memoria |
Tipo |
Bus |
Amp. |
Divisione |
Accesso |
programma |
Flash |
12 bit |
512 |
Pagina 0 |
-
|
dati |
RAM |
8 bit |
25 |
Banco 0 |
- |
SFR |
RAM |
8 bit |
7 |
Banco 0 |
- |
PIC12F509
Memoria |
Tipo |
Bus |
Amp. |
Divisione |
Accesso |
Note |
programma |
Flash |
12 |
1k |
Pagina 0
Pagina 1 |
PA0 = 0 000h-1FFh
PA0 = 1 200h-3FFh |
|
dati |
RAM |
8 |
41 |
Banco 0
Banco 1 |
FSR5 = 0 10h-1Fh
FSR5 = 1 30h-3Fh |
07h-0Fh area comune
accessibile senza commutare i banchi |
SFR |
RAM |
8 |
7 |
accessibili da tutti i banchi |
PIC16F505
Memoria |
Tipo |
Bus |
Amp. |
Divisione |
Accesso |
Note |
programma |
Flash |
12 |
1k |
Pagina 0
Pagina 1 |
PA0 = 0 000h-1FFh
PA0 = 1 200h-3FFh |
|
dati |
RAM |
8 |
72 |
Banco 0
Banco 1
Banco 2
Banco 3 |
FSR6:5 = 00
10h-1Fh
FSR6:5 = 01 30h-3Fh
FSR6:5 = 10 50h-5Fh
FSR6:5 = 11 70h-7Fh |
08h-0Fh area comune
accessibile senza commutare i banchi |
SFR |
RAM |
8 |
8 |
accessibili da tutti i banchi
|
|