Forum: Mikrocontroller und Digitale Elektronik Sicherheit NV-RAM einer RTC (Prüfsummenbildung)


von Tubie (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Tubie (Gast)


Lesenswert?

Das würde dann also so aussehen?
1
ldi r16,1
2
eor r16,r18
3
eor r16,r19
4
eor r16,r20
5
eor r16,r21
r16 = prüfsumme


ist das dann sicherer als:
1
ldi r16,1
2
add r16,r18
3
add r16,r19
4
add r16,r20
5
add r16,r21


...es kommen bei beiden Varianten andere Ergebnisse bei raus, welches 
ist dazu aber besser geeignet?


gruß,
Tubie

von Dietrmar E (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Tobias P. (hubertus)


Lesenswert?

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.

von Tubie (Gast)


Lesenswert?

@ 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

von Tubie (Gast)


Lesenswert?

@ 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

von crazy horse (Gast)


Lesenswert?

nimm einen FRAM, dann hast du alle Nachteile erschlagen.
Platz genug für mehrere Datensätze.

von Tobias P. (hubertus)


Lesenswert?

FRAM?

von Falk B. (falk)


Lesenswert?


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.