Forum: Mikrocontroller und Digitale Elektronik EEPROM des AT89S8252 ansprechen


von Rüdiger (Gast)


Lesenswert?

Hallo,

bin Anfänger und versuche gerade mittels dem Flashboard von Elektor mir 
C mit Mikrocontrollern beizubringen.
LEDs blinken und serielle Kommunikation funktionieren soweit.
Jetzt möchte ich eine Variable im EEPROM speichern, die ich nach dem 
Einschalten wieder auslesen kann.

z.B:
Lies Variable z.B. 5  ->  Blinke 5x  ->  schreibe 6 ins EEPROM

Ich verwende den SDCC. Eine eeprom.h gibt es nicht. Habe in einem Forum 
gelesen, das Assembler-Code entsprechend angepasst werden muss. Dies 
überfordert meinen momentan noch geringe Kenntnisse.
Gibt es hier nicht eine einfache Lösung?


Danke
Rüdiger

von Joe (Gast)


Lesenswert?

Rüdiger,

das ist eigentlich im Datenblatt beschrieben. Wenn die entsprechenden 
BIT's gesetzt sind dann ist es wie ein Speicherzugriff im XRAM. An die 
folgende Funktion übergibst du die Adresse (wo soll gespeichert werden) 
sowie das entsprechende Datenwort (das was du Speichern willst).
1
void SaveEeprom (unsigned int address, unsigned char Data)  {
2
  xdata unsigned char *XEEPData;  
3
  XEEPData = (xdata *) address;
4
  WMCON |= WMCON_EEMEN;                     // Enable EEPROM
5
  WMCON |= WMCON_EEMWE;                     // Enable Write EEPROM
6
  *XEEPData = Data;                         // save Data
7
  while (!(WMCON & WMCON_WDTRST));          // check busy Flag                                  
8
  WMCON &= 0x77;                            // disable EEPROM
9
}

Beim lesen siehts dann folgendermaßen aus:
1
unsigned char ReadEeprom (unsigned int address)  {
2
  xdata unsigned char *XEEPData;
3
  unsigned char Data;
4
  XEEPData = (xdata *) address;    
5
  WMCON |= WMCON_EEMEN;                     // EEPROM Enable
6
  Data = *XEEPData;                         // read Data
7
  WMCON &= 0xF7;                            // disable MOVX EEPROM
8
  return Data;
9
}

Also Adresse die Gelesen werden soll und du erhälts den Inhalt der 
Speicherzelle zurück.

Das Ganze ist mit SDCC getestet, liegt also nicht am Compiler ;-))

von Rüdiger (Gast)


Lesenswert?

Danke Joe,

funktioniert einwandfrei!


Rüdiger

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.