www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kontrollierter Softwarereset


Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Altera (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf Tastendruck schaltest du den Watchdog ein, fertig. Warum sollte da 
was ungewollt kommen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: 42 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es soll Leute geben, die den Reset-Taster am Resetpin anschließen.

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>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.

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es denn mit einem Jump zum Resetvektor ?

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/wdt.h> //Watchdog

strcpy(ausgabetext,"Neustart?");
lcd_ausgabe(1,ausgabetext);
if (bit_is_clear(PINB,PB2))
{
loop_until_bit_is_set(PINB,PB2);
wdt_enable(WDTO_15MS);
while(1);      
}
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

Autor: Besenstil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wobei WinAVR20060421 aus "RJMP 0" alles mögliche macht, nur keinen 
Sprung auf den nächsten Befehl :)
Bsp
#include <avr/io.h>
#include <avr/interrupt.h>


ISR(TIMER0_COMP_vect)
{
}


ISR(TIMER0_OVF_vect)
{
}


int main(void)
{
  asm volatile ("RJMP 0"::);
  while(1);
}

wird zu
@00000047: __vector_19
---- rjmp_tst.c -----------------------------------------------------------------------------------
6:        {
+00000047:   921F        PUSH    R1               Push register on stack
+00000048:   920F        PUSH    R0               Push register on stack
+00000049:   B60F        IN      R0,0x3F          In from I/O location
+0000004A:   920F        PUSH    R0               Push register on stack
+0000004B:   2411        CLR     R1               Clear Register
+0000004C:   900F        POP     R0               Pop register from stack
+0000004D:   BE0F        OUT     0x3F,R0          Out to I/O location
+0000004E:   900F        POP     R0               Pop register from stack
+0000004F:   901F        POP     R1               Pop register from stack
+00000050:   9518        RETI                     Interrupt return
@00000051: __vector_9
11:       {
+00000051:   921F        PUSH    R1               Push register on stack
+00000052:   920F        PUSH    R0               Push register on stack
+00000053:   B60F        IN      R0,0x3F          In from I/O location
+00000054:   920F        PUSH    R0               Push register on stack
+00000055:   2411        CLR     R1               Clear Register
+00000056:   900F        POP     R0               Pop register from stack
+00000057:   BE0F        OUT     0x3F,R0          Out to I/O location
+00000058:   900F        POP     R0               Pop register from stack
+00000059:   901F        POP     R1               Pop register from stack
+0000005A:   9518        RETI                     Interrupt return
@0000005B: main
16:       {
+0000005B:   E5CF        LDI     R28,0x5F         Load immediate
+0000005C:   E0D4        LDI     R29,0x04         Load immediate
+0000005D:   BFDE        OUT     0x3E,R29         Out to I/O location
+0000005E:   BFCD        OUT     0x3D,R28         Out to I/O location
17:         asm volatile ("RJMP 0"::);
+0000005F:   CFE7        RJMP    PC-0x0018        Relative jump
18:         while(1);
+00000060:   CFFF        RJMP    PC-0x0000        Relative jump

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

Autor: FBI (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.