Forum: Compiler & IDEs Watchdog - first use


von M.B. (Gast)


Lesenswert?

Ich benutze den ATmega88 und das AVR Studio.

Ich habe mein Programm geschrieben, das auch funktioniert.

Aus Sicherheitsgründen wollte ich nun den Watchdog-timer einsetzen, das 
mache ich nun zum ersten mal. Habe mir auch hier im Forum den Artikel 
und einige Beiträge hierzu durchgelesen. Leider bekomme ich es nicht 
hin.

Sobald ich die Fuse WDTON enable (Häkchen in den fuses) reagiert mein 
Programm gar nicht mehr.Im Code habe ich folgendes geschrieben:

Fuses:
WDTON - Häkchen (enabled)
1
void main (void)
2
{
3
[...]
4
wdt_enable(WDTO_500MS);
5
 [...]
6
for(;;)  // Programmschleife
7
{
8
  wdt_reset();   //WDT rücksetzen
9
 [...]
10
}//Ende Programmschleife
11
}//Ende main

Habe ich was vergessen?
Muss ich irgendwelche Interrupts aktivieren?

von Hmm... (Gast)


Lesenswert?

> Habe ich was vergessen?

Kann man ohne den restlichen Code schlecht sagen.

> Muss ich irgendwelche Interrupts aktivieren?

Nö. Der Watchdog läuft unabhängig vom Hauptprogramm und diversen 
Interrupts.


Du kannst ja mal testweise den Watchdog wieder deaktivieren und jeden 
"wdt_reset();" durch ein Pin-Togglen eines beliebigen noch freien 
Portpins ersetzen. Dann kannst du mit dem Oszi gucken, ob deine 
Anwendung eventuell manchmal länger als die anvisierten 500ms für einen 
Hauptschleifendurchlauf braucht.

von M.B. (Gast)


Lesenswert?

Hmm... wrote:

>Du kannst ja mal testweise den Watchdog wieder deaktivieren und jeden
>"wdt_reset();" durch ein Pin-Togglen eines beliebigen noch freien
>Portpins ersetzen. Dann kannst du mit dem Oszi gucken, ob deine
>Anwendung eventuell manchmal länger als die anvisierten 500ms für einen
>Hauptschleifendurchlauf braucht.

Das ist ein guter Tipp. Das könnte ich mal ausprobieren...

von M.B. (Gast)


Lesenswert?

Meine Routine benötigt ca 64ms für einen Durchlauf.

Sobald ich die fuse WDTON "abhake" läuft mein Prog nicht mehr.

Woran sehe ich, ob der WDT läuft?

Muss ich in den Fuses WDTON enablen?

Ich benutze ja
1
wdt_enable();

von Hmm... (Gast)


Lesenswert?

> Meine Routine benötigt ca 64ms für einen Durchlauf.

Die Zeit für einen speziellen Durchlauf ist irrelevant. Interessant sind 
nur die maximalen Zeiten. Die 10.000 Durchläufe <64ms bemerkst du nicht, 
den ersten der 600ms braucht aber bestimmt. ;)

> Sobald ich die fuse WDTON "abhake" läuft mein Prog nicht mehr.

Ähm, abhake? Du meinst, sobald du den Watchdog per Fuse aktivierst, 
oder?

> Woran sehe ich, ob der WDT läuft?

Am Reset wenn du den Wdt nicht bedienst ;) Im Ernst, der Watchdog läuft, 
sobald die entsprechende Fuse gesetzt ist. Ausserdem kann er per SW 
aktiviert werden und ist dann (ohne Reset) nicht mehr zu stoppen.

> Muss ich in den Fuses WDTON enablen?

Benutzt du Ponyprog? Je nach Brennprogramm kann die Logik invertiert zum 
Datenblatt sein.

> Ich benutze ja
>
> wdt_enable();

Damit schaltest du den Watchdog unabhängig von der Fuse ein.

von M.B. (Gast)


Lesenswert?

Zum Verständnis:

Wenn ich im Programm wdt_enable() einsetze - dann brauche ich nicht mehr 
die Fuse setzen?

WDTON - "Hardware enable"?
wdt_enable() - "Software-enable"?

Ich habe gerade ein wdt_reset() direkt nach void main (void), und nicht 
erst am Beginn der Hauptschleife (da habe ich es aber nach wie vor 
weiter belassen), gesetzt und da lief es plötzlich!

von Hmm... (Gast)


Lesenswert?

> Zum Verständnis:
>
> Wenn ich im Programm wdt_enable() einsetze - dann brauche ich nicht mehr
> die Fuse setzen?

Dann ist deine Initialisierungsroutine eben nicht mehr 
Watchdog-gesichert. Ist ein Initialisierungscode nicht sauber 
programmiert, führt hier eine nicht behandelte Situation u.U. zum 
vollständigen Aufhängen der Anwendung. Mit WDT-FUSE würde hier ein Reset 
einen neuen Versuch erzwingen.

> WDTON - "Hardware enable"?
> wdt_enable() - "Software-enable"?

Schau doch mal ins Datenblatt zum Controller. Da stehts ausführlich.

> Ich habe gerade ein wdt_reset() direkt nach void main (void), und nicht
> erst am Beginn der Hauptschleife (da habe ich es aber nach wie vor
> weiter belassen), gesetzt und da lief es plötzlich!

Laut Datenblatt ist das Watchdog-Kontrollregister mit

WDP = 0000

vorinitialisiert. Das entspricht 16ms. Wenn du in dieser Zeit nicht bis 
zur Main-Schleife gekommen bist, schlägt der Watchdog zu.

von Gast (Gast)


Lesenswert?

Fuse WDTON gesetzt --> Watchdog von Anbeginn des Programms 
eingeschaltet;
                       nicht per Software abschaltbar ("fail safe mode")

Fuse WDTON nicht gesetzt --> Watchdog per Software ein- und ausschaltbar
                             (einschalten einfach, ausschalten nur mit
                             spezieller Befehlssequenz)

Siehe Datenblatt.

von M.B. (Gast)


Lesenswert?

Vielen Dank allen, die mir geholfen und mir Tipps gegeben haben.

>> Ich habe gerade ein wdt_reset() direkt nach void main (void), und nicht
>> erst am Beginn der Hauptschleife (da habe ich es aber nach wie vor
>> weiter belassen), gesetzt und da lief es plötzlich!

>Laut Datenblatt ist das Watchdog-Kontrollregister mit
>WDP = 0000
>vorinitialisiert. Das entspricht 16ms. Wenn du in dieser Zeit nicht bis
>zur Main-Schleife gekommen bist, schlägt der Watchdog zu.

Da wird das Problem gewesen sein.

Ich hatte nämlich die Fuse gesetzt und geglaubt damit den Watchdog 
allgemein einzuschalten bzw vorzubereiten. und dann mit wdt_enable() den 
Watchdog zu starten

>Fuse WDTON gesetzt --> Watchdog von Anbeginn des Programms
>eingeschaltet;
>                       nicht per Software abschaltbar ("fail safe mode")
>
>Fuse WDTON nicht gesetzt --> Watchdog per Software ein- und ausschaltbar
>                             (einschalten einfach, ausschalten nur mit
>                             spezieller Befehlssequenz)

Vielen Dank auch für diese Information und kurze Zusammenfassung.

--> Das sind so die Fallstricke, über die man beim ersten Einsatz 
stolpert.

Mein Programm läuft jetzt, dank eurer Hilfe!

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.