mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit EEPROM Attiny2313


Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eigentlich glaubte ich, inzwischen Mikrocontroller-Datenblätter lesen zu 
können. Diesmal brauche ich aber etwas Hilfe:

Ich möchte "einfach" Werte ins EEPROM eines Attiny2313 schreiben und sie 
daraus lesen.
Leider scheint das Schreiben jedoch schon schiefzugehen, da ich stets 
0xFF auslese, egal was ich vorher hineingeschrieben habe.

Die Schreibfunktion habe ich gemäß Datenblatt erstellt:
void EEPROM_write(unsigned int addr, unsigned char data){
  /* Wait for completion of previous write */
  while(EECR & (1<<EEPE));
  /* Set up address and data registers */
  EEAR = addr;
  EEDR = data;
  /* Write logical one to EEMPE */
  EECR |= (1<<EEMPE);
  /* Start eeprom write by setting EEPE */
  EECR |= (1<<EEPE);
  while(EECR & (1<<EEPE));
  return;
}

Der Controller läuft mit 8MHz Int. RC-Oszillator.

Das Merkwürdige daran: Selbst im "AVR-Simulator" tritt der gleiche 
Effekt auf. Es scheint, als würde EEPE niemals gesetzt werden (und damit 
nie der Wert ins EEPROM geschrieben).

Kann mir jemand sagen, wo der Fehler ist?

Über Antworten würde ich mich sehr freuen!

Schöne Grüße,
Alex

Autor: Ace (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alex,

dein Problem liegt darin dass die Compiler (-o0 -o1 usw. siehe 
Optimization)  die Beschreibung von EECR nicht optimal hingekommt 
spricht innerhalb von 4 Zyklen. Schau dir eventuell die ASM Befehle an.


void EEPROM_write(unsigned int addr, unsigned char data){
  /* Wait for completion of previous write */
  while(EECR & (1<<EEPE));
  /* Set up address and data registers */
  EEAR = addr;
  EEDR = data;
  /* Write logical one to EEMPE */

  cli(); /* disable interrupt */
  /* zeitkritisch muss innerhalb 4 Zyklen ausgeführt sein */
  asm ("sbi 0x1c,2");
  asm ("sbi 0x1c,1");
  sei(); /* enable interrupt */

  /* EECR |= (1<<EEMPE); */
  /* Start eeprom write by setting EEPE */
  /* EECR |= (1<<EEPE); */
  while(EECR & (1<<EEPE));
  return;
}

Grüße Ace

Autor: Faule Socke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch einfach die fertigen EEPROM-Routinen nehmen, die mit der 
AVR-Libc (und damit mit dem WinAVR, den du vermutlich benutzt) 
mitgekommen sind:

http://www.nongnu.org/avr-libc/user-manual/group__...

fix und fertig, getestet, funktionieren.

Allein das "Löschen ohne nachfolgendes Schreiben" fehlt leider.

Autor: Michael Rathmair (dj_motionx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo das Problem hatte ich auch schon.
Du kannst auch einfach die routinen der avr lib verwenden.

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank euch dreien. Ihr beschreibt ja alle den gleichen Fehler, den 
ich auch vermutete. Jedoch dachte ich, wenn ich die beiden Befehle im 
C-Code direkt nacheinander schreibe, würden sie innerhalb von 4 Zyklen 
ausgeführt werden...
Ich werde es morgen mal testen und berichten.

Danke & Gruß,
Alex

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, vielen Dank für die Antworten!
Es lag wirklich am Timing, EEPE wurd nicht schnell genug gesetzt, 
nachdem EEMPE gesetzt wurde... Habe es jetzt in Assembler geschrieben 
und es klappt perfekt.

Gruß,
Alex

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.