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

: Bearbeitet durch User
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

: Bearbeitet durch User
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.