32bit aus EEPROM lesen

Gast #70691
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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