Forum: Mikrocontroller und Digitale Elektronik uint32 in eeprom speichern


von Daniela (Gast)


Lesenswert?

Hallo,
ich möchte eine 32-Bit Zahl im EEProm speichern.
Zum EEProm Zugriff nutze ich folgende Funtionen:
1
void EEPWrite(uint8_t addr, uint8_t val)
2
{
3
  while(!eeprom_is_ready());
4
    eeprom_write_byte((uint8_t*)addr, val);
5
}
6
unsigned char EEPRead(uint8_t addr)
7
{
8
  while(!eeprom_is_ready());
9
    return(eeprom_read_byte((uint8_t *)addr));
10
}
Nun habe ich erstmal versucht einen Wert wie folgt zu schreiben:
1
EEPWrite(0,0xff);
2
EEPWrite(1,0xff);
3
EEPWrite(2,0x01);


Dies funkttioniert auch, und ich kann die geschriebenen Werte auslesen.
Wenn ich nun aber wie folgt auslese:
1
uint32_t Zaehler;
2
Zaehler=(EEPRead(2)<<16) + (EEPRead(1)<<8) + EEPRead(0);
3
EEPWrite(0,(uint8_t*) Zaehler);
4
EEPWrite(1,(uint8_t*) (Zaehler>>8));
5
EEPWrite(2,(uint8_t*) (Zaehler>>16));

...und wieder schreibe, dann steht hinterher 0xff an jeder Stelle. Bis 
16-Bit funktioniert alles.
Shifte ich falsch, oder wo ist mein Denkfehler?


LG
Daniela

von Kai S. (zigzeg)


Lesenswert?

Besser erst auf den Zieltyp casten, dann shiften:
1
> uint32_t Zaehler;
2
> Zaehler=(((uint32_t)EEPRead(2))<<16) + (((uint32_t)EEPRead(1))<<8) + EEPRead(0);

Warum nach uint8_t POINTER casten ?
Wundert mich, dass der Compiler hier nicht meckert. Ist das wirklich 
original code ?
So ists richtig:
1
EEPWrite(0,(uint8_t) Zaehler);
2
EEPWrite(1,(uint8_t) (Zaehler>>8));
3
EEPWrite(2,(uint8_t) (Zaehler>>16));

ZigZeg

von Peter II (Gast)


Lesenswert?


von Daniela (Gast)


Lesenswert?

Hallo,
ja das ist original Code. Der Pointer war mein Fehler...
Nun habe ich aber immer überall 0x00...
Komisch! :-(

von Daniela (Gast)


Lesenswert?

Peter II schrieb:
> eeprom_write_dword
>
> 
http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__eeprom_1ga012c7fa61d9695b7f0f5187d2560e598.html

Das ist ja viel eleganter! :-)
So geht es... Vielen Dank!!!

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.