ATXmeega128A3U, Verständnis WDT

OP #6875185
Lesenswert?
• ▲
▼
Hallo,

ich habe eine HArdware mit einem ATXmega128A3U. Nun möchte ich den 
watchdog timer verwenden und bekomme es nicht auf die Reihe, ob wohl es 
ja mit der wdt.h ganz leich sein sollte.

Erste Frage: obwohl das Manuaul des Controllers bis zu 8s WDT-Periode 
beschreibt und mir die Intellisense WDTO_8S und WDTO_4S anbietet, kann 
ich diese nicht verwenden (undeclared).

Folgendes Minimalbeispiel löst mir den WDT nach Loslassen der Taste 
sofort aus und nicht nach 2s:

ich habe auch gerade mal geschaut: WDTO_2S ist als 7 definiert, aber im 
Manual steht 1000b
1
wdt_enable(WDTO_2S);
2
while(GET_BUTTON == BUTTON_PRESSED)
3
{
4
  wdt_reset();  
5
}
6
_delay_ms(5000);

Zweite Frage: Nun wollte ich zu Testzwecken den WDT von Hand 
programmieren.
Ein- und Aussschalten per Registereintrag konnte ich finden, aber wie 
resette ich den WDT? Das stand nirgendwo.

Danke und Grüße,

Alex
#6875218
Lesenswert?
• ▲
▼
while(GET_BUTTON == BUTTON_PRESSED)
{
  wdt_reset();
}

Während du die Taste gedrückt hast geht er ja nicht mehr aus deiner 
While raus. Was wird denn bei wdt_reset(); aufgerufen?

Sicher, dass du den Watchdog Timer verstanden hast?
Theoretisch solltest du ihn in deinem Programm aktivieren und dann immer 
wieder zurücksetzen bevor er auslöst.
#6875228
Lesenswert?
• ▲
▼
Das setzen ist weiterhin geschützt durch "Configuration Change 
Protection".
Beim schreiben vom Timeout Wert muss das WDT.CTRL CEN-Bit mit 
geschrieben werden (gleichzeitig).

Dann das Enable.

Dieser vorgang muss jedes mal vor Ablauf der Zeit passieren.
- Wert setzen
- Enable

Bei anderen µC reicht ein "reset" oder sowas...bei diesem hier wird das 
WDT.CTRL (PER) Register wohl auch zum runterzählen genutzt, weshalb es 
immer neu gesetzt werden muss.

Edit:
Evtl. sind deine wdt Dateien älter? Nicht auf dem neuesten Stand, 
beinhalten Fehler... Anscheinend funktionieren diese anders?!
OP #6875252
Lesenswert?
• ▲
▼
Hallo,

danke für eure Antworten. Ich habe mal noch folgendes probiert und von 
Hand das Control-Register beschrieben. Reset dann per Lib-Befehl und das 
macht, was es soll, Reset 2s nachdem ich die Taste loslasse:
1
CCP = CCP_IOREG_gc;
2
WDT.CTRL = 0x23;
3
  
4
while(GET_BUTTON == BUTTON_PRESSED)
5
{
6
  wdt_reset();  
7
}
8
_delay_ms(5000);

Thomas R. schrieb:
> Während du die Taste gedrückt hast geht er ja nicht mehr aus deiner
> While raus. Was wird denn bei wdt_reset(); aufgerufen?
>
> Sicher, dass du den Watchdog Timer verstanden hast?
> Theoretisch solltest du ihn in deinem Programm aktivieren und dann immer
> wieder zurücksetzen bevor er auslöst.

Das ist nur der Test gewesen, ob überhaupt was passiert. Reset WDT 
während die Taste gedrückt ist, danach Geräte reset.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.