Forum: Mikrocontroller und Digitale Elektronik ATXmeega128A3U, Verständnis WDT


von Alexander H. (ill_son)


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

: Bearbeitet durch User
von Thomas R. (r3tr0)


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.

von Adam P. (adamap)


Lesenswert?

Alexander H. schrieb:
> ich habe auch gerade mal geschaut: WDTO_2S ist als 7 definiert, aber im
> Manual steht 1000b

Ich habe mal das WDT Example ausm ASF geöffnet:
Da ist es als 8 definiert
1
//! Timeout period = 2K cycles or 2s @ 3.3V
2
WDT_TIMEOUT_PERIOD_2KCLK = (0x08),

Kannst es dir ja auch mal anschauen und mal die wdt.h & wdt.c Dateien 
mit deinen vergleichen.

von Adam P. (adamap)


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?!

: Bearbeitet durch User
von Alexander H. (ill_son)


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.

: Bearbeitet durch User
von Alexander H. (ill_son)


Lesenswert?

https://www.avrfreaks.net/forum/watchdog-trouble-0

Das passt zu meinem Problem, obwohl der Thread schon alt ist.

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.