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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.