EEPROM-Adresse korrekt initialisieren und verwenden

Hallo!

Ich möchte einen analogen Trübungssensor verwenden, um in mehr oder weniger klarem Wasser auftretende Peaks von Verunreinigung zu erkennen und einen Alarm auszulösen. Das funktioniert prinzipiell schon, allerdings kann ich keinen festen Schwellwert für den Alarm verwenden, da sich in der Zuleitung mit der Zeit Mikroorganismen ansiedeln die den Wert anheben. Ich benötige also einen ansteigenden Mittelwert, von dem aus der Peak erkannt wird. Dies muss auch nach einem Neustart des Systems z.B. nach Stromausfall zuverlässig funktionieren, weshalb ich mich mit dem EEPROM beschäftigt habe. Meine Frage ist jetzt aber, wie ich dessen Funktionen richtig anwende. Ich würde einen gleitenden Mittelwert aus den letzten x Messungen bilden und im EEPROM per update speichern, wenn er mehr als y Prozent vom letzten Wert abweicht. Dafür muss vermutlich einmalig ein Wert ins EEPROM geschrieben werden, was aber nicht im Setup() sondern manuell passieren sollte, da es sonst ja bei jedem Start passiert und die Speicherfähigkeit reduziert, richtig?

Gibt es einen Grund, warum das EEPROM geheim bleiben muss...

Warum überhaupt ein EEPROM?

Beispiel:
EEPROM im ATMEGA328p
100000 Schreibzyklen bei 80°C
Einmal am Tag schreiben, dann dürfte das EEPROM ca 270 Jahre halten.

Hayley_Hay:
Dafür muss vermutlich einmalig ein Wert ins EEPROM geschrieben werden, …

Mir fallen drei Möglichkeiten ein:

  • Du schreibst ein Initialisierungsprogramm, das den Startwert für den Mittelwert ins EEPROM schreibt.
  • Du initialisierst den Startwert des Mittelwertes in setup() und kommentierst diesen Teil für den nächsten Start.
  • Ein neues EEPROM ist mit 0xFF in allen Speicherstellen beschrieben. In setup() liest Du den im EEPROM gespeicherten Mittelwert. Entspricht dieser einem Wert, der aus 0xFF Bytes besteht1), so nimmst Du anstelle des gelesenen Wertes den Startwert.

Anm.:

  1. Bei ganzzahligen Dateitypen ist das einfach, bei Fließkomma würde ich den Speicherbereich zunächst als ganzzahlig lesen.

combie:
Gibt es einen Grund, warum das EEPROM geheim bleiben muss…

Warum überhaupt ein EEPROM?

Sorry, das verstehe ich nicht.

Einmal am Tag schreiben, dann dürfte das EEPROM ca 270 Jahre halten.

Das stimmt natürlich. Andererseits kann ich nicht genau sagen, ob es nicht vielleicht zwanzig Werte pro Tag sein werden (auch egal, …), und dann würde ich das ganze auch gerne schon von vornherein korrekt angehen.

agmue:
Mir fallen drei Möglichkeiten ein:

  • Du schreibst ein Initialisierungsprogramm, das den Startwert für den Mittelwert ins EEPROM schreibt.
  • Du initialisierst den Startwert des Mittelwertes in setup() und kommentierst diesen Teil für den nächsten Start.
  • Ein neues EEPROM ist mit 0xFF in allen Speicherstellen beschrieben. In setup() liest Du den im EEPROM gespeicherten Mittelwert. Entspricht dieser einem Wert, der aus 0xFF Bytes besteht1), so nimmst Du anstelle des gelesenen Wertes den Startwert.

Anm.:

  1. Bei ganzzahligen Dateitypen ist das einfach, bei Fließkomma würde ich den Speicherbereich zunächst als ganzzahlig lesen.

