Forum: Mikrocontroller und Digitale Elektronik Nach Stromausfall wissen wieviele Datensätze im EEPROM gespeichert sind


von Franz Z. (Gast)


Lesenswert?

Hallo AVR Freunede,

ich habe eine Zugangssystem gebaut welches nun seit einigen Monaten ohne 
Probleme funktioniert. Nun habe ich schon bei der Planung einen EEPROM 
vorgesehen auf dem gespeichert werden soll welcher Schlüssel(CODE) 
verwendet wurde mit der Uhrzeit und dem Datum.
Ich habe also einige Arrays in denen die Zugansberechtigungen hinterlegt 
sind.
Jede Berechtigung hat eine Nummer welche ich mit der Uhrzeit und dem 
Datum speichern will.
Zur Hardware, ich verwende einen MEGA128 und einen EEPROM 24C256 oder 
ähnlich der per I²C angeschlossen ist.
Die Kommunikation funktioniert bereits also lesen/schreiben etc.
Im Prinzip ist die ganze Schaltung Batteriegepuffert für ca. 24Std 
Notlauf.
Jedoch würde ich doch gerne einen Stromausfall berücksichtigen.
Jeder Datensatz besteht aus 10 Byte Werten, wenn ich nun speichere zähle 
ich dann immer die Speicheadresse im EEPROM rauf.
Soweit so gut jedoch nach einem Stromausfall weis ich meine aktuell 
Position nicht mehr.
Wie kann ich es erreichen nach einem Neustart die Aktuelle Position zu 
ermitteln.
Was ich nicht möchte ist an eine bestimmte Stelle im EEPROM die aktuelle 
Position immer mit zu loggen da ja dann dort die Maximalen Schreibzyklen 
schnell erreicht werden können.
Ich habe mir überlegt als erstes den Ganzen Speicher mit 0xff zu 
beschreiben und bei einem Neustart schauen wann ich diesen Wert als 
erstes finde und dort ist dann die erste Schreibadresse.
Ist jedoch der Speicher ziemlich voll dauert das ganze natürlich was ich 
irgendwie auch vermeiden will.

Ich hoffe jemand hat eine Idee oder Anregund zu diesem Problem.
Wie gesagt ich bin noch am Anfang und bin daher noch für alles offen.

Vielen Dank und schönes Wochenende

Franz

von Otto (Gast)


Lesenswert?

Speichere die aktuelle Position nach jedem berechtigten Zugang - so 
wirst Du das Ende des EEPROM eher nie erreichen.

Otto

von Helmut L. (helmi1)


Lesenswert?

>Ist jedoch der Speicher ziemlich voll dauert das ganze natürlich was ich
>irgendwie auch vermeiden will.

Wenn man linear von Anfang an sucht. Wenn deine Daten so strukturiert 
sind das   0xff nur am Ende vorkommt und sonst nicht kannst du auch 
anders suchen.
Zuerst testet du in der mitte deines Speicherbereiches ob dort 0xff 
vorhanden ist. Wenn nein kann es nur in der oberen haelfte sein. Dann 
teilst du die obere haelfte in der mitte und testes weider auf 0xff. 
Sollte es jetzt in der unteren haelfte sein muss du diesen Bereich 
wieder in der Mitte teilen.
Das ganze ist als binaeres Suchen bekannt.

Gruss Helmi

von Pater (Gast)


Lesenswert?

Schreib an einer festen Adresse (zB 1) einen Index auf ein 
Byte-Array[10] in dem Dein Zähler steht. Alle 250 Datensätze erhöhst Du 
den Index um 1 (Modulo 10). Damit kannst Du 10 mal so oft Datensätze 
schreiben ohne den EEprom zu zerstören. Wenns nicht reicht nimm ein 
Array von 100.

Peter

von flätz (Gast)


Lesenswert?

Das Problem mit der langen Zeit betrifft doch lediglich den ersten 
Kandidaten, der nach einem (langen) Stromausfall wieder einen Zugang 
benötigt. Wäre meiner Meinung nach akzeptabel.

Alternativ könnte man sukzessiv auf "FF" testen: Erst in der Mitte des 
Speichers. Falls dort "FFs" sind, bei 1/4 des Speichers usw.

von flätz (Gast)


Lesenswert?

Ach ja, nach dem Stromausfall könnte der Controller die nächste Adresse 
ja schon mal suchen, bevor der nächste Kandidat kommt.

von Der wohl ahnungslose (Gast)


Lesenswert?

µC gepuffert versorgen.
Auf einem IN liegt die ungepufferte Eingangsspannung.
Sobald die Eingangsspannung weg ist, die aktuelle Position im Eeprom 
ablegen.
Die Pufferung sollte natürlich wenigstens solange halten, bis die 
Adresse sicher geschrieben ist, dann µC schlafen schicken und bei 
Spannungsrückkehr diese Position auslesen.

So könnte man die Daten im Eeprom auch überschreibbar machen - also, 
wenn z.B. die Datensätze per PC (oder so) ausgelesen wurden, müssen die 
ja nicht im Eeprom stehen bleiben.

von Ralph (Gast)


Lesenswert?

Warum legst du die Adresse den aktuellen Datensatzes nicht einfach im 
EEProm ab ?
Die Dinger haben normalerweise 1 000 000 Schreibzyklen pro 
Speicherzelle.

Wie oft willst du denn da Daten ablegen das der Wert erreicht wird ?

Kurze Rechnung:
10 Byte pro Datensatz
1000000 Schreibzyclen auf den Index

ergibt ein EEProm Größe von 10 MByte.

Bei kleinerem EEPROM müsstest du Datensätze überschreiben.
Damit fällt auch die Suche nach dem leeren Datensatz mir FF aus.
In diesem Fall wirst du ohne gespeicherten Index nicht weiterkommen.

von Sven (Gast)


Lesenswert?

1 mio garantierte Schreibzyklen (unter Max-Bedingungen)
bei 20 Jahren Laufzeit sind das 50 000 Schreibzyklen pro Jahr
sind 137 Schreibzyklen pro Tag

Wie oft willst Du Deine Haustür denn am Tag "aufschließen"?

von Jens P. (picler)


Lesenswert?

Vielleicht noch ein anderer Lösungsansatz: Da ja eh ein I2C-Bus 
vorhanden ist, könnte man einen RTC mit NV-Ram einsetzen, z. B. DS1307. 
Der hat 56Byte SRAM, welcher mittels 3V-Knopfzelle gepuffert ist. Damit 
hat man den Pointer auf den letzten Datensatz und eine Echtzeituhr, die 
bei Stromausfall weiterläuft.

von Bartholomäus S. (sam_vdp)


Lesenswert?

Gibt's bei Atmel auch ein Appnote dazu:
AVR101: High Endurance EEPROM Storage
http://atmel.com/dyn/resources/prod_documents/doc2526.pdf
(Benutzt zwei Ringpuffer um das Problem der stark belasteteten 
"Indexzellen" zu umgehen)

von Falk B. (falk)


Lesenswert?

@Jens A: (picler)

>vorhanden ist, könnte man einen RTC mit NV-Ram einsetzen, z. B. DS1307.
>Der hat 56Byte SRAM, welcher mittels 3V-Knopfzelle gepuffert ist. Damit
>hat man den Pointer auf den letzten Datensatz und eine Echtzeituhr, die
>bei Stromausfall weiterläuft.

Da kann man auch den AVR puffern und spart die externe RTC. Oder man 
speichert nur bei Stromausfall.

http://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

MFG
Falk

von Franz Z. (Gast)


Lesenswert?

@all,

Vielen Dank für die zahlreichen Antworten.

Ich habe gemeint mal gelesen zu haben das ein EEPROM max.100000 
Schreibzyklen garantiert, jedoch nach einem Blick ins Datenblatt muss 
ich dies revidieren 1 Mio. ist korrekt.
Also könnte ich wirklich den Speicherstatus mitschreiben, hmmm.
Andererseits gefällt mir der Vorschlag den Suchbereich immer halbieren 
kommt man eigentlich auch recht schnell zum Ziel.
Wie gesagt im Prinzip ist ein Notstrombetrieb vorhanden somit wird das 
Ganze auch bei Stromausfall weiterlaufen.
Jedoch habe ich eine Vorkehrung getroffen das wenn sich das System mal 
aufhängen sollte ich es von Aussen RESETEN kann.
Dieser Restart dauert im Moment ca. 40 Sekunden und diesen möchte ich 
eigentlich recht ungern verlängern er dauert nur so langen da das System 
zuert den Bus nach vorhandenen Lesern durchsuchen muss und das dauert 
eben und diese Zeit ist eben fix.
Die Datensätze sollten eigentlich nie überschrieben werden da ich diese 
auslesen will und an PC visualisieren.
Nach jedem Auslesevorgang wird der Speicher wieder auf 0xff gesetzt.
Nur wenn ich den Speicher nicht rechtzeitig auslese soll immer der 
älteste Datensatz überschrieben werden. So der Plan :-)

Ich werde mal schauen wie lange es dauert wenn ich den es mache wie es 
Helmut beschrieben hat.

Gruß

Franz

von Sven (Gast)


Lesenswert?

Kann sein, dass ich mich irre: Bei einem externen Reset bleiben doch die 
Register und der SRAM erhalten? Einige AVRs haben auch Flags, die 
beinhalten, wodurch der Reset ausgelöst wurde (WDT, extern, BOD...)

Schreibe die Position an eine Stelle im SRAM, daneben einen Prüfwert 
(Position eor 0xFF). Bei Neustart / Reset frage die Resetquelle ab. Wenn 
externer Reset, hole die Position aus dem SRAM und teste mit dem 
Prüfwert, ob gültig.

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.