eeprom_read - Adresse casten?

Gast #77247
Ich kapier da was nicht.

Wenn ich aufs eeprom in "C" zugreifen will, dann muss ich mir meine
Adressen zusammenbasteln. Also zum Beispiel so:

uint8_t eeBreak, eeFreq, eeILimit;

#define ADR_eeBreak 0
#define ADR_eeFreq   ADR_eeBreak   + sizeof(eeBreak)
#define ADR_eeILimit   ADR_eeFreq    + sizeof(eeFreq)

Wenn ich nun aus dem eeProm lesen möchte, muss ich dann
"ADR_eeBreak"
zu einem (uint8 *) casten? Also so?:

eeBreak   = eeprom_read_byte((uint8_t *) ADR_eeBreak  );

Ich denke mal, Jörg weiss das sicher sofort...

Ich wills nicht einfach so ausprobieren, weil ja durch den Cast alle
Warnings eliminiert werden, ich aber wissen möchte, obs auch richtig
ist. Zufallsergebnisse sind mir zu riskant.

Wer hilf..?
Gast #77248
Im Prinzip ja.

Etwas eleganter wäre es, stattdessen EEPROM-Variablen zu deklarieren
und deren Adressen zu benutzen:

#define ESECT __attribute__((section(".eeprom")));

uint8_t eeBreak ESECT;
uint8_t eeFreq ESECT;
uint8_t eeILimit ESECT;

...
  Break = eeprom_read_byte(&eeBreak);

Zusätzlich kannst Du noch Initialisierungen vornehmen, die sich dann
mit avr-objcopy in eine separate intel hex Ladedatei rausziehen lassen
und vom Programmer in den EEPROM geladen werden können.

Sinnvollerweise schreibt man am Besten alle EEPROM-Variablen in eine
einzige C-Datei, damit man die tatsächliche Anordnung durch den Linker
unter Kontrolle hat.

Falls Du vorhast, den EEPROM aus dem Programm zu beschreiben, solltest
Du Adresse 0 aussparen (also mit einer Dummy-Variablen belegen), da
dieser Wert zerschossen werden kann, wenn während des Schreibvorgangs
ein Reset eintrifft.
Gast #77249
Hi

zumindest für die neuen Megas trifft das nicht mehr zu. Diese führen
einen Schreibzyklus auch bei auftretendem Reset weiter. Wichtig ist nur
das die Versorgungsspannung vom Eintreten des Reset bis zur Beendigung
des Schreibvorgangs nicht zu stark abfällt.

Matthias
Gast #77250
Hi

Jörg:

Ich hab das so gemacht wie du schreibst (Alle EEPROM-Variablen in eine
.c zusammen mit ein paar Verwaltungroutinen) Wie mache ich jetzt diese
Variablen Projektweit bekannt? In jede .c alle Variablen als extern zu
deklarieren kann ja nicht die Lösung sein.

Matthias
Gast #77251
Da kann ich wieder helfen.

Baue eine Headerdatei für Dein Projekt. Diese includest Du in jeder
Source. In dieser Headerdatei deklarierst (NICHT DEFNIERST!) Du deine
Variablen:

#ifndef _THIS_HEADER
# define _THIS_HEADER

... blabla

# define ESECT __attribute__((section(".eeprom")));

extern uint8_t eeBreak ESECT;
extern uint8_t eeFreq ESECT;
extern uint8_t eeILimit ESECT;

#endif

Nun musst die die Varianlen nur noch in einer Deiner c-Dateien
definieren.

Ob Du in der Headerdatei die ESECT-Angabe brauichst, weiss ich nicht,
einfach probieren.


Danke Jörg!
e.
Gast #77252
Hallo!

Ich habe heute mit Mikrocontroller angefangen :-)

Ich würde gern das EEPROM auf einen Wert initialisieren, wenn ich das
EEPROM mit programmiere (meist schreibe ich nur das Flash).

wie muss ich das richtig schreiben, folgendes tut nicht:
=======
#define ESECT __attribute__((section(".eeprom")));

uint16_t anz ESECT=0;
=======
es kommt
walkingled.c:41: error: parse error before '=' token

dasselbe bei:
uint16_t anz=0 ESECT;
kommt
walkingled.c:41: error: parse error before "__attribute__"


Im Programm anz auf 0 setzen will ich nicht, da der Inhalt vom EPROM ja
erhalten bleiben soll, solange ich das EPROM nicht auch flashe.

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.