EEPROM schreiben/lesen

Gast #221632
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
Gast #221634
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
Gast #221636
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
Gast #221637
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
Gast #221638
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
Gast #221639
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
#221641
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren