Problem mit EEPROM Attiny2313

OP (Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #1724761
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:
1
void EEPROM_write(unsigned int addr, unsigned char data){
2
  /* Wait for completion of previous write */
3
  while(EECR & (1<<EEPE));
4
  /* Set up address and data registers */
5
  EEAR = addr;
6
  EEDR = data;
7
  /* Write logical one to EEMPE */
8
  EECR |= (1<<EEMPE);
9
  /* Start eeprom write by setting EEPE */
10
  EECR |= (1<<EEPE);
11
  while(EECR & (1<<EEPE));
12
  return;
13
}

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
Gast #1724809
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
OP (Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #1724840
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

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.