För *helt* slippa tänka på adresser, så kan man även göra så här :
Kod: Markera allt
VARS UDATA
cntr1 RES 1
cntr2 RES 1
cntr3 RES 1
Detta
allokerar cntr1-3 i första bästa *lediga* minne.
Använd sedan BANKSEL i koden så att bank-bitarna sätts korrekt.
Notera att det dock inte spelar någon roll i *vilken* bank variablerna hamnar,
BANKSEL kommer automatiskt att ta hand om det och det är alltså helt
ointressant (eller i alla fall oviktigt) vilka adresser de olika variablerna
hamnar på. Om du ända vill veta (kan finnas många orsaker till det)
så finns det redovisat i MAP filen.
Eller :
Kod: Markera allt
VARS UDATA_SHR
cntr1 RES 1
cntr2 RES 1
cntr3 RES 1
Detta
allokerar cntr1-3 i "non-banked memory", D.v.s på 16F628A i h'70' - h'7F'.
Fördelen med detta är att de alltid fungerar oavsett hur bank-bitarna är satta.
Notera också att användnigen av UDATA/UDATA_SHR alltså betyder att
man skriver kod i "relocatable mode" och det förutsätter att man har
lagt till ett "linker script" (LNK fil) till projektet.
Ovanstående kod anpassar sig automatiskt när man byter processor modell.
Alltså mycket mer "porterbar" kod.
EQU är det
absolut sämsta sättet att ange adresser till variabler !!
Notera att det enbart sätter ett värde på en symbol, det (vilket många tror)
allokerar
INTE minnesadresser ! MPASM har inte en aning om att
ctrl1-3 representerar adresser till RAM minnet !
CBLOCK är i princip lika dåligt, det sätter också bara ett värde på en symbol,
det allokerar inte minne !
Problemer med båda dessa är att du inte kommer att få någon varning/fel
om du t.ex skriver :
(notera två variabler på samma värde !) eller
Kod: Markera allt
CBLOCK 0x20
cntr1
cntr2
cntr3
ENDC
CBLOCK 0x23
var1
var2
var3
ENDC
och sedan kommer man på att man även behöver en ctrl4 och det blir
Kod: Markera allt
CBLOCK 0x20
cntr1
cntr2
cntr3
cntr4
ENDC
CBLOCK 0x23
var1
var2
var3
Notera att ctrl4 och var1 nu har
sammavärde !
(Jag vill inte säga "samma adress" eftersom MPASM inte vet att det är just adresser...)
Fel som det här kan vara ett litet helvete att hitta.
Med relocatable code och UDATAxxx så är detta helt omöjligt. MPASM/MPLINK
allokerar aldrig samma minnes adress till olika symboler (om man inte använder
UDATA_OVR, vilket är specifikt till för just det).
Använd gärna EQU och CBLOCK för att ge alla andra symboler värden,
men inte för de symboler som ska representera minnesadresser.