Pfad: Home => AVR-Übersicht => Hardware => EEPROM

; Demonstriert den Gebrauch des EEPROMs

;
; Beim Programmieren wird ein im EEPROM definierter Zähler
; auf Null gesetzt. Mit jedem Restart wird dieser um Eins
; erhöht und sein Inhalt auf den LEDs in Hex ausgegeben.
; Siehe unbedingt die Hinweise am Ende dieses Programmes!
;
.NOLIST
.INCLUDE "8515def.inc"
.LIST
;

; Konstanten definieren

;
.equ   cnt=$0000 ; Adresse des Zählers im EEPROM
;

; Register definieren

.def   mpr=R16 ; Universalregister
.def   neu=R17 ; Zählerwert-Zwischenspeicher
;

; Reset-/Interrupt-Vektoren

   RJMP   main ; Sprung zum Hauptprogramm
;
main:
   LDI   mpr,$FF ; alle Bits von Port B sind Output
   OUT   DDRB,mpr

; Programm holt ein Byte aus dem Epromspeicher

   LDI   mpr,LOW(cnt) ; Übergib die zu lesende Adresse
   OUT   EEARL,mpr ; im EEPROM an den EEPROM-Port
   LDI   mpr,HIGH(cnt) ; Low/High-Byte wird separat
   OUT   EEARH,mpr ; übergeben, da 512 Byte verfügbar
   SBI   EECR,EERE ; Setze des Read-Enable-Bit EERE im
       ; EEPROM-Control-Register EECR
   IN   neu,EEDR ; Lese das Byte aus dem EEPROM-Speicher
; Erhöhe den Zähler und gebe ihn in das EEPROM zurück
   INC   neu
wart:

; Wenn das EEPROM nicht fertig ist, muss erst gewartet werden

   SBIC   EECR,1 ; Frage Bit 1 im EEPROM-Control-Register
   RJMP   wart ; ab und wiederhole bis EEPROM ready meldet
; Da die EEPROM-Adresse nicht geändert werden muss, entfällt hier
; die Übergabe der EEPROM-Schreibadresse in EEARL/EEARH
   OUT   EEDR,neu ; Neuen Wert an das EEPROM-Datenregister
; Die beiden Schreibbefehle dürfen nicht unterbrochen werden, da
; die beiden Schreibbefehle sicherheitshalber nach vier Befehlen
; von der Hardware abgebrochen werden. Daher müssen die Interrupts
; (hier nicht eingeschaltet) hier abgeschaltet werden!
   CLI

; Jetzt kommen die beiden Schreibbefehle:

   SBI   EECR,EEMWE ; Schaltet EEPROM Master Write Enable ein
   SBI   EECR,EEWE ; Löst Schreibvorgang im EEPROM aus
; In den folgenden ca. 1,5 Millisekunden wird das Byte ins EEPROM
; geschrieben. Das stört uns aber nur dann, wenn wieder das EEPROM
; verwendet werden soll. Hier nicht: wir schreiben den invertierten
; Inhalt des Zählers in den Port B an die LEDs und beenden das
; Programm mit einer unendlichen Schleife:
   COM   neu ; invertieren
   OUT   PORTB,neu ; an Port B
loop:   RJMP   loop ; unendlich warten

; Hier beginnt nun das Nullsetzen des EEPROMs beim Programmieren

; Zuerst wird dem Assembler mitgeteilt, dass der folgende Code in
; das EEPROM gehört:
.ESEG

; Jetzt kommt der EEPROM-Inhalt:

.DB   $00 ; Ein Byte mit Null
; Das war es.

; Beim Programmieren muss der Inhalt des EEPROM-Files TESTEEP.EEP
; separat geladen und mitprogrammiert werden! Nicht vergessen!
; Da beim Verifizieren nach dem Programmieren zwischendurch der
; Reset aufgehoben wird und der Prozessor schon einmal durch das
; Programm läuft, geht das Verifizieren des EEPROM-Inhaltes in
; jedem Fall schief. Das gilt auch für jeden Lesezugriff auf das
; EEPROM mit dem Programmiergerät!
; Der Befehl im ISP, den Prozessor neu zu starten, löst ebenfalls
; Mehrfachstarts aus. Durch Aus- und Einschalten vom Board aus kann
; wirklich getestet werden, ob die Zählerei exakt funktioniert.


©2002 by http://www.avr-asm-tutorial.net