PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Software-Reset?



mabuhay
28.01.2006, 01:08
Gibt es eine möglichkeit, per software den PIC zu resetten? Ich hab ne Intrrupt-Routine, welche den PIC in einem bestimmten Intervall zurücksetzen soll falls die sortware mal hängenbleibt...
Einfach aus der Interruptroutine an den Programmanfang herausspringen ist da natürlich nicht so schön. Oder hat jemand einen anderen Vorschlag?

mfg

[edit]
hmm, hab noch was gefunden auf http://www.picbasic.org/forum/showthread.php?t=4463&goto=nextoldest:

It all depends on the type of reset. If you want a full reset with all the pic regs going to there default state then you have to have a power out. Other wise just use @ goto 0

Das scheint auch zu funktionieren. Nun habe ich aber bemerkt, dass ein kompletter Reset natürlich auch mit meiner einleitenden Init-Routine alle meine Register zurücksetzt. Gibt es nun eine möglichkeit, aus der Interrupt-Routine an einen beliebigen Ort zu springen? Das hauptproblem ist ja, dass die Rücksprungadresse der Interruptroutine noch im Stack ist. Kann man den Stack irgendwie löschen?

mfg

linux_80
28.01.2006, 01:39
Hallo,

jetzt mal abgesehen vom SoftwareReset,
PICs haben doch auch einen Watchdog, sollte etwas einfacher gehen damit,
welchen PIC verwendest DU ?

mabuhay
28.01.2006, 12:45
benutze den 16F84

[edit]
Ist es auch möglich, den Watchdog Manuell auszulösen?

Ich betreibe den PIC mit 4Mhz. Ein Befehl benötigt also 1ms.
Der Watchdog wird alle 18ms ausgelöst (laut sprut, toleranzbereich 7ms...33ms).
Jetzt müsste ich also nach jedem 7. Befehl den Watchdog zurücksetzen?

Bernhard_
28.01.2006, 14:31
Hallo mabuhay,

wenn du deinen PIC mit 4 MHz taktest, dann sind das 1 Million instruction cycles pro Sekunde. Leider kenne ich deinen Typ nicht, aber ich gehe davon aus, dass er - wie die größeren - eine Befehls-Pipeline hat. Dann sind das bis zu 1 Million Befehle pro Sekunde. Ein Befehl dauert also ab 1 µs, nicht 1 ms.

Viele Grüße,
Bernhard

mabuhay
28.01.2006, 14:48
Oh ja danke, da bin ich ein wenig mit den Stellen verrutscht.

Ich hab das mit dem Watchdog nun versucht. Ich hab aber bemerkt, dass beim Reset, wenn die Init-Routine durchlaufen wird und wenn die I/O's wieder definiert werden, ich irgendein Signal an den Ausgängen habe.

Gibt es nun irgend eine Möglichkeit, in bestimmten Zeitintervallen an eine bestimmte Stelle im Programm zu springen, und dann auch dort fortzufahren? Wenn ich den Timer verwende, sollte ich ja am ende der Interruptroutine wieder mit "retfie" an den Ort zurückspringen, an welchem der Interrupt eingesetzt hat...

mfg

[edit]
Wird beim auslösen des Watchdog (wie beim Timer0 das TOIF) ein Interrupt-Flag gesetzt? Dann könnte ich dieses Flag abfragen. Die frage ist natürlich, ob dieses Flag bei PowerOn zurückgesetzt wird.

linux_80
28.01.2006, 22:47
Ich bin jezt nicht aus der PIC-welt,
aber beim AVR gibts ein Register, in dem man nach einem Reset nachschauen kann was der Grund des Resets war (zB. Watchdog, Power on, ext. Reset, Brown out ), und kann evtl. anders in der Init-Routine reagieren.
Evtl. gibts das beim PIC auch (Das Statusregister scheint etwas dazu zu wissen) !?

mabuhay
29.01.2006, 16:50
ja, ich hab was im Statusregister gefunden. Hab jetzt nur noch n kleines Problem mit dem Watchdog. Hab dazu hier (https://www.roboternetz.de/phpBB2/viewtopic.php?t=16520 ein neues Thema gestartet.