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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.