Hi
Ich würde gerne meinen Prozessor auf einen Tastendruck neustarten, damit
die Werte aus dem EEPROM neu gelesen werden, Variablen wieder auf den
Initialisierungswert am Anfang gesetzt werden usw.
Gelesen habe ich, dass das mit dem Watchdog geht - aber den wollte ich
eigentlich nicht nehmen. Habe Angst, dass ich dann
unkontrollierte/ungewollte Resets hinzubekomme.
asm volatile ("RJMP 0") tut auch nix.
Gibt es noch eine Möglichkeit ohne externe Beschaltung?
Ciao Tobias
Wer sagt denn, daß Du den EEPROM nur nach nem Reset lesen darfst und die
Variablen nur nach einem Reset schreiben ???
Du darfst das alles immer und zu jeder Zeit machen.
Ein Reset mag ich nicht, da dann alle Port kurz auf hochohmig gehen.
Peter
nein, lesen und schreiben darf ich immer. aber die komplette
Initialisierung aufs neue würde ich mir sparen. Halt ein Knopfdruck,
Neustart und alles ist wieder, als hätte ich gerade erst den Strom
angeschlossen. Wie rücksetzen auf Werkszustand.
Auf Tastendruck erst den Watchdog einschalten, so einfach und doch
effektiv, das hätte was. Habe die ganze Zeit gedacht, ich müsste den
Watchdog einschalten, immer schön resetten und für einen gewollten Reset
dann einfach mal den Reset des Watchdog "vergessen" - aber auf deine
einfache Idee bin ich nicht gekommen! :-) Manchmal steht man einfach auf
dem Schlauch...
Danke!
Ciao Tobias
>>Es soll Leute geben, die den Reset-Taster am Resetpin anschließen.
Zitat von mir:
>>>"Gibt es noch eine Möglichkeit ohne externe Beschaltung?"
Ich habe eine Art Tastatur und ein Display und man soll quasi einen
Menüpunkt auswählen können, der den Neustar bewirkt.
tut bereits Wunderbar seinen Dienst.
strcpy(ausgabetext,"Neustart?"); ist aufgrund einer noch folgenden
Funktion nötig.
>Wie wäre es denn mit einem Jump zum Resetvektor ?
asm volatile ("RJMP 0")
Tut leider rein gar nix... Aber ich kann kein Assembler, ist der denn
überhaupt richtig?
Ciao Tobias
Ein RJMP 0, resetted die internen Register nicht. Weshalb sollte es?
Zudem sollte die Schaltung so gebaut sein, dass die Pins tristate sein
koennen, ohne das unkontrollierte oder schaedliche Zustaende eintreten.
Dies, da es immer einen Zeitpunkt ohne Programm gibt. zB auch waehrend
der Programmentwicklung.
B.
RJMP 0 sollte bei jedem guten Programm funktionieren ... (und C-Compiler
sollten ja eigentlich guten code produzieren) Denn jedes Register sollte
mit einem Wert geladen werden bevor es benutzt wird. Du kannst natürlich
auch am start des controllers alle register auf 0 setzen (mit Pointer
und SRAM zugriff)
>auch am start des controllers alle register auf 0 setzen
Vorsicht: Nicht für alle Register ist der Wert nach einem Hardwarereset,
d.h. der Soll-Startwert, identisch mit dem Wert 0!
Ein RJMP 0 wird da natürlich nicht gehen.
Das R steht ja für "Relativ". Die 0 bezeichnen
den Offset zur momentanen Position im Programm.
Ein RJMP 0 ist daher kein Sprung zur absoluten Adresse
0, sondern ein Sprung .... zur Anweisung nach dem
RJMP 0.
Wenn schon, dann muss das ein normaler JMP sein
und kein relativer.
Wie man sieht geht der Sprung zur Adresse von 'TIMER0_COMP_vect'!
Wenn ich die Interuptroutinen auskommentiere springt er übrigens auf den
Anfang von main.
CU Frank
Hi,
nach einigen weiteren Tests ist klar was passiert. Bei "RJMP 0" springt
er immer auf den ersten generierten Code der aktuellen 'Compilation
Unit' (sprich dem C-File in dem der RJMP steht).
Kann man sicher ganz witzige Programme mit schreiben, ist aber wohl
meist nicht das was will.
CU Frank
BTW: WinAVR20070122 scheints übrigens genauso zu machen
FBI wrote:
> nach einigen weiteren Tests ist klar was passiert. Bei "RJMP 0" springt> er immer auf den ersten generierten Code der aktuellen 'Compilation> Unit' (sprich dem C-File in dem der RJMP steht).> Kann man sicher ganz witzige Programme mit schreiben, ist aber wohl> meist nicht das was will.
Ja, dieser Bug ist eigentlich schon lange bekannt.
Peter