eeprom_read - Adresse casten?

Gast #77247
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

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