Hallo, ich habe da mal eine Frage bezüglich Variablen nach einem WDT-Reset. Ist es möglich diese nach dem Reset mit dem vorigen Wert weiter zu verwenden? Konkret möchte ich nach einem Reset mit den selben Einstellungen in meinem Programm weiter arbeiten. Ich habe mal versucht das ganze mit einem kleinen Testprogramm auszuprobieren, es hat leider nicht funktioniert. Eine Zählveriable sollte manuell verändert werden können und nach einem WDT-Reset ihren Wert behalten. Wenn ich die Variable jedoch nur in der Schleidfe if(!(MCUCSR&8)) deklariere motzt der Compiler. Mein Testprogramm habe ich mal angehängt. Die Befehle initDisplay, wert- und textSenden beziehen sich auf ein angeschlossenes LCD. Wäre schön wenn jemand mit der Problematik schon ein paar Erfahrungen sammeln konnte und mir evtl weiter helfen kann. Schönes WE an alle ;) Jan
Hmm... wie sollte das gehen? Reset ist Reset - egal warum. Und nach einem Reset ist der Inhalt des SRAMs undefiniert oder mit einem festen Zeichen vorinitialisiert (hab's Datenblatt gerade nicht parat). Du kannst lediglich die Ursache für den Reset ermitteln und danach entsprechend den Benutzer informieren. Zudem sehe ich keinen Grund dafür, dass der Controller nach dem Reset (der ja durch einen Fehler ausgelöst wurde) so tun soll, als ob nichts passiert sei. Dann kannst du den Watchdog auch direkt ausschalten - das hätte denselben Effekt.
Hi Die Initialsierung der Variablen wird beim Programmstart durch die Software durchgeführt. Das ist bei einem Power-On-Reset natürlich sinnvoll. Nach einem Watchdog-Reset sind Registerinhalte und Ram erst einmal unverändert, werden aber überschrieben, wenn der Reset wie ein normaler Reset behandelt wird (s.o.). Im MCUSR kann die Ursache des Resets festgestellt werden. Wenn du das WDRF-Bit beim Programmstart auswertest kannst du die normale Initialisierung umgehen und auf einen Watchdogreset reagieren. MfG Spess
Oh, das war mir neu! Dann nehme ich einen Teil zurück und schau mir das nochmal an.
Hi, ist problemlos möglich, z.B. unter C (GCC) __attribute__((noinit)). Dann wird die Variable nicht vom Startupcode initialisiert. Musst Du dann selber im Falle eines PowerOn-Resets selber initialisieren. Bein WD-Reset dann eben nicht. Gruss
Danke für eure Antworten, werde dann mal wieder etwas rumspielen. ;)
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.