I.a. sind die Register zu wertvoll, um sie mit Konstanten zu belegen. Für diesen Zweck besitzt der 16C84 64 Datenregister, die man indirekt beschreiben und ebenso wieder auslesen kann. Das Schreiben in die Register kann softwaremäßig im Programm erfolgen. Man kann also Konstanten im EEPROM-Datenspeicher in einem separaten Vorgang abgelegen. Sie bleiben nach Löschen des Schreibprogramms erhalten, so dass man später keinen Speicherplatz im Anwendungsprogramm dafür benötig. Im folgenden werden zwei Methoden vorgestellt, mit deren Hilfe man Daten in das EEPROM schreiben kann. Die Vorgehensweise entspricht der indirekten Adressierung. Auch hier existieren zwei Register: ee_adr equ 8, das den Zeiger auf die zu beschreibende Stelle enthält und ee_data equ 9, in das man die Daten schreibt. Das Auslesen der Daten erfolgt analog. Die Kommentare erläutern, was beim Schreibvorgang im einzelnen geschieht. Das mitgelieferte Programm p84ld.exe (p84 - lies Data) ermöglicht es, das Daten-EEPROM auszulesen
;********************************************************************* ee_demo.asm
read_data
prog_data
END
; demonstriert, wie man softwaremäßig in das Daten-EEPROM schreibt
list P = 16C84
status equ 3
portb equ 6
ee_data equ 8 ; Seite 0
ee_adr equ 9 ; Seite 0
ee_con1 equ 8 ; Seite 1
ee_con2 equ 9 ; Seite 1
org 3ff
goto start
org 0
start
bsf status,5 ; Seite 1 einstellen um ins Register ee_con1 (Seite1)
clrf ee_con1 ; schreiben zu können
bsf ee_con1,2 ; enable write
bcf status,5 ; wieder auf Seite 0 umschalten
main
movlw 01
movwf ee_adr ; das folgende
Datum wird nach Adresse 01 geschrieben
movlw 08 ; Daten, die ins Daten-EEPROM geschrieben werden sollen
call prog_data ; werden beim Aufruf des Programmierens in w übergeben
incf ee_adr ; Adress-Zähler
um eine Stelle erhöhen
movlw 04
call prog_data
movlw 02
; Adresse für das Auslesen festlegen
movwf ee_adr ; und nach ee_adr
schreiben
call read_data ; der Wert in ee_adr wird im
w-Register zurückgegeben
movwf portb ; und
(z.B.) nach portb geschrieben
goto main
bsf status,5 ;Seite 1
einstellen
bsf ee_con1,0 ;auslesen, der Wert
steht jetzt in ee_data
nop
bcf status,5 ; wieder
Seite 0 einstellen
movf ee_data ; Wert aus
ee_data in w zurückgeben
return
bsf status,5 ; Wechsel nach Seite 1
neu_prog
movlw 055
; write. init: Durch das aufeinanderfolgende Schreiben
movwf ee_con2 ; von 55h und AAh
nach ee_con2
movlw 0aa
movwf ee_con2
bsf ee_con1,1 ; start write
nop
; Schreiben im Daten-EEPROM sind zeitkritisch: Nach jedem
nop
; Schreiben kurze Zeit warten
loop3
btfsc ee_con1,1 ; Schreibvorgang abgeschlossen?
goto loop3
; nein: warte, bis Bit 1 von ee_con1 wieder auf 0 geht
btfsc ee_con1,3 ; ja: Überprüfe, ob fehlerfrei gelesen
wurde
goto neu_prog ; Bei gesetztem Fehlerbit wiederhole
Schreibvorgang
bcf status,5 ; sonst: Schalte auf Seite 0 um
return
Man kann sich allerdings das Leben noch einfacher machen, wenn man das Programm p84d.exe zum Schreiben der EEPROM-Daten benutzt. Dazu muss man im Assemblerprogramm das Kennwort eedata einfügen. Das Programm p84d.exe <filename> sucht danach und schreibt die folgenden Daten an die richtige Stelle im Daten-EEPROM. Das folgende Programmbeispiel erläutert den Vorgang.
;************************************************************************ ee_read.asm
; Die EEPROM-Daten werden mit dem Programm p84d.exe <filename>ins Daten-EEPROm
; geschrieben. Das Programm sucht das Schlüsselwort eedata adr:(im Kommentar) und beginnt
; die dann die folgenden Daten ab Adresse adr zu schreiben
; eedata 00 : 00 01 02 04 08 10 20 40 80
; Konstanten und Register wie oben
start
movlw 09
movwf counter
main
movf counter,0 ; den Wert von counter als offset
movwf ee_adr ; in ee_adr laden und damit Adresse im EEPROM bestimmen
decf ee_adr ; ee_data-offset = counter-1
read_data
movwf portb
call verz
decfsz counter,1 ; Zähler erniedrigen: ist count schon gleich 0 ?
goto main ; nein: nächsten Wert aus der Tabelle holen
movlw 09 ; ja: Offeset wieder auf Tabellenende
stellen
movwf counter
goto main
read_data ;read_data: s.o.
verz
; übliche Verzögerungs-Routine
end
© Dietrich Praclik