www.mikrocontroller.net

Forum: Compiler & IDEs eeprom_read - Adresse casten?


Autor: emax (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: emax (Gast)
Datum:

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

Autor: Fritz Ganter (Gast)
Datum:

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

Autor: Bernie (Gast)
Datum:

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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Bernie!

Ich war wohl blind und doof gestern :-(

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.