EECR des ATmega8
Bit 7 bis 4 – Res: Reservierte Bits
Diese Bits sind reserviert und werden immer als 0 gelesen.
Bit 3 – EERIE: EEPROM Ready Interrupt Enable
Wenn das I-Bit im SREG – Register und das EERIE-Bit gesetzt sind, ist der EEPROM Ready Interrupt freigegeben. Wenn das Bit gelöscht ist, dann ist der Interrupt gesperrt. Der EEPROM Ready Interrupt erzeugt einen kontinuierlichen Interrupt, wenn das EEWE-Bit gelöscht ist.
Bit 2 – EEMWE: EEPROM Master Write Enable
Dieses Bit muss gesetzt werden, wenn das EEWE-Bit zum Beschreiben des EEPROM gesetzt werden soll. Wenn EEMWE gesetzt ist, bewirkt das Setzen des EEWE-Bits, dass die Daten im EEDR – Register in die Adresse, die im EEAR – Register steht, geschrieben werden. Wenn das EEMWE-Bit gesetzt wurde, wird es durch die Hardware nach 4 Taktzyklen automatisch wieder gelöscht. Es bleibt also nur ein kleines Zeitfenster, um den eigentlichen Schreibvorgang zu starten.
Bit 1 – EEWE: EEPROM Write Enable
Wenn die Adresse und die Daten korrekt eingestellt wurden, muss das EEWE-Bit gesetzt werden, um den Schreibvorgang zu starten, mit dem die Daten in das EEPROM geschrieben werden. Bevor das EEWE-Bit gesetzt wird, muss vorher das EEMWE-Bit auf 1 gesetzt werden, da ansonsten kein Schreibvorgang stattfindet. Der nachfolgende Ablauf muss eingehalten werden, wenn das EEPROM beschrieben werden soll (Die Schritte 3 und 4 sind von der Reihenfolge her egal und können auch schon vorher ausgeführt werden.).
1. Warten, bis das EEWE-Bit null wird.
2. Warten, bis das SPMEN-Bit im SPMCR – Register null wird.
3. Schreiben der EEPROM-Adresse in EEAR.
4. Schreiben der EEPROM-Daten in EEDR.
5. Schreiben einer 1 in das EEMWE-Bit.
6. Schreiben einer 1 in das EEWE-Bit innerhalb von 4 Taktzyklen nach Schritt 5.
Das EEPROM kann nicht programmiert werden während die CPU in den Flash-Speicher schreibt. Die Software muss also überprüfen, ob die Programmierung des Flash-Speichers abgeschlossen ist, bevor ein EEPROM-Schreibvorgang gestartet werden kann. Schritt 2 ist daher nur relevant, wenn die Software im Boot-Sektor erlaubt, den Flash-Speicher zu beschreiben. Wenn in der Software das Beschreiben des Flash-Speichers nicht vorkommen kann, dann kann Schritt 2 entfallen.
Achtung:
Ein Interrupt zwischen Schritt 5 und 6 wird zu einem fehlerhaften Schreibversuch führen, da das Zeitfenster von EEMWE dann überschritten wird. Wenn eine Interruptroutine auf das EEPROM zugreift, wird dadurch ein laufender Zugriff unterbrochen, die Register EEAR und EEDR werden verändert und der durch den Interrupt unterbrochene Zugriff misslingt. Es ist daher zu empfehlen, die Interrupts während der Schritte 4 und 5 global zu sperren.
Wenn der Schreibvorgang beendet ist, wird das EEWE-Bit durch die Hardware automatisch gelöscht. Der Zustand des Bits kann also durch die Software permanent abgefragt werden, um das Ende des Schreibvorganges zu erkennen. Wenn das EEWE-Bit mit einer 1 gesetzt wurde, wird die CPU für zwei Takte angehalten, bevor der nächste Befehl ausgeführt wird.
Bit 0 – EERE: EEPROM Read Enable
Wenn die Adresse korrekt eingestellt wurde, muss das EERE-Bit gesetzt werden, um den Lesevorgang zu starten. Das Bit wird durch die Hardware gelöscht, wenn die Daten ausgelesen und im EEDR abgelegt wurden. Da der lesende Zugriff auf das EEPROM nur einen Befehl lang ist, ist es nicht erforderlich, das EERE permanent abzufragen und so das Ende des Lesevorganges abzuwarten. Wenn das EERE-Bit gesetzt wurde (also das Auslesen beginnt) wartet die CPU 4 Taktzyklen lang bevor der nächste Befehl ausgeführt wird.
Der Anwender sollte das EEWE-Bit abfragen, bevor ein Lesevorgang gestartet wird. Wenn während eines laufenden Schreibvorganges das EEPROM-Adress – oder EEPROM-Daten – Register mit einem neuen Wert beschrieben wird, wird der Schreibvorgang unterbrochen und das Ergebnis wird undefiniert sein.
Nachfolgende Tabelle zeigt die typischen Programmierzeiten des EEPROMs, die zeitliche Steuerung erfolgt durch den RC-Oszillator.
Parameter |
Anzahl der RC-Oszillator Takte |
Typische Programmierzeit |
EEPROM schreiben |
8448 |
8,5 ms |
Werte bei 1MHz Taktfrequenz, unabhängig von den CKSEL Fuses.
Die Folgenden Programmbeispiele zeigen den Schreibvorgang für das EEPROM. Die Beispiele unterstellen, dass keine Interrupts auftreten können und der Flash nicht durch ein Programm im Boot-Sektor beschrieben wird.
Codebeispiel EEPROM schreiben
Das nächste Beispiel zeigt den Lesevorgang des EEPROMs. Dabei ist wieder unterstellt, dass keine Interrupts auftreten können.
Codebeispiel EEPROM lesen