Ich habe ein kleines Problemchen . Ich möchte Benutzereingaben in einem Zähler zählen . Nehmen wir an am Tag benutzen das Gerät 1000 Nutzer so sollte diese Zahl dauerhaft gespeichert werden also auch wenn der Strom weg ist . Dazu müsste ich es quasi ständig ins EEprom schreiben allerdings wäre dieses bei 1000 Nutzern am Tag auch relativ schnell am Ende seines Lebens bei ca. 100-200k Zyklen . Die einzige unelegante Lösung die mir eingefallen ist ,wäre das Gerät nur vom Strom zu trennen nachdem man eine Funktion benutzt hat, die dann den Zählerwert ins Eeprom speichert und danach die Meldung "Sie können nun das Netzteil ausstecken" ausgibt . Aber diese Lösung ist absolut nicht nach meiner Vorstellung . Hat daher sonst jemand eine Idee wie ich das lösen könnte ? Ich nutze übrigens ein ATMega168 für die ganze Geschichte . Am tollsten wäre es wenn der Avr kurz vor dem Brown Out noch schnell die Daten in das Eeprom packt, aber das dürfte wohl unmöglich sein :( . Bin für jede Idee dankbar .
Jörg schrieb: > Am tollsten wäre es wenn der Avr kurz vor dem Brown Out noch schnell die > Daten in das Eeprom packt, aber das dürfte wohl unmöglich sein :( . ein kleiner Kondensator und schon ist es sehr gut möglich
Jörg schrieb: > Am tollsten wäre es wenn der Avr kurz vor dem Brown Out noch schnell die > Daten in das Eeprom packt, aber das dürfte wohl unmöglich sein :( . Naja sowas in der Art könnte man zumindest machen. z.B. mit ADC Spannung messen / Komparator und bei entsprechend niedirgem Eingangsspannungswert die Abspeicherung im EEPROM initiieren. Das ganz noch über einen Elko puffern der die 10-20ms überbrücken kann.
Controller lange genug puffern um einen Schreibvorgang abschließen zu können. Dazu eine entsprechende Detektorschaltung für den Spannungseinbruch (muss dann natürlich die Spannung vor dem Puffer messen). Alternativ: Nie auf die selbe Zelle schreiben sondern immer eine Zelle nach der anderen bis das EEPROM voll ist - dann wieder löschen und von vorne beginnen. So lässt sich die Lebensdauer des EEPROMs deutlich erhöhen (Stichwort: Wear leveling).
genau, immer auf die nächste zelle schreiben und beim ende wieder am anfang anfangen. das programm kann dann beim start den kompletten eeprom nach dem höchsten wert absuchen. dürfste die einfachste form eines wear leveling algorithmus sein.
Ben _ schrieb: > das programm kann dann beim start den kompletten eeprom > nach dem höchsten wert absuchen. dürfste die einfachste form eines wear > leveling algorithmus sein. Und der Vollständigkeit halber: Und auch nach dem niedrigsten, der dann als nächsten beschrieben wird. Er ist ja "quasi" der älteste Eintrag. ;) Gruß, Marcel
hat eigentlich irgendjemand mal einen testlauf gemacht wie lange es dauert bis das eeprom eines AVR wirklich platt ist? also wieviele schreibzugriff auf eine adresse man braucht bis fehler auftreten...?
Ja ich denke die Lösung mit dem Spannungseinfall detektieren gefällt mir. Das werde ich einfach mal ausprobieren . Ben _ schrieb: > hat eigentlich irgendjemand mal einen testlauf gemacht wie lange es > > dauert bis das eeprom eines AVR wirklich platt ist? Hatte ich im Forum hier irgendwo gelesen .Insgesamt hat er 200.000 Zugriffe gehabt bevor die ersten Fehler auftraten .
Wie implementiert man das denn technisch am besten, um zu erkennen, dass der Strom am ausgehen ist? Kann der Brown-Out-Detector das oder müsste man über einen separaten Pin/ADC messen?
Ist ein I²C-Schnittstelle vorhanden? Wenn ja könnte man einen FRAM nehmen, das Teil ist allerdings recht teuer. Eine günstige Alternativer wäre der DS1307. Ist ein RTC mit 56Byte statischen RAM, welcher mit Knopfzelle gepuffert wird. Als Nebeneffekt hast du die Uhr gleich mit drin.
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.