Forum: Mikrocontroller und Digitale Elektronik EEPROM Problem beim Schreiben


von Andy (Gast)


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

von holger (Gast)


Lesenswert?

>Was kann da sein - hab leider nichts gefunden.

Ich auch nicht weil ich deine Schleife nicht kenne.

von Stefan (Gast)


Lesenswert?

Keine Ahnung, was das falsch ist. Aber ich würde dazu lieber die 
Funktionen der AVR C Library benutzen:

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

eeprom_write_byte(badd,bdata);

von Andy (Gast)


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... :)

von Jens P. (picler)


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.

von Andy (Gast)


Lesenswert?

Macht das Warten nicht die while-Schleife in der ersten Zeile der 
Funktion??

von Andy (Gast)


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!!

von Andy (Gast)


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

von holger (Gast)


Lesenswert?

>Was kann das sein???

Watchdog aktiv?

von Andy (Gast)


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

von holger (Gast)


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.

von Andy (Gast)


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

von Stefan (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.