Forum: Mikrocontroller und Digitale Elektronik EEPROM schreiben/lesen


von Sebastian Barth (Gast)


Lesenswert?

Hi,

ich benutze den AT98C51ED2 von Atmel. Dieser hat ein 2kB EEPROM,
welches ich gerne nutzen möchte. :)

Aus der Manual werde ich einfach nicht schlau (als Anlage beigefügt).
Ich check es einfach nicht!

Kann mir bitte einer erklären, wie ich in das EEPROM schreibe, auslese?


Wäre echt super!


Danke im Voraus.

liebevoll .. Sebastian Barth

von Sebastian Barth (Gast)


Angehängte Dateien:

Lesenswert?

Manual vergessen. :)

von sash (Gast)


Lesenswert?

hi, ich hab das gleiche problem wie du. versuch das ganze in c
hinzubekommen. wenn du schon irgendetwas hast was funktioniert (egal ob
assembler, basecom) koenntest des ja posten oder mir schicken.
werds selber auch weiter probieren und dann hier posten (wenns laeuft)

sash

von Läubi (Gast)


Lesenswert?

Im Turorial auf deiser Seite ist doch beschrieben wie man aufs EEProm
zugreift...

von sash (Gast)


Lesenswert?

ja fuer den avr, aber nicht fuer den 89c51ed2 (8051er).
das datenblatt versteh ich ja soweit, nur das dptr is nicht direkt
vorhanden. dafuer zwar des dpl und dph. aber soweit komm ich eigentlich
gar nicht weill mein eeprom anscheinend sehr beschaeftigt ist, auch wenn
ich alle interrupts deaktiviere. auch wenn ich die abfrage uebergehe, ob
das busyflag gesetzt is, funktionierts net.

sash

von Michael (Gast)


Lesenswert?

Da gibt es doch nicht so viel zu kapieren.
Seite 91 bis 94 anschauen.
Die Flussdiagramme sagen doch alles.

Schreib doch mal was nicht funktioniert, oder was Du am Flussdiagramm
nicht verstehst.

Michael

von sash (Gast)


Lesenswert?

hier mal kurz mein ansatz:

void write (unsigned int adresse, unsigned char wert)
{
  EA = 0;
  while (EECON =! 0) {;}   // warten eebusy = 0
  DPL = adresse;
  EECON = 0x02;
  DPL = wert;
  EECON = 0x00;
  EA = 1;
}

unsigned char read (unsigned int adresse)
{
  EA = 0;
  while (EECON =! 0) {;}
  DPL = adresse;
  EECON = 0x02;
  wert = DPL;
  EECON = 0x00;
  EA = 1;
  return (wert);
}

hatte es anstatt mit while (eecon != 0) auch mit eebusy probiert,
wobei ich eebusy so festgelegt hab: Sbit (EEBUSY , 0xD2, 0)
blieb dann aber immer in der while schleife haengen. hab se dann
einfach ganz rausgenommen, klappt aber trotzdem nicht

sash

von Michael (Gast)


Lesenswert?

while (EECON =! 0) // Falsche Syntax
while (EECON != 0);// Ist richtig

cli();        // Interrupts sperren

Dann als Assembler...

out EEAR, address                 ; EEPROM-Adresse
sbi EECR, EERE                    ; Lesevorgang starten
in data, EEDR                     ; gelesenes Byte nach "data"

sei();      // Interrupts freigeben
Michael

PS: Ist aus dem Tutorial von dieser Seite

von Sebastian B. (lufti)


Lesenswert?

Und mit dem Befehlssatz vom 8051? :)

von Peter D. (peda)


Lesenswert?

Der EEPROM wird in den XDATA-Space gemappt, unter C also die Adresse zu
einem xdata-Pointer casten und dann einfach das Byte reinschreiben und
dann warten bis das Schreiben beendet ist, das nächste Byte usw.

Bzw. in Assembler:
1
  mov eecon, #002h
2
  mov dptr, #Adresse
3
  mov a, #Daten
4
  movx a, @dptr
5
busy:
6
  mov a, eecon
7
  jb acc.0, busy
8
  mov eecon, #000h


Peter

von Sebastian B. (lufti)


Lesenswert?

Super! Vielen Dank!

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.