Hallo,
ich möchte in Zeitabständen 1 sec - 10min Daten eines Zählers in in das
NVRAM einer RTC Speichern. Dazu stehen mir 56 Bytes zur verfügung.
Ich möchte insgesamt 4 32 Bit breite Zahlen speichern. Aus jeder soll
eine Prüfsumme gebildet werden, die als 5.Byte geschrieben wird. Dann
wird das ganze nochmals gespiegelt also mit insgesamt 10 Bytes
gespeichert. Somit sind dann 40 Bytes belegt.
Wenn beim zurücklesen dann die Prüfsumme nicht korrekt ist, so kann
immer noch auf den 2. Wert zugegriffen werden. Das ist allerdings nur
beim Start des systemes erforderlich, es existiert ein 1:1 Spiegel im
RAM des AVR.
Einmal Täglich sollen dann die gesammelten Wert auf ein EEProm
geschrieben werden. Aber nicht zwecks Datensicherheit, sondern nur zum
Auslesen und weiterverarbeiten in EXCEL. Evtl. könnte man auch den
letzten EEProm wert zurücklesen, falls die Batterie schlapp werden
sollte.
Welche Art der Prüfsummenbildung würdet ihr mir hier empfehlen? Dachte
schon an ein einfaches addieren und nur die letzten 8 Bit speichern. was
ist dann aber, falls der NV-RAM komplett auf 0 Steht, dann wäre ja
aufgrund der Prüfsumme alles ok - ist es aber nicht. Wollte eigentlich
auf CRC8 verzichten, da es ja wirklich nur 4 Bytes sind.
gruß,
Tubie
@ Tubie (Gast)
>Welche Art der Prüfsummenbildung würdet ihr mir hier empfehlen? Dachte
Man kann auch einfach ein Parity per XOR berechnen. Und mit ungerader
Parität klappt das dann auch mit einem leeren EEPROM.
MfG
Falk
Parität or CRC lassen nur erkennen, ob die Daten defekt sind. Es wäre
bessr, ein Fehlerkorrekturverfahren einzusetzen, wenn diese Daten sehr
wichtig sind. Fang doch mal hier an zu lesen, und danach ist Google Dein
bester Freund:
http://de.wikipedia.org/wiki/Fehlerkorrekturverfahren
@ Tubie (Gast)
>Das würde dann also so aussehen?
Fast, eher so.
[avrasm]
ldi r16,$FF
eor r16,r18
eor r16,r19
eor r16,r20
eor r16,r21
; r16 : Prüfsumme
[avrasm]
>...es kommen bei beiden Varianten andere Ergebnisse bei raus, welches>ist dazu aber besser geeignet?
Ist schwer zu sagem. Jetzt könnte man das mit viel Mathematik und
Wahrscheinlichkeitsrechung noch zerlegen, praktisch wird aber kein
nenneswerter Unterschied rauskommen.
MfG
Falk
Wenn die Batterie des NV-RAMS schlapp macht, wird es leider nicht so
sein, dass nur einzelne Bits verloren gehen. Das RAM wird vielmehr
komplett gelöscht. Ich hab dazu mal einen Test gemacht; RAM mit Daten
gefüllt, Speisespannung herabgesekt, wieder erhöht und gelesen - es
waren nur noch 0x55 0xAA 0x55 0xAA .... drin. Wenn die Batterie also
wirklich schlapp machen sollte, dann sind nicht nur deine gespeicherten
Werte weg, sondern auch noch deine mühsam berechneten CRCs oder
Paritätsbits.
Verwende besser ein NV-RAm wie z.B. das MK48Z02 von ST. Dies hat ein
sogenanntes BatteryOK-Flag drin. Beim einschalten des Microprocessors
musst du nur auf eine bestimmte Speicheradresse schreiben und den Wert
zurücklesen. Liest du denselben Wert zurück, wie du geschrieben hast,
ist alles OK, wenn jedoch die Batterie langsam schwächer wird, wirst du
0 zurücklesen. Das MK48Z02 würde ich die allerdings nicht unbedingt
empfehlen, ist nämlich leicht veraltet und glaub' ich ziemlich teuer.
Schaue ggf. im Datenblatt der RTC nach, obs da in einem Control Register
evtl. ein Battery-Flag gibt. Bei den Dallas-Typen DS1287 / DS12887 /
DS12C87 beispielsweise gibts dazu ein eigenes Register, das Control
Register D, wo Bit Nr. 7 den Batteriezustand angibt. Wenn das Bit = 1
ist, ist alles OK, wenn das Bit auf 0 ist solltest du die Batterie
(resp. halt den Chip) wechseln.
@ Falk Brunner (falk)
dann ist es auch egal, welches Format ich dann verwende ;) Mein Code
enthält schon die Addition - kann dann wohl auch so bleiben...
@Dietrmar E (Gast)
So wichtig, das ich mit Fehlerkorrektur arbeiten muß sind die Daten auch
wieder nicht. Es geht eigentlich nur darum, wenn gerade gespeichert wird
(5 Bytes) und bei Byte 2 wird die Stromversorgung unterbrochen noch ein
Backup zu haben. Desshalb werden alle Werte 2x gespeichert. Also reicht
hier eine einfache erkennung gut/defekt.
Soll wenns fertig ist ein Energiemengenzähler werden, um am Jahresende
festzustellen, wieviel mit Gas/Holz/Solar an WW/Heizung geheizt wurde.
Desshalb auch das Speichern auf EEProm am Ende des Tages, um einen
Jahresüberblick zu bekommen.
Gruß,
Tubie
@ Tobias Plüss (hubertus)
Der DS1307 hat leider dieses Flag nicht. Layout ist auch schon fertig,
so dass ein neuer Chip auch nicht ohne weiteres in frage kommt. Könnte
höchstens Softwaremäßig dafür sorgen, dass die Batterie alle 2 Jahre
ausgetauscht werden muß.
Gruß,
Tubie