EEPROM Problem beim Schreiben

Gast #2879913
Lesenswert?

Hallo,

Ich habe ein Problem mit dem internen EEPROM eines ATMega328p.

Meine Schreibroutine sieht folgendermaßen aus:
1
void Write_b_eep(uint16 badd, uint8 bdata)
2
{
3
  while (EECR & (1 << EEPE));
4
  EEAR = badd;
5
  EEDR = bdata;
6
  EECR |= (1 << EEMPE);
7
  EECR |= (1 << EEPE);
8
}

Führe ich diese Funktion 15x in einer for-Schleife aus, passt alles - 
führe ich sie 20x aus, so hängt sich der uC auf... Was kann da sein - 
hab leider nichts gefunden.
Danke für eure Hilfe! :)

mfg
Andy
Gast #2879930
Lesenswert?

Danke für eure schnellen Antworten!

@holger
Es ist eine ganz normale for-Schleife:
1
for(i = 0; i < 25; i++)
2
{
3
    Write_b_eep((uint16)i, eep_mirror_block_A_INT.byte[i]);
4
}

@Stefan
Danke, werd ich mir mal ansehen... :)
#2879933
Lesenswert?

EEPROMs brauchen aber ein paar Millisekunden fürs schreiben. Teilweise 
verwenden die einen Cache und schreiben die Page erst, wenn der Cache 
voll ist oder ein extra Schreibbefehl kommt. Das würde erklären, dass es 
bei 15 Bytes geht und bei 20 Byte nicht. Vielleicht testweise mal ein 
Delay von 10-50ms einfügen.
Gast #2879974
Lesenswert?

So, ich habe jetzt das EEPROM-Fenster beobachtet. Komischerweise werden 
die Daten richtig ins EEPROM geschrieben, aber der uC hängt sich auf... 
Muss jetzt noch genauer untersuchen... :)

Wenn jemand einen Rat hat: nur her damit! ;)

DANKE!!
Gast #2880017
Lesenswert?

So, ich habs jetzt nocheinmal probiert... Er schreibt doch nicht alle 
Daten ins EEPROM wie vorhin behauptet. 19 Bytes werden hineingeschrieben 
- mehr geht nicht. Ich habe nun nach jedem Funktionsaufruf ein delay von 
50ms eingebaut... ohne Erfolg.
Was kann das sein???

mfg
Gast #2880052
Lesenswert?

@holger:
Gerade wollte ich es schreiben: Der WD war aktiv... auf den habe ich 
völlig vergessen... :|
Es funktioniert jetzt einwandfrei! Danke für eure Geduld... :)

Eine Frage stellt sich trotzdem noch. Muss ich jetzt explizit eine 
Wartezeit einbauen, oder reicht die while-Schleife, die ich sowieso 
drinnen habe?

Danke nocheinmal!

mfg
Andy
Gast #2880086
Lesenswert?

>Eine Frage stellt sich trotzdem noch. Muss ich jetzt explizit eine
>Wartezeit einbauen,

Nein.

>oder reicht die while-Schleife, die ich sowieso
>drinnen habe?

Ja.

Deine Routine ist aber nicht gegen Interrupts abgesichert.

Nimm eeprom_write_byte(). Das erledigt alles für dich.
Gast #2880177
Lesenswert?

Danke für deine Infos...
Ich werde die Funktionen mal probieren.

Eine Verständnisfrage noch: wenn ich vor dem write ein cli und nachher 
ein sei setze, können mir die Interrupts nichts anhaben, oder?

Danke... Und gute Nacht! :-)

Mfg Andy
Gast #2880508
Lesenswert?

Ja schon. Aber mit SEI erlaubst DU interrupts, ungeactet dessen, ob sie 
vor dem Aufruf der Funktion überhaupt erlaubt waren. Besser ist, das 
Interrupt-Enable-Bit (oder das ganze Status Register) zu sichern und zum 
Schluss wieder herzustellen.

>> Nimm eeprom_write_byte(). Das erledigt alles für dich.

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