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
Speichere die aktuelle Position nach jedem berechtigten Zugang - so wirst Du das Ende des EEPROM eher nie erreichen. Otto
>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
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
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.
Ach ja, nach dem Stromausfall könnte der Controller die nächste Adresse ja schon mal suchen, bevor der nächste Kandidat kommt.
µ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.
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.
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"?
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.
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)
@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
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.