mikrocontroller.net

Forum: Compiler & IDEs Watchdog - first use


Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
void main (void)
{
[...]
wdt_enable(WDTO_500MS);
 [...]
for(;;)  // Programmschleife
{
  wdt_reset();   //WDT rücksetzen
 [...]
}//Ende Programmschleife
}//Ende main

Habe ich was vergessen?
Muss ich irgendwelche Interrupts aktivieren?

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
wdt_enable();

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.