mikrocontroller.net

Forum: Compiler & IDEs EEPROM Variable ...


Autor: Gerhard Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich hab mal eine Verständnisfrage. Ich möchte einen Abgleichwert (ein 
paar Bytes) im EEPROM ablegen und bei jedem Programmstart wieder abrufen 
...

    uint8_t eeFooByte EEMEM;
    uint8_t myByte;

    myByte = 99;
    eeprom_write_byte(&eeFooByte, myByte);             // schreiben

Kann ich sicher sein, dass jeder Lesevorgang (also auch nach Power off) 
immer auf die richtige EEPROM Zelle (Adresse) zugreift. Oder anders 
gefragt ... bin ich gezwungen in diesem Fall mit absoluten EEPROM 
adressen zu arbeiten?

    myByte = eeprom_read_byte(&eeFooByte);             // lesen


Danke im Vorraus ...
Gerhard

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann die Frage nicht ganz nachvollziehen. Wenn Du eine Variable im 
EEPROM mit EEMEM deklarierst, dann legt der Linker die Variable ins 
EEPROM. Da die Variable einen Namen (eeFooByte) hat, wird bei einem 
Aufruf von eeprom_read_byte(&eeFooByte, myByte) natürlich auch auf genau 
diese Variable zugegriffen. Wie sollte es auch sonst sein? Oder meinst 
Du etwas Anderes?

Autor: Gerhard Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Johnny

Nein, das war schon so gemeint. Beim RAM ist`s klar ... die Variablen 
existiert ja nur während der Laufzeit. Beim EEPROM bin ich mir nicht 
sicher ob die Adresse der Variablen beim nächsten Compilieren / Linken 
evtl. anders vergeben wird?

Autor: klugscheissender Rahul, manchmal auch fies (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Beim EEPROM bin ich mir nicht
>sicher ob die Adresse der Variablen beim nächsten Compilieren / Linken
>evtl. anders vergeben wird?

Das kann schon passieren, wenn es zwischendurch eine Umdeklaration gibt.
Irgendwie kann man angeblich aber auch feste Adressen für die 
EEPROM-Variablen vergeben (ich weiß nicht, wie es geht...).

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich behelfe mir in solchen Fällen mit ein paar Defines.
Wenn ich sowieso eeprom_read_byte und eeprom_write_byte
benutzen muss, dann brauch ich auch keine EEMEM Variablen
dafür.


#define CONFIG_BYTE   ((void*)1)
#define CONFIG_1      ((void*)2)


  eeprom_write_byte( CONFIG_BYTE, myByte );

So bleibt jedes Byte im EEPROM dort wo ich es hin
haben will. Aufpassen muss man nur, dass die Konstanten
in der Größe richtig sind. Wenn CONFIG_1 ein int sein
soll, dann ist die nächste verwendbare EEPROM Position
die 4

Wer will kann da noch mit sizeof() vorbeugend etwas
Sicherheit hineinbringen, bisher hatte ich allerdings
mit diesem einfachen Schema noch keine Probleme.

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.