Daten im EEPROM

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
; 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

read_data  
   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

prog_data
   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

  END

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

Zurück

© Dietrich Praclik