Forum: Mikrocontroller und Digitale Elektronik Eeprom beschreiben und lesen mit _read/_write_block


von Andy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich komm mit den eeprom-funktionen im tutorial nicht ganz klar. ich 
möchte einen float-wert ins eeprom speichern (messung eines 
zurückgelegten weges) und diesen nachdem der controller wieder 
eingeschaltet wird wieder lesen und den weg weiterzählen.
Hierzu möchte ich beim allerersten start des controllers mit dem wert 
0.0 starten und dann in bestimmten abständen (alle 250m zurückgelegter 
weg) diesen im eeprom speichern.
Ich verstehe im tutorial nicht, wie der wert wieder in u.r gespeichert 
werden soll, wenn doch der variablenname u.r nirgends auftaucht! es 
taucht immer nur u.i auf, der wert in u.r wird doch nie benutzt, oder?
Ich komm auch nicht drauf, wie ich mit dem wert 0 starten kann und das 
programm sich dann nach jedem neustart des controllers den aktuellen 
wert holt. wenn ich die variable schon mit 0.0 initialisiere, dann wird 
sie doch bei jedem neustart des controllers wieder auf 0.0 gesetzt und 
mein gespeicherter wert ersetzt, oder nicht?

Bin total ratlos. Möchte nen tachometer realisieren, der die 
zurückgelegte gesamtstrecke speichert und immer fortsetzt.

bin dankbar für jeden hinweis

(code im anhang, eeprom-funktionen aus tutorial)

von Andy (Gast)


Lesenswert?

Ok, ein Teil des verständnisproblems ist gelöst, da ich kein plan von 
union hatte. der teil wär soweit klar, sorry. das eeprom-problem hab ich 
immer noch...

von Falk B. (falk)


Lesenswert?

@  Andy (Gast)

>möchte einen float-wert ins eeprom speichern (messung eines
>zurückgelegten weges) und diesen nachdem der controller wieder

>0.0 starten und dann in bestimmten abständen (alle 250m zurückgelegter
>weg) diesen im eeprom speichern.

Sowas macht man meist besser mit Interger, siehe 
Festkommaarithmetik.

> wenn ich die variable schon mit 0.0 initialisiere, dann wird
>sie doch bei jedem neustart des controllers wieder auf 0.0 gesetzt und
>mein gespeicherter wert ersetzt, oder nicht?

Nöö, das gilt nicht für Variablen im EEPROM. So wie es gemacht ist passt 
das schon, wenn gleich float hier ziemlich deplatziert ist. Nimm 
uint32_t.

MFg
Falk

von Andy (Gast)


Lesenswert?

Vielen Dank für die schnelle Hilfe, werde es ausprobieren. Thanks

von Andy (Gast)


Lesenswert?

Doch noch ne Frage:

Wenn ich das Programm getestet habe und es wurden bereits Werte ins 
Eeprom geschrieben, wie kann ich die Variable im Eeprom wieder nullen???

von Falk B. (falk)


Lesenswert?

@  Andy (Gast)

>Wenn ich das Programm getestet habe und es wurden bereits Werte ins
>Eeprom geschrieben, wie kann ich die Variable im Eeprom wieder nullen???

Einfach den EEPROM mit dem .eep File neu programmieren.

MFG
Falk

von Andy (Gast)


Angehängte Dateien:

Lesenswert?

So, hab jetzt alles am laufen und ausprobiert. Hab auch den Code nochmal 
etwas abgeändert (im bereich eeprom_read und eeprom_write). Mein Tacho 
zählt, das der Wert ins eeprom geschrieben wird macht ein kleines 
flackern meiner 7-Segment-Anzeige zum richtigen Zeitpunkt deutlich. Doch 
nach Reset des controllers wird die entsprechende variable wieder mit 
0.0 angezeigt, obwohl der wert aus dem eeprom gelesen worden sein muss.

Ich programmiere den controller via jtag, muss ich bei den fuses auf was 
bestimmtes achten? was ist mit eesave-fuse?

der etwas geänderte code nochmals im anhang

von Falk B. (falk)


Lesenswert?

@ Andy (Gast)

>nach Reset des controllers wird die entsprechende variable wieder mit
>0.0 angezeigt, obwohl der wert aus dem eeprom gelesen worden sein muss.

Logisch, der Fehler steckt hier.

>eeprom_write_block(&GesKmEeprom,&(u.i),sizeof(float)); }

Schau mal in die Doku der libc ;-)

Und nimm um Himmels Willen uint32_t statt float.

MfG
Falk

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.