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)
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.
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?
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.
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.
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
und z.B. http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf Code-Beispiel Seite 51 und Erläuterungen drum herum.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.