Guten Morgen! Ist es beim Atmega8 möglich, die Zeit bis zum Auslösen des Watchdog auf einen Wert einzustellen, der über 8 Sekunden liegt?
Sollte gehen. Die Zeit ist doch direkt abhängig von der Taktfrequenz, also runter damit und du hast deine Zeit.
Stimmt, aber wie verändere ich die Taktfrequenz des internen Watchdog-R/C-Oszillators ohne den Chip auszufräsen?
Wenn man einen 100Hz Quarz nimmt, erreicht man glaub ich 8h WatchdogDelayTime.
Ja, aber der Watchdogtimer wird von einem internen 1MHz-Oszillator versorgt.
@Dirk Hofmann >Wenn man einen 100Hz Quarz nimmt, erreicht man glaub ich 8h >WatchdogDelayTime. Heute schon der 1. April? Dein 100 Hz Quarz ist wahrschienlich dann so gross wie ein Stück Butter. MfG Falk
Falk wrote: > @Dirk Hofmann > >>Wenn man einen 100Hz Quarz nimmt, erreicht man glaub ich 8h >>WatchdogDelayTime. > > Heute schon der 1. April? Dein 100 Hz Quarz ist wahrschienlich dann so > gross wie ein Stück Butter. > > MfG > Falk Und ein Stück Butter bekommt man für 70Cent. Also auch nicht viel teurer als ein Quarz ;-) Außerdem gibt es externe Prescaler ;-)
Darf ich auch mal was fragen? Warum will man Watchdog Zeiten über 8 Sekunden haben? Geht das nicht eigentlich am Sinn eines Watchdogs vorbei?
@Karl-Heinz Buchegger Dirk Hofmann wrote: > Wenn man einen 100Hz Quarz nimmt, erreicht man glaub ich 8h > WatchdogDelayTime. Deswegen diese Bemerkung. Was heisst eigentlich "über 8 sekunden" ?
Was soll denn dann nach > 8 Sekunden passieren? Der Programm-Reset oder was anderes? Meine Interpretation eines Watchdog-Timers ist eigentlich, dass er ein Programm, welches aus irgendeinem Grund hängengeblieben ist, wieder in einen definierten Zustand (Neustart) zurückgesetzt wird.
Ob es sinnvoll ist, einen Watchdog mit über 8s 'Aktivierungszeit' zu betreiben, sei mal dahingestellt, Tatsache ist, daß der Watchdog am internen Taktgeber hängt, dessen Takt prinzipiell fest vorgegeben ist. Mit den verfügbaren Prescsalern sind da nicht mehr als rund 2s drin, steht so auch im Datenblatt. Hätte der WD im Mega8 einen eigenen INT (so wie Mega48/88/168), dann könnte man die Zeit auf 4s bekommen aber so wird's nicht mehr. Daher die Antwort auf die originale Frage: Nein. Tassilo
Tassilo Böhr wrote:
> Daher die Antwort auf die originale Frage: Nein.
Klar geht das.
Du setzt den Watchdog z.B. auf 1s.
Dann einen Timerinterrupt alle 0,5s.
In der zu überwachenden Routine wird nun eine Variable auf 16 gesetzt.
Der Timerinterrupt zählt diese Variable runter und triggert den
Watchdog.
Erreicht die Variable 0, bleibt der Timerinterrupt in einer
Endlosschleife stehen und triggert auch nicht mehr den Watchdog, so daß
dieser nach einer weiteren Sekunde den Reset macht.
Peter
>... >Der Timerinterrupt zählt diese Variable runter und triggert den >Watchdog. >... Da kann man sich ja gleich fast den ganzen Watchdog-Krams sparen. Die Variable im Timer-INT runterzählen und bei 0 den WD ohne Prescaler starten und nirgends zurücksetzen :-) Es ist kein Problem, einen Reset nach 8s zu erzeugen, bloß auschließlich mit dem Watchdog wird das nix... Tassilo
Tassilo Böhr wrote:
> Da kann man sich ja gleich fast den ganzen Watchdog-Krams sparen.
Eben nicht !
Der Timerinterrupt triggert ja nur dann den Watchdog, solange der zu
überwachende Prozeß die Variable spätestens alle 8s auf den Startwert
zurücksetzt.
Im Ergebnis hat man also einen echten 8s Watchdog.
Mit ner 16Bit Variable kannst Du bei 0,5s Timerinterrupt einen 9h
Watchdog realisieren.
Peter
Ich sehe vom Ergebnis her trotzdem keinen Unterschied: Ob ich nun aller 500ms einen aktiven WD zurücksetze solange die entsprechende Variable != 0 ist oder erst bei Variable == 0 einen WD ohne Prescaler überhaupt erst einschalte und nie zurücksetze, führt alles zum gleichen Ergebnis, der Watchdog schlägt zu. Tassilo
Tassilo Böhr wrote: > Ich sehe vom Ergebnis her trotzdem keinen Unterschied: > Ob ich nun aller 500ms einen aktiven WD zurücksetze solange die > entsprechende Variable != 0 ist oder erst bei Variable == 0 einen WD > ohne Prescaler überhaupt erst einschalte und nie zurücksetze, führt > alles zum gleichen Ergebnis, der Watchdog schlägt zu. Der Unterschied ist ein ganz gewaltiger: Wenn der Timerinterrupt abschmiert, schlägt bei mir auch der Watchdog zu, bei Dir schläft er aber ganz gemütlich weiter. Ein schlafender Watchdog ist sein Futter nicht wert. Peter
Das ist wahr. Vor allem, da ich nicht beurteilen kann, wie groß die Wahrscheinlichkeit ist, daß man sich einen Timer-INT zerballert... Da muß aber schon einiges schief gehen, oder? Der Tony schweigt sich allerdings auch aus und sagt uns nicht was er eigentlich machen will. Vielleicht disqualifiziert sich der WD aus ganz anderen Gründen... Tassilo
Vielleicht führt er ja nur kurz ein Programm aus, was in einer Endloswarteschleife endet. Dies soll aller 8s neu gestartet werden ;-).
Hallo, dann laß mal nicht die neuen AVR kommen, die sind so schnell, die schaffen die Endlosschleife in 4s... ;-)) Gruß aus Berlin Michael
Morgen, erst einmal vielen Dank für die informative Diskussion. Hab es leider erst jetzt geschafft alles zu lesen und mich dazu zu äußern. Dabei wohl erst einaml zu Frage von Karl_Heinz. >Warum will man Watchdog Zeiten über 8 Sekunden haben? >Geht das nicht eigentlich am Sinn eines Watchdogs vorbei? Im Prinzip schon, doch das ist anscheinend meine einzige Möglichkeit den Controller per Software nach einer bestimmten Zeit zu resetten. Der Reset wird benötigt um ein Funksystem neu zu starten. Dabei habe ich mehrere Systeme(Slaves), die mit dieser Watchdog Variante ausgestattet werden sollen. Diese Systeme melden sich nach einem Neustart(leider nur nach einem Neustart) beim Master an. Das Problem ist nun, dass auch jeweils nur ein Slave-System angemeldet werden soll/darf/kann. Feste Kennungen sind dabei aber auch nicht möglich, im Prinzip melden sich alle Systeme mit der gleichen Kennung an. Nun soll verhindert werden, dass sich die Systeme gleichzeitig anmelden, da es sonst zum Crash kommt. Die Variante von Peter hört sich sehr gut an, die werd ich mal ausprobieren. Gruß
@Tony >Feste Kennungen sind dabei aber auch nicht möglich, im Prinzip melden >sich alle Systeme mit der gleichen Kennung an. Nun soll verhindert >werden, dass sich die Systeme gleichzeitig anmelden, da es sonst zum >Crash kommt. Und warum glaubst du, dass ein 8s Watchdog Timeout das verhindert? Du brauchst bestenfalls einen Reset, aber der kann problemlos mach 10ms durchegführt werden. Die Logik zur Anmeldung nur eines Slaves muss ins Propgramm gepackt werden. Z.B. mit zufälligen Wartepausen, so ählich wie die Wiederholdung von Übertragungen bei Ethernet. MFG Falk
>Und warum glaubst du, dass ein 8s Watchdog Timeout das verhindert? Im Prinzip verhindert der Watchdog ja nicht das gleichzeitige anmelden, sondern nur ermöglicht einen wiederholten Verbindungsaufbau alle 8 Sekunden. 30 Sekunden wären in diesem Fall optimal. Das funktioniert im Prinzip so: Die Systeme werden der Reihe nach eingeschaltet. Das erste System verbindet sich direkt, vereinbart ein zufällige Kennung und wird gesteuert. Die anderen Systeme können sich nun nicht mehr Verbinden. Sie sollen aber durch den Watchdog alles 30 Sekunden versuchen sich zu verbinden. Nachdem ich das eine System abgemeldet habe, soll die Möglichkeit bestehen, sich mit den nächsten zu verbinden. >Du brauchst bestenfalls einen Reset, aber der kann problemlos mach 10ms >durchegführt werden. Und wie das ohne Watchdog?
@Tony >>Und warum glaubst du, dass ein 8s Watchdog Timeout das verhindert? >Im Prinzip verhindert der Watchdog ja nicht das gleichzeitige anmelden, >sondern nur ermöglicht einen wiederholten Verbindungsaufbau alle 8 >Sekunden. 30 Sekunden wären in diesem Fall optimal. Na dann mach doch einfach ne Warteschleife für 30 Sekunden und lass dann den Watchdog innerhalb von einer x-beliebig kurzen Zeit den Reset ausführen. >Das funktioniert im Prinzip so: Die Systeme werden der Reihe nach >eingeschaltet. Das erste System verbindet sich direkt, vereinbart ein >zufällige Kennung und wird gesteuert. Die anderen Systeme können sich >nun nicht mehr Verbinden. Sie sollen aber durch den Watchdog alles 30 >Sekunden versuchen sich zu verbinden. Nachdem ich das eine System >abgemeldet habe, soll die Möglichkeit bestehen, sich mit den nächsten zu >verbinden. Diese 30 Sekuden können problemlos in Software realisert werden. Der Watchdog macht dann nur noch den Reset, muss aber selber nicht auf 30 Sekunden konfiguriert werden. >>Du brauchst bestenfalls einen Reset, aber der kann problemlos mach 10ms >>durchegführt werden. >Und wie das ohne Watchdog? Mit Watchdog, nur kann der auf eine beliebig kurze Zeit konfiguriert werden. MfG Falk
Tony wrote: > Das funktioniert im Prinzip so: Die Systeme werden der Reihe nach > eingeschaltet. Das erste System verbindet sich direkt, vereinbart ein > zufällige Kennung und wird gesteuert. Die anderen Systeme können sich > nun nicht mehr Verbinden. Sie sollen aber durch den Watchdog alles 30 > Sekunden versuchen sich zu verbinden. Nachdem ich das eine System > abgemeldet habe, soll die Möglichkeit bestehen, sich mit den nächsten zu > verbinden. Naja, sowas macht man aber nicht mit nem Watchdog. Du brauchst nur ne Init-Routine, die per Timer oder Delayloop alle 8s ne Verbindung versucht. Und danach kommt das Hauptprogramm.
1 | main() |
2 | {
|
3 | while( init() == FAILED ){ |
4 | delay( 8s ); |
5 | }
|
6 | for(;;){ |
7 | // mainloop
|
8 | }
|
9 | }
|
Peter
>Naja, sowas macht man aber nicht mit nem Watchdog. >Du brauchst nur ne Init-Routine, die per Timer oder Delayloop alle 8s ne >Verbindung versucht. Geht nicht. Die Verbindung kann nur nach einem Neustart erfolgen. Sobald der Verbindungsaufbau einmal fehlgeschlagen ist, kann keine Verbindung mehr hergestellt werden. Also ein Reset muss sein. Das mit der Zeitschleife ist aber ne gute Idee.
Macht es dem Controller eigentlich was aus, wenn er ständig resettet wird?
Tony wrote: > Macht es dem Controller eigentlich was aus, wenn er ständig resettet > wird? NEIN. Du solltest das jetzt nicht mit Beispielen von mechanischer/elektrischer Abnutzung verwechseln. Wenn Du Dein Auto aller 8 Sekunden neu startest, macht es ihm mit Sicherheit etwas aus. Sontst könnte man sich auch die Frage stellen, ob in einem µC sich das Accu Register schnell abnutzt, weil es mit am häufigsten benutzt wird.
Dirk Hofmann wrote: > Sontst könnte man sich auch die Frage stellen, ob in einem µC sich das > Accu Register schnell abnutzt, weil es mit am häufigsten benutzt wird. Die Frage ist garnicht soo blöd, Ich habe letztens in einem 29 Jahre alten Frequenzzähler 2 Stück 4051 Multiplexer tauschen müssen, weil die es nicht mehr geschafft haben die Leitung bei LOW auf unter 1,8 Volt zu bringen... Wie gesagt, das hat 29 Jahre funktioniert und anscheinen ist da in den Chips irgentwas über die Zeit verändert worden. Rein logisch gesehen Funktionieren die Dinger ja noch, halten sich bloss nicht mehr an die Pegeldefinitionen für CMOS. Grüße Björn
@Björn Wieck >Wie gesagt, das hat 29 Jahre funktioniert und anscheinen ist da in den >Chips irgentwas über die Zeit verändert worden. In der Anfangszeit der Halbleiteri gab es viele Probleme. U.A. mit Gehäuseundichtigkeiten, dadurch wurde der IC durch Feuchtigkeit angegeiffen. Oder Dotierungsprobleme, woduch während des Beriebs die Halbleiterzonen sich gegenseitig verunreinigt haben. LEDs altern uas diesem Grund. Und, und, und. Das sind aber eher Alterungsprobleme, als Abnutzungsprobleme. Aber ein Logikbaustein heutiger Produktion und Technologie sollte bei korrektem Betrieb fast ewig halten. MFG Falk
Ich verstehe gerade nicht, warum die Funkmodule ohne Reset des AVRs keine neue verbindung aufbauen können? Wenn du den AVR resettest initialisierst du das Modul vermutlich neu ... könntest du nicht auch die Initialisierung neu aufrufen?! Kann natürlich sein, dass du recht hast aber mir fällt gerade kein richtiger Grund ein.
Björn Wieck wrote: > Die Frage ist garnicht soo blöd, Ich habe letztens in einem 29 Jahre > alten Frequenzzähler 2 Stück 4051 Multiplexer tauschen müssen, weil die > es nicht mehr geschafft haben die Leitung bei LOW auf unter 1,8 Volt zu > bringen... Wenns ein CD4051 war, die sind bei 5V schon recht hochohmig. Das könnte für Standard-TTL schon so ganz knapp gewesen sein. Und daß ein falsch dimensionierter IC irgendwann aussteigt, ist völlig normal. Bei 5V nimmt man nen 74HCT4051. Peter
Peter Dannegger wrote: > Wenns ein CD4051 war, die sind bei 5V schon recht hochohmig. Das könnte > für Standard-TTL schon so ganz knapp gewesen sein. > > Und daß ein falsch dimensionierter IC irgendwann aussteigt, ist völlig > normal. > > > Bei 5V nimmt man nen 74HCT4051. Ich habe neue CD4051 genommen, mit denen gehts auch, die Pegel sind wieder in Ordnung. Gruß Björn
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.