Forum: Mikrocontroller und Digitale Elektronik EEPROM Adressen


von Peter (Gast)


Lesenswert?

Hallo, ich habe eigentlich eine ganz einfache Frage. Ich möchte in der 
elf Datei Daten anlegen und zwar mit einer bestimmten adresse.
Wenn ich diese ausdruck nutze:
uint8_t eeFooByte EEMEM = 125;

wird die Zahl ja irgendwo abgeleft aber ich weiß nicht welche Adresse 
eeFooByte ist. Ich möchte die 125 an die Adresse 1 setzen....

von H.Joachim S. (crazyhorse)


Lesenswert?

Meinst du wirklich Adr. 1? Oder doch eher 0?
Die werden einfach der Reihe nach angelegt.
Und willst du sie wirklich auf Adresse 1 haben, dann pack halt noch ein 
dummy-Byte davor.

uint8_t dummy EEMEM=0xff;         //Adresse 0
uint8_t eeFooByte EEMEM = 125;    //Adresse 1

Ne absolute Adresszuweisung ist das natürlich nicht, sollte man schon 
mal kontrollieren. Frühere AVRs ohne brownout hatten regelmässig Problem 
mit Zelle 0 des EEPROMs. Manche Compiler haben diese aus diesem Grund 
nicht benutzt, da gings ab Adresse 1 los.

Bleibt die Frage, warum du die Variable auf eine feste Adresse haben 
wilst - benötigst du die irgendwo im Programm, macht der Compiler das 
schon richtig :-)

von Thomas E. (thomase)


Lesenswert?

unsigned char eeFooByte = 125;
eeprom_write_byte((unsigned char*)1, eeFooByte);

Das musst du dann aber im Programm immer so machen. Wenn du das mit
unsigned char EEMEM eeFooByte2 = 126;
mischt, benutzt der Compiler ziemlich sicher Adressen, die du schon 
selbst verwendest. D.h. du musst deinen Speicher selbst verwalten.

mfg.

von Peter (Gast)


Lesenswert?

@Thomas: Diese Zuweisung kann ich nicht zur Compilerzeit machen bzw das 
geht nicht direkt in die eep datei(hab mich im anfanspost verschrieben)
Wenn ich das hier mache
uint8_t eeFooByte EEMEM = 125;
uint8_t eeFooByte1 EEMEM = 126;
uint8_t eeFooByte2 EEMEM = 127;


sieht die eep so aus

:030000007D7E7F83
:00000001FF

Zweite Zeile steht immer da, ist also klar. Die 3 in Zeile 1 ist die 
Anzahl der Einträger.
7D 7E 7F sind die Daten. Hier kann man ja schonmal von ausgehen das 
eeFooByte nicht adresse 0 ist oder?


Ich will die eep später mit ner exe öffnen können und über eine 
Oberfläche die Daten ändern, deshalb möchte ich das ich bei Adresse 1 
Anfange, Adresse 0 würde auch gehen.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> @Thomas: Diese Zuweisung kann ich nicht zur Compilerzeit machen bzw das
> geht nicht direkt in die eep datei(hab mich im anfanspost verschrieben)

Die wird meiner Meinung nach sowieso überschätzt.
Ich bevorzuge es, wenn meine Programme selber eine Funktion enthalten, 
die die Werte ins EEPROM schreiben anstatt sich darauf zu verlassen, 
dass die Werte über eine EEP Datei gebrannt werden. Auf die Art gibt es 
dann auch eine Möglichkeit, wie man den µC auf 'Factory-Default' 
zurückstellen kann. Und zwar ganz ohne einen Brenner oder eine EEP Datei 
zur Verfügung haben zu müssen.


> sieht die eep so aus
>
> :030000007D7E7F83
> :00000001FF
>
> Zweite Zeile steht immer da, ist also klar. Die 3 in Zeile 1 ist die
> Anzahl der Einträger.
> 7D 7E 7F sind die Daten. Hier kann man ja schonmal von ausgehen das
> eeFooByte nicht adresse 0 ist oder?

Das Intel-Hex Format ist gut dokumentiert.
Anstatt raten such dir lieber die Beschreibung mittels Google.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Dann musstes so machen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Bytes_lesen.2Fschreiben

Die Adressen dann eben als defines mits übersichtlich bleibt.

von Thomas E. (thomase)


Lesenswert?

Peter schrieb:
> sieht die eep so aus
>
> :030000007D7E7F83
>
> :00000001FF

Das ist Hex-Intel. Das gleiche Format, wie bei der Programmdatei.
Besorg oder Schreib dir einen Editor dafür.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:

> Ich will die eep später mit ner exe öffnen können und über eine
> Oberfläche die Daten ändern, deshalb möchte ich das ich bei Adresse 1
> Anfange, Adresse 0 würde auch gehen.

Dann ist es aber nicht zielführend, den Compiler die Adressvergabe 
machen zu lassen.
Im Programm verwendest du dann nur noch absolute Adressen und dein 
PC-Programm erzeugt, verändert und schreibt selbst das EEP File.

Noch besser, da muss allerdings dann auch die Hardware dafür passen, ist 
es allerdings, wenn dein PC-Programm direkt mit dem µC kommuniziert und 
dem µC direkt mitteilt, welche Einstellung wie zu ändern ist. Ganz ohne 
EEP File. Und dann ist es wiederrum (fast) egal, wo im EEPROM welcher 
Wert gespeichert wird. Denn Schreiben und Lesen erledigt ausschliesslich 
der µC selber.

von Peter (Gast)


Lesenswert?

Naja die exe soll nachher die Hex zahlen ändern.Und da ich ja weiß an 
welcher stelle diese stehen sollte das kein problem sein. Habe eben 
rausbekommen wie es abgespeichert ist. eeFooByte fängt tatsächlich bei 
adresse 0 an und wird dann mit jedem weiteren byte um 1 erhöht. Ich 
denke damit sollte ich arbeiten können. danke erstmal

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Naja die exe soll nachher die Hex zahlen ändern.Und da ich ja weiß an
> welcher stelle diese stehen sollte das kein problem sein. Habe eben
> rausbekommen wie es abgespeichert ist. eeFooByte fängt tatsächlich bei
> adresse 0 an und wird dann mit jedem weiteren byte um 1 erhöht. Ich
> denke damit sollte ich arbeiten können. danke erstmal

Dei einzige reale Gefahr geht davon aus, dass sich die Lage einzelner 
Bytes durch hinzufügen von weiteren Einstell-'Variablen' verändern kann.

Daher: Alles was im EEPROM landen soll, nur in einer Datei sammeln und 
neuen Werte immer hinten anfügen.

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.