uint32 in eeprom speichern

Gast #3748606
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
#3748619
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren