Hallo,
ich habe mir eine Struktur mit eeprom-Speicherstellen angelegt. Leider
nervt mich der Compiler mit einem Fehler - ich sehe nur nicht was er von
mir will.
Kann mir jemand sagen wo mein Problem ist?
1
/* EEPROM Speicher */
2
uint16_teeBetr_hEEMEM=2;// Aktuelle Betriebsstunden aus EEPROM
3
uint8_teeBetr_min_1600EEMEM=3;// Aktuelle Betriebsminuten bis 1600h aus EEPROM
4
uint8_teeBetr_min_3200EEMEM=4;// Aktuelle Betriebsminuten bis 3200h aus EEPROM
5
uint8_teeBetr_min_4800EEMEM=5;// Aktuelle Betriebsminuten bis 4800h aus EEPROM
6
uint8_teeBetr_min_6400EEMEM=6;// Aktuelle Betriebsminuten bis 6400h aus EEPROM
7
uint8_teeBetr_min_8000EEMEM=7;// Aktuelle Betriebsminuten bis 8000h aus EEPROM
8
uint8_teeBetr_min_9600EEMEM=8;// Aktuelle Betriebsminuten bis 9600h aus EEPROM
9
uint8_teeBetr_min_11200EEMEM=9;// Aktuelle Betriebsminuten bis 11200h aus EEPROM
10
uint8_teeBetr_min_12800EEMEM=10;// Aktuelle Betriebsminuten bis 12800h aus EEPROM
11
12
/* Übersetzungstabelle für EEPROM Speicherstellen */
pal ... schrieb:> ../betrStd.c:41: error: initializer element is not constant
Na ja. So schwer ist das dann auch wieder nicht.
Da wird etwas initialisiert. Und das, womit es initialisiert wird, muss
eine Konstante sein. Also
int i = 5;
ist eine korrekte Initialisierung, weil 5 eine Konstante ist.
int j = sqrt( k );
ist nicht korrekt, weil sqrt(k) keine Konstante ist.
Was soll
1
structnumSelnumMemSel[]=
2
{
3
{1600,eeBetr_min_1600},
in diesem Zusammenhang "eeBetr_min_1600" sein?
Es müsste eigentlich eien Konstante sein, deren Wert der COmpiler zur
Compilierzeit ermitteln kann. Und weil er das nicht kann, darum setzt es
ein:
error: initializer element is not constant
Das Problem an dieser Stelle ist aber nicht, dass das irgendein
Schreiweisen-Problem wäre, sondern es ist ein prinzipielles Problem: Du
hast hier nichts verwendet was konstant wäre. Daher die Meldung.
pal ... schrieb:> Die Fehlermeldung lautet:../betrStd.c:41: error: initializer element is >not
constant
> ../betrStd.c:41: error: (near initialization for 'numMemSel[0].memory')
Steht doch alles da.
pal ... schrieb:> struct numSel numMemSel[] => {> { 1600, eeBetr_min_1600 },
Zur Initialisierung von structs sind in C nur echte Konstanten erlaubt,
keine Variablen (selbst, wenn sie const wären, nicht).
Allerdings ist mir sowieso nicht ganz klar, was du da genau machen
willst. eeBetr_min_1600 liegt schließlich im eeprom...
Oliver
Ich kann nur raten, was du da eigentlich vor hattest. Du wolltest dir in
dieser STruktur die Speicheradressen der Teile im EEPROM ablegen. Hast
es aber nicht getan.
Die ganze Idee ist aber "flawed". Das machst du ganz anders. Und das
beginnt damit, dass du den Compiler das EEPROM verwalten lässt.
Du legst dir eine Struktur an
uint8_teeBetr_min_3200;// Aktuelle Betriebsminuten bis 3200h
6
...
7
};
und von dieser Struktur, gibt es 2 Instanzen.
Die eine existiert im EEPROM
1
structConfigValueseepromValueEEMEM;
und die andere im SRAM
1
structConfigValuesValues;
und beim Hochfahren des Programms kopierst du die komplette Struktur aus
dem EEPROM ins SRAM, bzw. bei Veränderung aus dem SRAM wieder zurück ins
EEPROM
AVR-GCC-Tutorial: Block lesen/schreiben
danke für die Antworten...
Der Gedanke dabei ist, je nachdem welche betr_std ich erhalte schreibe
ich auf einen anderen eeprom-speicherplatz
Die zugehörige Funktion lautet:
1
/*
2
* Regelt das Lesen / Schreiben der Betriebsminuten
@Karl Heinz: Ich versuche einen Betriebsstundenzähler zu progr und
möchte jede Minute ins eeprom schreiben.
Aus diesem Grund möchte ich nur einzelne Speicher beschreiben, wenn
diese ca 100000mal beschrieben sind gehe ich zur nächsten Stelle.
pal ... schrieb:> Der Gedanke dabei ist, je nachdem welche betr_std ich erhalte schreibe> ich auf einen anderen eeprom-speicherplatz
Dazu brauchst du aber die Adresse unter der der Wert im EEPROM abgelegt
wurde. Also musst du dir auch die entsprechende Adresse in deiner
Struktur aufheben. Und diese Adresse ist dann auch eine Compiletime
Konstante.