Forum: Mikrocontroller und Digitale Elektronik ATMEGAxx Variable ins EEPROM


von Daniel (Gast)


Lesenswert?

Hi zusammen,

versuche momentan mit nem ATMEGA16 eine Variable ins EEPROM zu 
speichern.
Dazu mein folgender, banaler Testcode:

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

char test;

int main(void)
{
  DDRB = 0xFF;

  eeprom_write_byte((uint8_t *)0x01, 0x0F);
  test = eeprom_read_byte((uint8_t *)0x01);

   PORTB = test;
}

Wenn beide Zeilen einkommentiert sind, wird am PORTB die erhoffte 0x0F 
ausgegeben. Nun würde ich erwarten, dass wenn ich Zeile 1, also 
write_byte... auskommentiere, dass dann die zuvor gespeicherte 
Information ebenfalls wieder am Port ausgegeben wird.
Es bleiben allerdings alle LEDS aus :(

Was mache ich falsch?

von 900ss (900ss)


Lesenswert?

Es gibt eine Fuse, die verhindert, dass das EEPROM gelöscht wird, wenn 
das Device gelöscht wird. Ich vermute, dass die falsch steht. Dadurch 
wird beim neuprogrammieren des ATMEGA16 auch dessen EEPROM gelöscht.

von holger (Gast)


Lesenswert?

Ausserdem sollte man auf das Ende des Schreibzyklusses warten

  eeprom_write_byte((uint8_t *)0x01, 0x0F);
  eeprom_busy_wait();

von Daniel (Gast)


Lesenswert?

Hey super, danke !
Es gibrt tatsächlich eine solche Fuse.

--> EESAVE

Ist das Bit gesetzt, wird bei jedem ChipErase das EEPROM mit gelöscht.
Steht es auf 0, bleibt das EEPROM unberührt :)


--> Danke für die schnelle Hilfe

von 900ss (900ss)


Lesenswert?

holger wrote:
> Ausserdem sollte man auf das Ende des Schreibzyklusses warten

Macht die Lib doch schon.
Zitat:
All of the read/write functions first make sure the EEPROM is ready to 
be accessed
Zitatende

Ich denke, dass es ohne eeprom_busy_wait() geht.

von 900ss (900ss)


Lesenswert?

Daniel wrote:
> Hey super, danke !
> Es gibrt tatsächlich eine solche Fuse.
>
> --> EESAVE

Was glaubst du, dass hier Märchenstunde ist? ;-)

von holger (Gast)


Lesenswert?

>> Ausserdem sollte man auf das Ende des Schreibzyklusses warten

>Macht die Lib doch schon.

Hab ich auch gerade gelesen. Man lernt nie aus ;)
Sonst würde das mit den eeprom_block_write()
ja auch nicht funktionieren.

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.