Hallo, gibt es eine Möglichkeit im Programm einen Reset durchzuführen? Wenn ja kann mir bitte jemand sagen wie das geht. Oder ist dazu der Watchdog notwendig? Ich verwende einen Atmega 8, das Programm ist in C geschrieben. Der PC6 ist als Reseteingang (mit Taster) verwendet.
Wenn du einen HW Reset willst ist der Watchdog gut. WD starten und warten bis es passiert :)
Ich würde spontan mit einem freien I/O die Reset-Leitung auf Ground ziehen (also einfach den Taster mit einem Transistor kurzschließen). Watchdog ist auf jeden Fall 'ne lustige Idee :) Ich schau mal, ob's noch eine andere Möglichkeit laut Datenblatt gibt. Wenn dein Code zu Programmbeginn den Controller ordentlich initialisiert, sehe ich keinen dringenden Grund den Controller zu resetten. Ein Sprung zum Programmanfang reicht da. Warum genau möchtest du den Resetten? Gruß Kai
Habe gerade nochmal das Kapitel "System Control and Reset" überflogen und keinen Hinweis darauf gefunden, dass man einen regulären Reset per Software auslösen kann. Die einzigen Optionen sind: Power-on Reset, External Reset, Watchdog Reset, Brown-out Reset
Eigentlich will ich nur wieder ganz zum Anfang springen. Bevor ich in die Endlosschleife gehe und nur noch die Interrupts erledigt werden. Kann man vielleicht den Resetpin PC6 Software mäßig auf 0 ziehen? Der Reset würde mir nämlich garantieren das ich immer den selben Anfangszustand habe. Den Reset auf 0 zu ziehen über einen Ausgang kann ich leider nicht machen da ich alles belegt habe. Der Atmega ist so zu sagen gut ausgenützt (von den I/O's her) :). Ein goto im Programm ist zwar nicht elegant, aber wenn's funkt kann man es ja machen. Werd's morgen mal probieren.
Wenn ein GOTO nicht geht, könnte man inline Assembler (RJMP 0 ) benutzen, nicht gerade C conform, sollte aber gehen.
RJMP 0 ist solange okay, wie das Programm alle Initialisierungen, die der Controller dann nicht machen kann, selber erledigt. Ansonsten eher gefährlich. Der Watchdog ist als "richtige" RESET-Quelle erste Wahl.
Ich weiß ja nicht, was für ein merkwürdiges Gerät Du bauen willst, aber ein Reset ist in der Regel äußerst unerwünscht (wie z.B. bei Deinem PC). Alle Ausgänge werden hochohmig, d.h. alle LEDs gehen aus, alle Relais fallen ab, alle Einstellungen (Variablen) werden vergessen usw. Machs besser wie bei einem PC, d.h. wenn eine Task beendet ist, geht sie zurück zur Mainloop. Wichtige Tasks, z.B. Uhrzeit zählen, laufen dann im Hintergrund (Interrupts) weiter. Peter
By the way: RJMP 0 springt nicht wirklich an den Anfang. Es macht einfach nichts... wie NOP Besser wäre eine der folgenden Methoden zu verwenden: - CEI -> JMP start - CLR T -> PUSH T -> RET - CLR Z -> IJMP Am saubersten ist ein Reset über den Watchdog oder Hardware. Beim Watchdog das Abschalten der Interrupts nicht vergessen! Wie oben schon erwähnt ist ein Reset nicht üblich - es heißt eher, dass deine Initialisierungen nicht sauber genug sind. Nach einem Firmware-Update per Boot-Loader sehe ich einen Reset teilw. noch ein. Gruß Kai
Werner wrote: > Den Reset auf 0 zu ziehen über einen Ausgang kann ich leider nicht > machen da ich alles belegt habe. Der Atmega ist so zu sagen gut > ausgenützt (von den I/O's her) :). könnte doch einen Sprung zu direkt dem Programmteil der nach RESET kommt... > Ein goto im Programm ist zwar nicht elegant, aber wenn's funkt kann man > es ja machen. > > > Werd's morgen mal probieren. Ja, ein Goto ist nicht elegant, ein Sprung zu RESET in ASM ist aber mindestens genauso unelegant. Wenn Dein Programm einen Reset benötigt um zu funktionieren hast Du schon was falsch gemacht. Probleme an den Resultaten zu kurieren bringt nicht viel. Grüße Björn
Der Grund dafür wäre, das man per Taster ein paar Einstellungen (Prg Vorgaben) machen kann. Um nicht dauernd Rechenzeit zu vergeuden würde ich das am Anfang machen und danach das Programm laufen lassen. Ich möchte nämlich dass die Abtastzeit ziemlich gleichmäßig bleibt. Wenn ich jetzt aber etwas ändern will, muss ich aus und wieder einschalten.
>By the way: RJMP 0 springt nicht wirklich an den Anfang. Es macht >einfach nichts... wie NOP Schon recht. Sollte JMP $0000 heißen. Ist aber nur in ATMEGAs verfügbar.
Werner wrote: > Wenn ich jetzt aber etwas ändern will, muss ich aus und wieder > einschalten. Dann mach ne Loop un die Parametereinstellung und das Programm:
1 | int main( void ) |
2 | {
|
3 | for(;;){ |
4 | einstell(); |
5 | programm(); |
6 | }
|
7 | }
|
Peter
Hi, hab das Problem mit dem Reset auch. Allerdings will ich den Bootloader von Peter Dannegger per Software aktivieren. Ziel ist die automatische aktualisierung aus der ATMega IDE heraus. Bisher muss man noch einen Hardware-Reset auslösen. Ist aber nicht wirklich toll. Vor allem wenns keinen Taster dafür gibt g Ich hab das mit dem Watchdog probier, leider hängt sich der Controller dabei auf und ist nur mit abziehen der Versorgungsspannung wieder reaktivierbar (selbst Hardware-Reset mit Draht bringt nichts), und nach dem einschalten muss man ihn im Hardware Reset halten bis der Bootloader übertragen werden kann.
1 | cli(); |
2 | wdt_enable (WDTO_15MS); |
3 | while (1); |
Davor wird noch der UART von Peter Flury initialisiert und sendet einen String. Daran sieht man halt das er auch das eigene Programm nicht von vorn beginnt. (der Reset wird Testweise schonmal im Initbereich gemacht. Auskommentiert ist aber der gleiche Hänger auch im Hauptprogramm) Ciao Karsten
Hallo, ist zwar ein recht alter Thread, aber aufgrund sehr aktueller Erfahrungen habe ich eine relativ elegante Möglichkeit gefunden: wdt_reset() sorgt bei _nicht_-aktiviertem Watchdog für einen sofortigen Watchdogreset. Viele Grüße, Wolfhard
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.