Forum: Mikrocontroller und Digitale Elektronik AVR32 Software Restart


von flomll (Gast)


Lesenswert?

Hallo gibt es eine Möglichkeit den AVR32 zu rebooten per C-Code? Außer 
durch den Watchdog?

Hätte die Funktion aus dem Framework versucht, doch leider fährt das 
ding dann nicht mehr hoch!!

void wdt_reset_mcu(void)

von Josef D. (jogedua)


Lesenswert?

Warum nicht mit Watchdog? Mach ich immer so.
Wenn "das Ding" nicht wieder hoch kommt, hast Du vielleicht was falsch 
gemacht. Wenn Du den Code zeigst, kann man vielleicht helfen.

von Ralf G. (ralg)


Lesenswert?

Ein kompletter Neustart ist doch eigentlich nur nötig, wenn was richtig 
schiefgelaufen ist (µC hängt fest). Ob er (der µC) dann noch den Befehl 
zum RESET findet?

von Josef D. (jogedua)


Lesenswert?

Sorry, sehe gerade, dass da AVR32 steht und nicht ATmega32.
Aber da wird das vermutlich auch so sein. Ein Sprung auf den 
Reset-Vektor startet das Programm neu, aber die Hardware ist in keinem 
definierten Zustand. Damit wird man nicht glücklich.

von Ralf G. (ralg)


Lesenswert?

Ist mir gerade noch eingefallen:
Für den Notfall, dass man, z.B., bei der Auswertung von Daten 
feststellt, dass hier irgendwas nicht stimmen kann, würde ich mal 
probieren (ich weiß nicht, ob das geht), einfach mal ein 
Assemblerschnipsel mit 'jmp 0' reinzubasteln.

Josef D. schrieb:
> Ein Sprung auf den
> Reset-Vektor startet das Programm neu, aber die Hardware ist in keinem
> definierten Zustand.

In den Initalisierungsroutinen müssen dann alle verwendeten Register, 
die normalerweise nach dem Einschalten automatisch mit '0' initialisiert 
werden, 'von Hand' gelöscht werden. Falls sonst noch was ringsrum ist, 
muss man das natürlich auch beachten.

von Josef D. (jogedua)


Lesenswert?

In den Initalisierungsroutinen müssen ...

So habe ich auch angefangen, als ich noch nicht wusste, wie das mit dem 
Watchdog funktioniert; nichts als Ärger...

Wenn man ein Problem hat, das man nur mit einem jmp 0 (das geht auch mit 
C-Mitteln ohne Assembler) zu lösen können glaubt, kann man auch den 
Watchdog starten:
   wdt_enable(WDTO_500MS);
   while(1);  // warten, bis er beisst
Ich gebe vorher noch eine Fehlermeldung über die ISR-getriebene UART 
aus, deshalb warte ich etwas länger, damit der Puffer noch geleert 
werden kann.

In der Initialisierung darf man dann nur nicht vergessen, als erstes den 
Watcgdog wieder aus zu schalten,
s. 
http://www.rn-wissen.de/index.php/Avr-gcc/Interna#Frühe_Codeausführung_vor_main.28.29

von Josef D. (jogedua)


Lesenswert?

und z.B.
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf
Code-Beispiel Seite 51 und Erläuterungen drum herum.

von Phil S. (zippi)


Lesenswert?

HI,

Also wenn du AVR32 Studio hast dann probier die 2 Zeilen Code mal:
1
int Reglist[16] = {0x80000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
2
asm volatile ("ldm %0,r0-r12, lr, sp, pc" :: "r"(Reglist) : "memory");

gruß
Zippi

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
Noch kein Account? Hier anmelden.