Die ersten beiden Varianten htte ich auch so in Erwägung gezogen. Die dritte ist vermutlich die eleganteste, daher werde ich es damit versuchen. Eigentlich sollte die Sensorauswertung ganzzahlige Ergebnisse bringen, da muss ich allerdings noch etwas daran schrauben. Vielen Dank!

Sorry, das verstehe ich nicht.

Echt?

Dann mal Klartext:
Was für ein EEPROM willst du verwenden?

Ja, es gibt verschiedene.
Es ist mir ein Rätsel, warum der Type geheim bleiben soll, da doch die Lebensdauer im Datenblatt definiert ist.
Und deine Frage dreht sich doch um Lebensdauer, oder nicht?

Also: Fakten auf den Tisch.
Ansonsten bleibt das ein Eiertanz.

Gefühle und Emotionen, sind echt toll!
Nur eben bei solchen Fragen eher hinderlich, als förderlich, wenn sie nicht auf Fakten, sondern eher auf Angst, beruhen.

Andererseits kann ich nicht genau sagen, ob es nicht vielleicht zwanzig Werte pro Tag sein werden (auch egal, ...), und dann würde ich das ganze auch gerne schon von vornherein korrekt angehen.

Ich verstehe deinen Wunsch, es korrekt anzugehen!
Aber was ist "korrekt", wenn die Bedingungen schwammig sind.

Beispiel:
Warum hast du dich schon auf ein EEPROM festgelegt, wenn es doch Alternativen gibt, welche evtl viel besser geeignet sind.

Hallo,

ich würde in das EEPROM eine Kennung eventuell mit einer CRC über meine Daten schreiben.

Also so was

char Id[] = "!"§$§$$ULLI 1%$%$%$§"";

Im Setup schauen ob die ID da ist und ob die CRC über ID und Daten korrekt ist.
Wenn nicht -> Initialen Wert schreiben, ansonsten Wert auslesen.

ACHTUNG : Natürlich muss bei jedem Schreiben die CRC aktualisiert werden da die sich ja verändert
und dann beim nächsten Setup wieder Neuinitialisieren erkannt würde.

Ulli

p.s. Ich denke er meint das im Atmega eingebaute EEPROM

p.s. Ich denke er meint das im Atmega eingebaute EEPROM

Mag sein....

Aber warum sagt er das nicht?

Und warum muss es dieses sein?
Und nicht ein z.B. Fram. Dann muss man sich um Haltbarkeit keinen Kopf machen....

Raten kann ich übrigens auch:
Im System befindet sich schon eine RTC mit einem riesigen EEPROM, welches 1000000 Zyklen hält.

Ich nehme an Du hast eine RTC um eine genaue Zeit zu haben. Warum nimmst Du nicht eine RTC die auch einige Byte RAM hat wie zB DS3232? auch ein Ds1307 hat 56 Byte RAM ist gegenüber dem 3232 aber ungenauer.

Das RAM kannst Du sooft Du willst beschreiben.

Grüße Uwe

Halllo,

wenn Du den aktuellen Mittelwert 1-2 mal am Tag auf das interne Eprom sicherst kann nach einem Spannugsausfall der neue Mittelwert doch nicht so falsch sein das es nicht mehr stimmt. Klar wenn der Spannungsausfall sehr lang ist kann sich bei dem neuen Messwert eine grösse Abweichung zum alten Mittelwert ergeben und damit ein Alarm ausgelöst werden. Mann könnte das aber vermeiden wenn man nach dem Anlaufen erst mal wieder einige Messungen macht und die zur Berechnng des Mittelwertes benutzt bevor man den Alarm scharf macht. Das macht dann das erforderliche Fenster kleiner.

wie man das mit dem EEprom programmtechnisch macht findest Du u.A in Der Hilfe

Heinz

Hayley_Hay:
… und die Speicherfähigkeit reduziert …

Du kannst auch jeden Mittelwert speichern, wenn Du beispielsweise ein FRAM verwendest (siehe #6). Schnittstelle I2C oder SPI.