32bit aus EEPROM lesen

Gast #70691
Hallo!

Wie mache ich das richtig?
      i = eeprom_read_word (&i_restzeit_l);
      restzeit = i;
      i = eeprom_read_word (&i_restzeit_h);
      restzeit = restzeit + ( i_restzeit_h << 16);
i_restzeit_l sind die unteren, i_restzeit_h die oberen 16bit einer 32
bit Zahl die im EEPROM steht.
Das schieben um 16 bit nach links geht natürlich nicht. restzeit ist
32bit.

Macht man das mit eeprom_read_block() oder gibts was einfacheres?

Ist die Reihenfolge im EEPROM richtig?
int16_t i_gesamtzeit_l ESECT;
int16_t i_gesamtzeit_h ESECT;
Gast #70692
Hi,

#include "avr/eeprom.h"
void test1(void)
{
  unsigned long restzeit;
  uint16_t* i_restzeit_h = (uint16_t*)6;
  uint16_t* i_restzeit_l = (uint16_t*)8;
  restzeit = eeprom_read_word (i_restzeit_h);
  restzeit <<= 16;
  restzeit += eeprom_read_word (i_restzeit_l);
}

// Version 2:
void test2(void)
{
  unsigned long restzeit;
  unsigned long* restzeit_adresse = (unsigned long*)6;
  eeprom_read_block(&restzeit,restzeit_adresse ,sizeof(restzeit));
}

Beide Versionen lassen sich bei mir compilieren. Ich habe es selbst
noch nicht getestet.

Melde dich bitte, wenn etwas laufen sollte.
Wenn nichts läuft, sowieso melden.

Oryx
Gast #70693
Hi,

wenn ich meinen Test richtig interpretiere, werden erst die l-words
geschrieben und dann die h-words

void test1_in(void)
{
  uint16_t* i_restzeit_h = (uint16_t*)12;
  uint16_t* i_restzeit_l = (uint16_t*)10;
  eeprom_write_word (i_restzeit_h,0x0102);
  eeprom_write_word (i_restzeit_l, 0x0408);
}

unsigned long test2(void)
{
  unsigned long restzeit;
  unsigned long* restzeit_adresse = (unsigned long*)10;
  eeprom_read_block(&restzeit,restzeit_adresse ,sizeof(restzeit));
  return restzeit;
}

läuft bei mir

Oryx
Gast #70694
Hallo Oryx!

> restzeit = eeprom_read_word (i_restzeit_h);
>  restzeit <<= 16;

Ich lach mich tot! Sowas fällt mir nicht ein? Entweder bin ich 32-bit
verwöhnt oder sowieso zu blöd für alles!

Ich sollte beruflich doch waas anderes machen. So in der Art Türstopper
oder Schuhverkäufer.

Auf jeden Fall danke für den Tip, funktioniert natürlich (die erste
Version). An der 2. arbeite ich noch, weil ich es auch mit
eeprom_write_block machen will. Ist im Assembler Code deutlich kürzer.
Gast #70696
So, Variante 2 tut auch, hatte woanders noch einen Bug drin.
Ist schon lustig, dass man mit Mikrocontroller viel mehr Zeit am Feilen
vom Code aufbringt sobald man weniger als 1k Flash frei hat :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.