mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 32bit aus EEPROM lesen


Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Oryx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oryx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oryx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
freut mich.
Die einfachsten Sachen sind immer etwas schwerer zu finden.

Aber Schuhverkäufer ist nun wirklich ein ehrenwerter Beruf.

Oryx

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.