Può essere utile fare qui una breve digressione sul tema
della dichiarazione delle costanti in FLASH attraverso l' Assembly.
Infatti l' area di Memoria Programma non contiene solamente
i bytes del programma intesi come opcodes, ma anche tutti quei dati o
tabelle che sono necessari al suo funzionamento.
E si possono ricordare le lookup tables per la conversione di dati, per l'
aggiustamento di misurazioni o la generazione di segnali; e, inoltre, le
stringhe di messaggi o di caratteri, ecc.
Tutte queste costanti vanno inserite attraverso il sorgente
nelle giuste posizioni di memoria e sarnno poi accessibili attraverso il
sistema delle istruzioni TBL ora viste.
DB
Un primo modo offerto dall' Assembly per caricare questi
dati è l' assegnazione con la direttiva DB (Declare Byte):
ORG 0x100
DB 0x30, 0x31
DB 0x20,
0x40
|
il che origina in
memoria la seguente situazione:
0x100 = 0x30
0x101 = 0x31
0x102 = 0x20
0x103 = 0x40
La scrittura dei valori a coppie non è casuale, in quanto
MPASM, per i PIC18, lavora a word (16 bit), per cui:
ORG 0x100
DB 0x30
DB
0x31
DB 0x20
DB 0x40
|
origina:
0x100 = 0x30
0x101 = 0x00
0x102 = 0x31
0x103 = 0x00
0x104 = 0x20
0x105 = 0x00
0x106 = 0x40
0x107 = 0x00
ovvero completa una linea di 1 byte portando a 0 il byte
successivo.
MPASM contiene questo meccanismo di "parità"
dovuto al fatto che, come abbiamo visto, le istruzioni del set enhanced sono
su 2 o 4 bytes. Un tentativo di porre una istruzione a partire da un
byte dispari da origine ad una segnalazione di errore. Per evitare la
situazione impropria, MPASM "riempie" i byte dispari delle
assegnazioni DB in modo da evitare che una situazione tipo:
ORG 0x100
data
DB 0x30
movlw data
|
faccia ritrovare l' istruzione a partire da 0x101.
DW
Uno statement specifico che assegna 1 word è DW, che, per i
PIC18 funziona come DB:
setup DW
39, "Diagnostic", (d_list*2+d_offset)
limit DW base-1
|
DA
Altro statement per l' assegnazione di costanti è DA:
ORG 0x100
DA
"abcdef"
limiti DA "12345678"
|
origina:
0x100 = 30E2
31E4 32E6 3380
0x108 = 18B2 19B4 1AB6 0000
In sostanza DA genera un numero packed a 14 bit
rappresentante due caratteri ASCII a 7 bit. E' utile per immagazzinare
stringhe numeriche nella Memoria Programma.
DATA
Per inizializzare una o più words nella Program Memory con
dati di qualsiasi genere è l' uso dello statement DATA.
Le stringhe possono essere costituite anche da caratteri ASCII, inclusi tra
apici, come pure possono essere trattati singoli caratteri, che vengono
impaccati nel byte basso della word, azzerando l' altro byte
message DATA
"Test 1-2-3" ; stringa di testo
DATA
'Y'
; carattere singolo
DATA 1,
2, ext_label ; costanti + label esterna
DATA
base+10 ; costante
DATA
start ;
label rilocabile |
DT
Per generare delle tabelle RETLW si utilizza lo statement DT.
Si possono tabellare sia caratteri ASCII che valori numerici
table
DT "Questo è un
messaggio",0
table1 DT
primovalore, secondo valore, terzo valore |