Wiederherstellung von ORC1A-Wert nach Reset

Gast #4156075
Lesenswert?

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!
#4156151
Lesenswert?

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...).
Gast #4156257
Lesenswert?

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...
(Firma: matzetronics) #4156272
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren