mikrocontroller.net

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


Autor: Andy (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andy (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die schnelle Hilfe, werde es ausprobieren. Thanks

Autor: Andy (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

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

Autor: Falk Brunner (falk)
Datum:

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

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.