Forum: Compiler & IDEs eeprom_read - Adresse casten?


von emax (Gast)


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..?

von Jörg Wunsch (Gast)


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.

von Matthias (Gast)


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

von Matthias (Gast)


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

von emax (Gast)


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.

von Fritz Ganter (Gast)


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.

von Bernie (Gast)


Lesenswert?

Hallo Fritz,
versuch's mal ohne abschließendes Semikolon in dem #define.

von Fritz Ganter (Gast)


Lesenswert?

Danke Bernie!

Ich war wohl blind und doof gestern :-(

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.