Guten Abend, ich brauche einen Rat von euch. Zunächst paar Informationen zur HW und Vorhaben. HW: Ich benutze eine AVR AT90USB162. Vorhaben: Ich habe einen LED Dimmer mit HW PWM programmiert. Dieser läuft auch soweit, wie ich es mir vorgestellt habe. Problem: Wenn ich den Controller resete, wird der Wert im OCR1A zurückgesetzt, da ich diesen auf 0 setze beim initialisieren, damit ich einen definierten Zustand habe. Ich möchte aber gerne den zuletzt eingestellten Zustand/Wert wieder laden. Ansatz 1: Ich könnte den letzten Wert im Flash wo anders zwischenspeichern und beim initialisieren den OCR1A damit überschreiben. Könnte es da Probleme geben, die ich gerade nicht sehe? Ansatz 2: Ich habe gelesen, dass so etwas auch im EEPROM gespeichert werden kann. Ist das ein besseres Vorgehen? Oder gibt es noch andere Optionen, die ich mir anschauen könnte/sollte? Danke!
Gehts nur um einen Reset oder gleich eine "ganze" Stromunterbrechung? Das EEPROM ist für sowas deutlich besser geeignet, weil man einzelne Bytes beschreiben kann (Flash nur Pages), das EEPROM hält auch mehr Schreibzyklen aus. Wenn es nur um einen Reset geht, könnte man sich auch was mit dem SRAM überlegen. Gibt ja Flags, wo man den Reset-Grund auslesen kann. Wenn das kein Powerup/Brownout war, und ein Magic-Wert im SRAM stimmt, kann man einen anderen Wert hernehmen (oder so...).
Mir geht es um die Wiederherstellung nach Spannungsunterbrechung.
Dann wirst du um das wirkliche speichern nicht rum kommen. Da steht ja das meiste schon vom Vorredner da. Man kann den uC ausreichend puffern mit C's und misst die Versorgungsspannung. Sobald die zusammenbricht wird noch der letzte wert ins EEPROM geschrieben. Dann sind es nicht so viele Schreibzyklen...
Leider hat der AT90USB162 noch keinen BrownOut Interrupt, so das ein Schreiben im Powerdown Vorgang einige externe Hardware erfordern würde. Lustigerweise behauptet Atmel, das das Flash in diesem MC genauso viele Schreibzyklen verträgt wie das EEPROM, nämlich 100.000. Bleiben wir also beim EEPROM aus den o.a. Gründen. Wenn du pro Tag also einmal den OCR Wert speicherst, würde das eine Zelle in etwa 100.000 Tagen, bzw. 273 Jahren auslutschen. Glücklicherweise gibt es aber nicht nur eine EEPROM Zelle, sondern 512, die du mittels eines geeigneten Algorithmus auch hintereinander belegen könntest, bspw. indem du den alten gespeicherten Wert auf 00 setzt und in der nächsten Zelle deinen neuen Wert schreibst. Das verdoppelt zwar die Benutzung pro Zelle, verteilt das aber dann auf alle vorhandenen. Beim Starten sucht dann der MC nach der ersten Zelle, in der nicht 00 steht und lädt diesen Wert ins OCR. Externe EEPROM wie der 24C02 oder der 93C46 sind übrigens meistens auf 1.000.000 Schreibzyklen spezifiziert, so das es evtl. auch sinnvoll sein kann, so etwas zu verwenden.
:
Bearbeitet durch User
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.