- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: EEPROM sinnvoll speichern. Aber wie?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647

    EEPROM sinnvoll speichern. Aber wie?

    Anzeige

    Powerstation Test
    Hi,

    ich habe mir ein 24LC1026 EEPROM gekauft. Die Ansteuerung mit einem Atmel per I2C stellt -denke ich- für mich erstmal kein Problem dar.

    Mein Problem ist ehr wie ich Sinnvoll Daten speicher. Ich möchte es gerne so haben, das ich Daten in das EEPROM schreibe sobald der Atmel läuft. Schaltet man ihn ab und irgendwann (in < 200 Jahren ) wieder an soll er 5 Sekunden auf einen Befehl auf der seriellen Schnittstelle warten. Kommt nichts dann weiter Daten speichern. Kommt was dann den Inhalt des EEPROMs über die serielle Schnittstelle ausgeben. Wie Markiere ich jetzt meinen Datensatz? Den Anfang könnte ich mir vorstellen einfach 4 Bytes mit FF zu schreiben. Aber wie markiere ich das Ende? Ich hab im Datenblatt des EEPROMs gelesen, das ein einfacher Read befehl da weiter macht wo er zuletzt aufgehört hat. An den internen Adresspointer kommt man aber nicht ran oder?
    Das Problem ist, das der Atmel ja vergisst wo er aufgehört hat, wenn er plötzlich ohne Strom da steht. Klar ich könnte jetzt einfach jedesmal bei Adresse 0 wieder Anfagen aber wenn der neue Datensatz kürzer ist als der alter hab ich schon ein Problem. Jedesmal alles mit Nullen vollschreiben finde ich auch nicht sehr elegant.

    Ich hoffe ihr versteht wie ich das meine.

    Danke
    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Im Endeffekt willst du erste Ansätze eines Dateisystems.
    Eine einfache Lösung: Du schreibst die Daten blockweise und jeder Block hat eine fortlaufende Nummer. Du fängst also an zu schreiben: Block n ... n+m. Wenn der AVR erneut eingeschaltet wird, sucht er die höchste Zahl in dieser Kette und fängt dann an zu Zählen n+m .. n+m+x. Das Ende der Kette ist recht einfach dadurch zu erkennen, dass der nächste Block eben nicht den numerisch nächsten Wert hat.
    Einzige erforderliche Vorbereitung: Einmal den EEPROM mit leeren Blöcken vorformatieren.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Mh ok. Das EEPROM hat ne PageWrite Funktion, die ich sowieso nutzen wollte. Also man kann immer 128 Byte aufeinmal schreiben. Das könnte ich ja als Block nutzen. Dann würde ich am Anfang jedes Blocks "Indexnummer Hi" "Indexnummer lo" schreiben. Da ich ja weiss das immer die ersten beiden Bytes eines Blocks meine Indexnummer ist brauch ich a auch kein Startbyte oderso.

    Ist ne Top Idee! Danke!
    Das wird morgen oderso mal getestet und umgesetzt!

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Hallo Daniel,

    ich nehme mal an, dass Du die Schreibprozesse so geplant hast, dass Du nicht ständig, also in kurzen Zyklen auf dem EEPROM „schreibst“, also so gesagt die Lebensdauer beachtet hast.

    Warum benutzt Du in dem Falle nicht Deinen eigenen Adresspointer, die Ablage vorzugsweise gleich in dem EEPROM (Bereich den Du nicht überschreibst vorzugsweise Anfang/Ende) oder wenn Du Dir sicher bist, das die Kombi nie auseinandergerissen wird, wie es bei gesteckten I²C – Datenkarten möglich ist, auch gleich in den Prozessor-Eeprom.
    Dort legst Du nach dem Schreibprozess (Du weißt ja wie viele Daten Du wohin schreibst) die nächste freie Eeprom Adresse ab.

    Wenn Du also etwas schreiben möchtest:
    - eigenen Adresspointer lesen
    - ab der entsprechende Adresse im Eeprom schreiben
    - eigenen Adresspointer entspr. erhöhen und wieder abspeichern

    Wenn Du auslesen möchtest:
    - eigenen Adresspointer lesen
    - ab Startadresse bis Adresspointer auslesen
    - eigenen Adresspointer auf erste Schreibadresse setzen und wieder abspeichern


    Je nachdem was Du vorhast und wie Deine Energieversorgung und Schaltung aussieht, kannst Du diesen Adresspointer auch temporär im flüchtigen Speicher halten und bei Trennung der Spannung (eventuell mit vorhandener Restenergie) oder vor dem Abschalten erst abspeichern.

    Mache ich bei unseren Geräten schon seit über 10 Jahren so, egal ob ich diese als Ringspeicher oder „normal“ mit zyklischer Auslesung nutze. Im ersten sowieso aber auch letzten Fall entfällt ein Löschen der ausgelesenen Daten.

    Es geht auch sehr schnell, da Du den Eeprom nicht durchsuchen musst, was ja doch je nach Größe etwas Zeit beansprucht.


    Gruß André

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    @André: Damit belastest du aber einen kleinen Bereich im EEPROM deutlich mehr als den Rest (zumindest wenn der Pointer nach jedem Schreibvorgang aktualisiert wird). Hattest du noch keine Probleme mit Wear-Out?

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  6. #6
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    19.05.2012
    Ort
    Sigmaringen
    Beiträge
    169
    Diesen Adresspointer "muss" man eben immer an der Selben stelle halten, da sonst bei Reset/Neustart das Programm nicht weiss, wo es suchen soll.

    aber wie Andre_S schrieb...

    Je nachdem was Du vorhast und wie Deine Energieversorgung und Schaltung aussieht, kannst Du diesen Adresspointer auch temporär im flüchtigen Speicher halten und bei Trennung der Spannung (eventuell mit vorhandener Restenergie) oder vor dem Abschalten erst abspeichern.
    Das Schreiben des Adresspointers kann man dadurch minimieren indem man ihn bei BrownOut schreibt.
    (Während das Programm läuft hat man die Adresse ja immer parat)
    Somit wird der Bereich, an dem der Adresspointer steht nur 1 mal beschrieben bei jedem Abschalten/Neustart.
    JAAAA... Microchips kann man essen... aber der Geschmack ist furchtbar.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Ich denke das die Methode von Markus auch einfacher umzusetzen ist, was die Programmierung angeht. Die 2 Byte pro Block für die Indexierung habe ich locker über.

    Mit der Methode von Andre schreibe ich mir ja mein Internes EEPROM vom Atmel kaputt (auf die dauer) ausser ich schreibe den Adresspointer immer eine Adresse weiter. Da in dem internen EEPROM aber ein paar konstanten liegen muss ich ja auch noch aufpassen das die nicht überschrieben werden.
    An eine Abschalterkennung dachte ich auch schon, aber das ist mir zu aufwendig. Wenn mir die letzten 2 Sekunden an Daten verloren gehen sollten, ist das nicht besonders schlimm.

    Danke für eure Ideen.
    Ich hoffe das mein EEPROM morgen bei mir eintrifft.

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Zitat Zitat von DanielSan Beitrag anzeigen
    ...
    Mit der Methode von Andre schreibe ich mir ja mein Internes EEPROM vom Atmel kaputt (auf die dauer) ausser ich schreibe den Adresspointer immer eine Adresse weiter.
    ...
    Gruß Daniel
    Nö,...
    da haste mich nicht richtig verstanden oder nicht richtig gelesen...

    Aber jeder kennt seine Projekte und die damit verbundenen Anforderungen am besten und muss daraus die für sich optimale Vorgehensweise finden.


    Gruß André

Ähnliche Themen

  1. Edit: Wie Wert in EEPROM speichern?
    Von Maxxtro im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 24
    Letzter Beitrag: 23.02.2009, 11:03
  2. PIC18F4550 wie Variable im EEPROM speichern?
    Von Matzenerich im Forum PIC Controller
    Antworten: 0
    Letzter Beitrag: 21.09.2008, 17:03
  3. ....ab ins EEPROM-aber wie????
    Von Shunth im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 24.05.2008, 21:18
  4. ACII-Matrixcode sinnvoll speichern
    Von teslanikola im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 21.03.2006, 15:33
  5. M24C16 daten speichern aber wie ?
    Von logikbomb im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 09.09.2005, 15:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test