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)
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.
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) ?!?
Karl Heinz Buchegger schrieb: > eeprom_read_block( &value, addr, sizeof(uint64_t) ); Was ist mit "addr" (Adresse) gemeint?
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.
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.
hermy schrieb: > Postingüberschneidung Ja, sorry. Musste mir erst noch zusammensuchen, in welcher Reihenfolge die read_block die Argumente haben will.
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...
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)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.