ウォッチドッグタイマーとは何ですか?
コンポーネントと消耗品
> |
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
マイクロコントローラーが無限ループで混乱しているときの状況😖。タスクの実行中にマイクロコントローラーがハングしたりスタックしたりするようなケースはありますか😖。通常のトラブルシューティング方法は何ですか? リセットボタン、右 ?ボタンを常に押すことは実際に可能ですか?😕。では、このタスクを実行するデバイスはどうですか?いいですね。かっこいい...!🙂。
はい !今、私たちはすでにマイクロコントローラーの中にあるそのようなデバイスについて議論しています。それが ウォッチドッグタイマーです。
ウォッチドッグタイマー。
"ウォッチドッグタイマー( WDT )は、メインプログラムが定期的なサービスを怠った場合に、システムリセットを自動的に生成するハードウェアタイマーです。多くの場合、ソフトウェアまたはハードウェアの障害が原因でハングした組み込みデバイスを自動的にリセットするために使用されます。 "(os.mbed.com/cookbook/WatchDog-Timer)。
犬に餌をやる!
家に犬がいる場合。あなたは定期的にその犬に餌をやる必要があります。あなたが一日を養うことができないならば、それはあなたを噛むでしょう!このウォッチドッグタイマーのように機能します。
<図>プログラムには、何度も実行される主要な部分があります( loop )。メインプログラムの合計遅延よりも大きい初期値でウォッチドッグタイマーがロードされるようにしています。メインプログラムがこのタイマーをリセットするたびに。いずれの場合も、メインプログラムがゼロにカウントダウンする前にタイマーをリセットするために戻らない場合は、プロセッサをリセットするための割り込みが生成されます。同様に、ウォッチドッグタイマーはマイクロコントローラーをハングケースから保護します。
それでは、 Arduinoでウォッチドッグタイマーを試してみましょう;)
ArduinoではUNOは ATMEGA328P を使用します マイクロコントローラー。
<図>ウォッチドッグタイマーライブラリ
#include
Arduinoでウォッチドッグタイマーを使用するにはライブラリが必要です
ウォッチドッグタイマーを有効にする:
wdt_enable(WDT Reset Timer);
ウォッチドッグタイマーを有効にするには、 WDT RESET TIMER 15msから8sまで変化します
<図>
例: wdt_enable(WDT0_8S);
-8秒間ウォッチドッグタイマーを有効にしました
ウォッチドッグタイマーをリセットする
wdt_reset();
この機能は、ウォッチドッグタイマーをリセットするために使用されます。リセット関数は loop()内で使用します 。プログラムでより大きな delay()を使用する場合 ウォッチドッグタイマーのしきい値遅延よりも大きい場合は、その遅延の前にもリセット機能を追加します。それ以外の場合は、そのタスクを完了する前にマイクロコントローラーをリセットします。
ウォッチドッグタイマーの無効化
wdt_disable();
サンプルコード:
#include
void setup(){
Serial.begin(9600);
Serial.println( "セットアップ開始:");
// WDTを有効にする前に遅延を作成します
//この遅延は、すべての初期タスクを完了するのに役立ちます
delay(2000);
wdt_enable(WDTO_4S);
}
void loop(){
Serial.println( "LOOP start!");
for(int i =0; i <=5; i ++){
Serial.print( "ループ:");
Serial.print(i);
Serial.println();
delay(1000);
wdt_reset();
}
// MCUをハングアップするための無限ループ
while(1){}
}
出力 <図>
コメントセクションでフィードバック、質問、ディスカッションを撮影してください。
コード
- 完全なコード
フルコード Arduino
#includevoid setup(){Serial.begin(9600); Serial.println( "セットアップが開始されました:"); // WDTを有効にする前に遅延を作成します//この遅延は、すべての初期タスクを完了するのに役立ちますdelay(2000); wdt_enable(WDTO_4S);} void loop(){Serial.println( "LOOPが開始されました!"); for(int i =0; i <=5; i ++){Serial.print( "Loop:"); Serial.print(i); Serial.println(); delay(1000); wdt_reset(); } // MCUをハングさせる無限ループwhile(1){}}
製造プロセス