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