De EEPROM
De EEPROM kan bijvoorbeeld worden gebruikt in een programma om constanten, calibratiefactoren, etc in
te bewaren. De gegevens in de EEPROM blijven behouden, ook wanneer de
voedingsspanning wordt weggenomen.
LET OP: Een EEPROM cel kan minimaal 10.000 keer geprogrammeerd en
gewist worden. Meer dan voldoende wanneer U het EEPROM gebruikt om
relatief constate gegevens in te laden. Wanneer U echter in een programma een EEPROM cel
herhaald programmeert (het EEPROM kan per byte geprogrammeerd worden) dan
is de 10.000 keer snel bereikt. Daarna is er geen garantie meer dat het
EEPROM nog goed is. Let dus op dat Uw programma niet continu één of meer
bytes in het EEPROM wist en opnieuw programmeert.
Wanneer een EEPROM byte gewist is, bevat het $FF. Door te programmeren
kan een bit van '1' in '0' veranderd worden. Wanneer een bit van een '0'
in een '1' veranderd moet worden, moet het betreffende byte eerst gewist
worden. Programmeren van een byte en wissen van een byte duren elk
maximaal 10ms.
Bescherming tegen programmeren
Standaard is het EEPROM beschermd tegen ongewild programmeren of
wissen. Het BPROT register bevat 4 bits, die elk een gedeelte van het
EEPROM beschermen tegen programmeren of wissen. Wanneer U het EEPROM dus
wilt programmeren, moet eerst dit BPROT register veranderd worden. Het
gedeelte van het EEPROM dat door de respectievelijke BPRT bits beschermd
wordt is:
|
bit
|
beschermd gebied
|
lengte van het gebied
|
|
BPRT0
|
$B600 - $B61F
|
32 bytes
|
|
BPRT1
|
$B620 - $B65F
|
64 bytes
|
|
BPRT2
|
$B660 - $B6DF
|
128 bytes
|
|
BPRT3
|
$B6E0 - $B7FF
|
288 bytes
|
Als alle bits op '1' staan, is dus het hele EEPROM beschermd. Dit
gebeurt automatisch na opstarten van de micro-controller.
Nadat het BPROT register is aangepast door de juiste bits op '0' te
zetten, kan het EEPROM gewist en geprogrammeerd worden. Programmeren en
wissen gaat door middel van het PPROG register.
Wissen
Wissen kan per byte, per blok van 16 bytes, en ook is het mogelijk het
hele EEPROM in één keer te wissen.
Blokken van 16 bytes beginnen steeds op een adres waarvan de laatste 4
bits '0' zijn ($B600 - $B60F, $B610 - $B61F, $B620 - $B62F, etc...)
De procedure is als volgt:
- Maak het EELAT bit en het ERASE bit in het PPROG register een '1'.
Indien één byte gewist moet worden, maak dan tevens het BYTE bit een
'1'. Indien een blok van 16 bytes gewist moet worden, maak dan in plaats
van het BYTE bit, het ROW bit een '1'. Indien U zowel het BYTE bit als het
ROW bit een '0' laat, wordt het gehele EEPROM gewist. Indien beide bits
een '1' zijn, zal er één byte gewist worden.
- Schrijf een willekeurige waarde naar het byte dat gewist moet
worden, of op een adres in het blok van 16 bytes dat gewist moet worden.
- Maak nu naast de bits die in de eerste stap op '1' gezet werden, ook
het EEPGM bit een '1'.
- Wacht 10ms.
- Zet alle bits in het PPROG register weer op '0'.
Programmeren
De procedure om één byte te programmeren is als volgt:
- Maak het EELAT bit in het PPROG register een '1'.
- Schrijf de te programmeren waarde naar het byte dat geprogrammeerd
moet worden.
- Maak nu naast het EELAT bit dat in de eerste stap op '1' gezet werd,
ook het EEPGM bit een '1'.
- Wacht 10ms.
- Zet alle bits in het PPROG register weer op '0'.
Wanneer alle bytes geprogrammeerd zijn, is het verstandig de
beschermings-bits in het BPROT register weer op '1' te zetten.
Een voorbeeld van een routine om één byte te programmeren is
hieronder gegeven. Tijdens programmeren van de EEPROM is de EEPROM niet
toegankelijk.
* delay 10ms
dly10 equ $
pshx |bewaar register op de stack
ldx #20000/6 |10ms gedeeld door aantal cycles in de lus
dly100 dex
bne dly100 |eind van wachtlus
pulx |haal register terug van de stack
rts
* schrijf een byte in (B) naar de EEPROM op adres (X)
* indien nodig wordt de locatie eerst gewist
eewrite equ $
psha |bewaar de registers
cmpb 0,x
beq eewrite9 |ga terug indien het byte al in het eeprom staat
pshb
comb
orab 0,x |kijk of de lokatie gewist moet worden
comb |omdat er een '0' in een '1' veranderd moet worden
pulb
beq eewrite1 |zoniet, sla dan het wissen over
ldaa #((byte)or(erase)or(eelat))
staa pprog |kies het wissen van één byte
stab 0,x |adresseer het adres dat gewist moet
oraa #eepgm |en start het wissen
staa pprog
bsr dly10 |wissen duurt 10ms
clr pprog |stop daarna het wissen
cmpb 0,x |en kijk of het byte de juiste waarde heeft
beq eewrite9 |zoja, sla dan het programmeren over
eewrite1 ldaa #eelat
staa pprog |kies programmeren van één byte
stab 0,x |schrijf de data naar het eeprom
ldaa #(eelat+eepgm)
staa pprog |start het programmeren
bsr dly10 |programmeren duurt 10ms
clr pprog |stop daarna het programmeren
eewrite9 pula |haal de registers terug
rts
De registers die de besturing van de EEPROM verzorgen
BPROT $1035
|
-
|
-
|
-
|
ptcon
|
bprt3
|
bprt2
|
bprt1
|
bprt0
|
PPROG $103B
|
odd
|
even
|
-
|
byte
|
row
|
erase
|
eelat
|
eepgm
|
|