このコードでは、resetMCU()
関数が定義されており、これを呼び出すことでリセットがトリガーされます。resetMCU()
関数では、まず割り込みを無効にし、次にウォッチドッグタイマーを有効にして15ミリ秒のタイムアウトを設定します。その後、無限ループに入ることで、ウォッチドッグタイマーによるリセットを待機します。
この方法を使用すると、reset()
関数を呼び出すのと同様の効果を得ることができますが、直接的なレジスタ操作が必要です。
wdt_enabletとは...
wdt_enable()
関数は、AVRマイクロコントローラーのウォッチドッグタイマー(Watchdog Timer)を有効にするための関数です。ウォッチドッグタイマーは、マイクロコントローラーが予期せずフリーズしたり、異常動作したりした場合に、マイクロコントローラーを自動的にリセットするための機能です。
wdt_enable()
関数は、次のように定義されています。
void wdt_enable(int timeout);
この関数は、引数としてタイムアウト値を受け取ります。タイムアウト値は、ウォッチドッグタイマーがカウントする時間を決定します。一般的なタイムアウト値には、WDTO_15MS、WDTO_30MS、WDTO_60MSなどがあります。これらはそれぞれ15ミリ秒、30ミリ秒、60ミリ秒のタイムアウトを表します。
ウォッチドッグタイマーは、プログラムのメインループで定期的にリセットされない限り、タイムアウト値が経過するとリセットがトリガーされます。そのため、wdt_enable()
関数を呼び出すと、指定されたタイムアウト値でウォッチドッグタイマーが動作し、指定された時間が経過するとマイクロコントローラーがリセットされます。
以下は、wdt_enable()
関数の使用例です
#include <avr/wdt.h>
void setup() {
// ウォッチドッグタイマーを有効にし、15ミリ秒のタイムアウトを設定する
wdt_enable(WDTO_15MS);
}
void loop() {
// 何らかの処理
}
この例では、setup()
関数内でウォッチドッグタイマーを有効にし、15ミリ秒のタイムアウトを設定しています。その後、loop()
関数内で通常のプログラム処理が継続されますが、ウォッチドッグタイマーは常に動作しており、15ミリ秒ごとにリセットがトリガーされます。
コメント