Kanade Labo

かなで研究所

Arduinoのウォッチドッグタイマーがうまく動かない?

嵌ったけど、調べてもよくわからない挙動。

同じ境遇の人がきっといるんじゃないかと超簡単記事にしておきます。

何が起きたか?

WDT満了により、リセットが発動するが、リセットが繰り返している?

電源抜き差しによる再起動を行うと、復旧する。リセットボタンよるリセットは効果なし。

結論

wdt_enable(WDTO_8S); の記述より前に18msec以上のディレイが入っているとこうなる。

状況説明

正しくウォッチドッグタイマーが発動するパターン(約8秒後にリセットがかかり、loop内の処理に移る)

#include <avr/wdt.h>                    // ウォッチドッグタイマー ライブラリ
void setup() {
  // put your setup code here, to run once:
  delay(17);
  wdt_enable(WDTO_8S);
  pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}

うまくいかないパターン(約8秒後にリセットがかかるが、リセットが連続しているような挙動になる)

#include <avr/wdt.h>                    // ウォッチドッグタイマー ライブラリ
void setup() {
  // put your setup code here, to run once:
  delay(18);
  wdt_enable(WDTO_8S);
  pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}

ちなみに、このパターンになると、watchdog timer満了に限らず、Arduinoのリセットボタン押下でも同様の事象が発生する。

つまり、起動5秒後にリセットボタン押下をすると、そこからリセットループになる。

推察

なんででしょう?誰か教えてください!

結論(再

wdt_enable を使いたいならvoid setup()の直後に書くのが無難?

もちろん途中に書いてるサイトも当たり前のようにたくさんあるので、動かなかった時の切り分けとして試してみるのはありかなと思います。

以上。かなで でした!

-Arduino/ATMega328P