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..?
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.
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
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
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.
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.
Hallo Fritz, versuch's mal ohne abschließendes Semikolon in dem #define.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.