; Demonstriert den Gebrauch des EEPROMs ; ; Beim Programmieren wird ein im EEPROM definierter Zaehler ; auf Null gesetzt. Mit jedem Restart wird dieser um Eins ; erhoeht 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 Zaehlers im EEPROM ; ; Register definieren .def mpr=R16 ; Universalregister .def neu=R17 ; Zaehlerwert-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) ; uebergib 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 ; uebergeben, da 512 Byte verfuegbar sbi EECR,EERE ; Setze des Read-Enable-Bit EERE im ; EEPROM-Control-Register EECR in neu,EEDR ; Lese das Byte aus dem EEPROM-Speicher ; Erhoehe den Zaehler und gebe ihn in das EEPROM zurueck 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 geaendert werden muss, entfaellt hier ; die Uebergabe der EEPROM-Schreibadresse in EEARL/EEARH out EEDR,neu ; Neuen Wert an das EEPROM-Datenregister ; Die beiden Schreibbefehle duerfen nicht unterbrochen werden, da ; die beiden Schreibbefehle sicherheitshalber nach vier Befehlen ; von der Hardware abgebrochen werden. Daher muessen 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 ; Loest Schreibvorgang im EEPROM aus ; In den folgenden ca. 1,5 Millisekunden wird das Byte ins EEPROM ; geschrieben. Das stoert uns aber nur dann, wenn wieder das EEPROM ; verwendet werden soll. Hier nicht: wir schreiben den invertierten ; Inhalt des Zaehlers 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 gehoert: .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 laeuft, geht das Verifizieren des EEPROM-Inhaltes in ; jedem Fall schief. Das gilt auch fuer jeden Lesezugriff auf das ; EEPROM mit dem Programmiergeraet! ; Der Befehl im ISP, den Prozessor neu zu starten, loest ebenfalls ; Mehrfachstarts aus. Durch Aus- und Einschalten vom Board aus kann ; wirklich getestet werden, ob die Zaehlerei exakt funktioniert.