Forum: Mikrocontroller und Digitale Elektronik 32bit aus EEPROM lesen


von Fritz Ganter (Gast)


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;

von Oryx (Gast)


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

von Oryx (Gast)


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

von Fritz Ganter (Gast)


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.

von Oryx (Gast)


Lesenswert?

Hi,
freut mich.
Die einfachsten Sachen sind immer etwas schwerer zu finden.

Aber Schuhverkäufer ist nun wirklich ein ehrenwerter Beruf.

Oryx

von Fritz Ganter (Gast)


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 :-)

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.