Forum: Mikrocontroller und Digitale Elektronik uint64_t direkt im EEprom eines AVRs möglich?


von hermy (Gast)


Lesenswert?

Hallo,

kurze Frage:

eine 64-Bit-Integer (uint64_t) direkt im EEprom eines AVRs 
ablegen/auslesen geht nicht, oder?

(wenn nein, mache ich es anders)



#include <avr/eeprom.h>
...
eeprominhalt = eeprom_read_dword(&eezahl);

funktioniert, aber nur mit 32 Bit.

Gibt es eine Alternative zu "..._dword(...", mit der 
64Bit-Unsigned-Integer direkt gelesen (bzw. vorher entsprechend 
abgelegt) werden können?

(benutze übrigens derzeit AVR-Studio 4.19, eventuell spielt das eine 
Rolle)

von Karl H. (kbuchegg)


Lesenswert?

hermy schrieb:

> Gibt es eine Alternative zu "..._dword(...", mit der
> 64Bit-Unsigned-Integer direkt gelesen (bzw. vorher entsprechend
> abgelegt) werden können?


Meines Wissens nicht. Aber mit Hilfe der eeprom_read_block Funktion ist 
es trivial sich eine entsprechende Funktion zu schreiben.
1
uint64_t eeprom_read_qword( uint64_t* addr )
2
{
3
  uint64_t value;
4
  eeprom_read_block( &value, addr, sizeof(uint64_t) );
5
  return value;
6
}

und die gegenteilige write Funktion ist auch nicht schwerer zu 
schreiben.

von hermy (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Meines Wissens nicht. Aber mit Hilfe der eeprom_read_block Funktion ist
> es trivial sich eine entsprechende Funktion zu schreiben.

Danke für die Antwort! "Trivial" liegt in dem Fall wahrscheinlich im 
Auge des Betrachters...

Dir schwebt wahrscheinlich so etwas vor:

eeprom_read_block ( Ziel, Quelle, Länge)

?!?

von hermy (Gast)


Lesenswert?

Postingüberschneidung

von hermy (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> eeprom_read_block( &value, addr, sizeof(uint64_t) );

Was ist mit "addr" (Adresse) gemeint?

von Karl H. (kbuchegg)


Lesenswert?

hermy schrieb:
> Dir schwebt wahrscheinlich so etwas vor:
>
> eeprom_read_block ( Ziel, Quelle, Länge)
>
> ?!?

genau.
Was anderes machen die anderen Funktionen (bis auf die Byte Funktion) ja 
auch nicht. Das ist einfach nur eine Anpassung der Datentypen der 
Parameter um sie letzten Endes mit dem entsprechenden sizeof in die 
Read/Write Block Funktion zu stecken.
Nix aufregendes.

von Karl H. (kbuchegg)


Lesenswert?

hermy schrieb:
> Karl Heinz Buchegger schrieb:
>> eeprom_read_block( &value, addr, sizeof(uint64_t) );
>
> Was ist mit "addr" (Adresse) gemeint?


Na die Adresse im EEPROM, von der der uint64_t gelesen werden soll.

von Karl H. (kbuchegg)


Lesenswert?

hermy schrieb:
> Postingüberschneidung

Ja, sorry.
Musste mir erst noch zusammensuchen, in welcher Reihenfolge die 
read_block die Argumente haben will.

von hermy (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Na die Adresse im EEPROM, von der der uint64_t gelesen werden soll.

Ach so, ich dachte schon die Adresse im SRAM, wo es hin soll.

OK, probiere es gleich mal aus...

von hermy (Gast)


Lesenswert?

Habe es so ausprobiert:

uint64_t eezahl EEMEM = 123456; //zahl frei gewählt

schreiben: eeprom_read_block( &value, &eezahl, sizeof(uint64_t) );

lesen:     eeprom_read_block( &value, &eezahl, sizeof(uint64_t) );

Nach dem Lesen ist value = 0

(Verwirrung)

von hermy (Gast)


Lesenswert?

Was mich verwirrt, in einem Beispiel aus einem Buch steht:

double eezahl EEMEM = 12.34;

Als Eeprom-Adresse kommt mir das sehr merkwürdig vor.

von hermy (Gast)


Lesenswert?

ok, jetzt klapp es.

value muss wohl eine lokale Variable sein, sonst geht es nicht (war 
vorher global)

Danke an KHB!!!

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.