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

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