Im Rahmen meines Funkuhr-Projektes entstand die Notwendigkeit, auf einem ATMega32 den EEPROM zu benutzen, um die eingestellte Weckzeit auch bei Stromausfällen speichern zu können.

Der ATMega32 verfügt über 1024 Byte EEPROM-Speicher, welcher mindestens 100.000 mal neu beschrieben/gelöscht werden kann. Um den Zugriff auf ihn zu ermöglichen, besitzt der MC je ein spezielles Adress-, Daten- und Kontrollregister.

Das Adressregister (EEARH + EEARL) besteht aus zwei Bytes. Benötigt werden nur die unteren 10 Bit (2^10 = 1024). Mir seiner Hilfe kann der EEPROM linear adressiert werden. Für jegliche Zugriffe muss das Register einen vernünftiger Wert (0:1023) enthalten.

Das Datenregister (EEDR) besteht aus einem Byte. Bei einem Schreibzugriff beinhaltet es das in die Adresse von EEAR zu schreibende Byte. Bei einem Lesezugriff enthält es das an der Adresse in EEAR gelesene Byte.

Das Kontrollregister (EECR) besteht aus einem Byte, von dem jedoch nur 4 Bit genutzt werden:

Bit 3 - EERIE (EEPROM Ready Interrupt Enable)
Dieses Bit (de)aktiviert den EEPROM Interrupt. Dieser wird ausgelöst, wenn EEWE gelöscht wird.

Bit 2 - EEMWE (EEPROM Master Write Enable)
Dieses Bit legt fest, ob ein Setzen von EEWE auf '1' einen Schreibvorgang auf dem EEPROM auslösen soll. Ist es '0', bleibt das Setzen von EEWE ohne Wirkung. Soll ein Wert in die durch EEAR definierte Adresse geschrieben werden, so muss zuerst EEMWE gesetzt werden. Dann muss innerhalb von 4 Taktzyklen EEWE gesetzt werden. EEMWE wird automatisch per Hardware nach 4 Taktzyklen gelöscht.

Bit 1 - EEWE (EEPROM Write Enable)
EEWE liefert das eigentliche Schreibsignal für den EEPROM. Die folgenden Schritt müssen für einen Schreibvorgang ausgeführt werden:

  1. Warten, bis EEWE Null ist.
  2. Warten, bis SPMEN in SPMCR Null ist.
  3. Optional Schreiben einer neuen Adresse in EEAR.
  4. Optional Schreiben neuer Daten in EEDR.
  5. Schreiben einer '1' in EEMWE und löschen von EEWE in EECR.
  6. Innerhalb von 4 Taktzyklen nach dem Setzen von EEMWE muss EEWE gesetzt werden.

Da während der Programmlaufzeit der Flash nicht beschrieben wird (es wird kein Bootloader verwendet), kann der zweite Schritt entfallen.
Um einen ordnungsgemäßen Zugriff auf den EEPROM zu haben, sollten alle Interrupts während der obigen Schritte deaktiviert sein (Ausführen von cli ();).
Nach einem Schreibzugriff wird EEWE per Hardware gelöscht. Dies kann der Programmierer durch Polling abfragen, um gleich nach dem Löschen des Bits zum Schreiben des nächsten Bits übergehen zu können.

Bit 0 - EERE (EEPROM Read Enable)
EERE ist das Lesesignal für den EEPROM. Wird es auf '1' gesetzt und steht in EEAR eine zuordenbare Adresse, steht im nächsten Zyklus in EEDR das gelesene Byte. Ein solcher Zugriff benötigt lediglich einen Befehlszyklus. Es wird empfohlen, vor einem Lesezugriff EEWE zu pollen (prüfen, ob es Null ist), da falls ein Schreibzugriff gerade statt findet, kein Zugriff auf EEAR bzw. den EEPROM möglich ist.

Ein integrierter Oszillator ist für das Timing des EEPROM zuständig. Dieser arbeitet mit 1MHz, unabhängig von den Fuse-Bit Einstellungen (CKSEL) des Benutzers. So dauert ein Schreibzugriff 8448 Taktzyklen, was einer Zeit von 8,5ms entspricht.

Nun zur Programmierung:

Ein Schreibzugriff sollte die folgende Form haben:

void EEPROM_write (unsigned short address, unsigned char data) {
cli ();
while (EECR & (1<<EEWE));
EEAR = address;
EEDR = data;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
sei ();
}

Ein Lesezugriff sollte etwa so aussehen:

unsigned char EEPROM_read (unsigned short address) {

while(EECR & (1<<EEWE));
EEAR = address;
EECR |= (1<<EERE);
return EEDR;
}

Wie man sieht, ist der Zugriff auf den EEPROM an sich eine einfache Sache. Man sollte aber beachten, bei Programmänderungen o.ä. den EEPROM zu löschen, da die in ihm enthaltenen Daten normale Flash-Programmierzyklen überstehen. Sonst kann es bei der Datenauswertung o.ä. Anwendungen zu Problemen kommen, wenn die enthaltenen Daten in keinem Kontext mehr zur aktuellen Software stehen.
Als Nachteil sehe ich hauptsächlich seine Trägheit an (8,5ms können ganz schön lang sein). Ansonsten stellt er ein prima Feature dar.

 

Zurück zur Startseite.