私はATMEGA12816ACを使用しています。だから私はウォッチドッグタイマーを使って少なくとも10秒後にAVRをリセットしたい。たとえば、キーパッドキーが10秒以内に押されない場合、コントローラーは再起動する必要があります。
wdt_enable(value);のようなライブラリ関数を試し、WDTCR regも構成してみましたが、10秒の遅延を取得できませんでした。
この問題で私を助けてください。
前もって感謝します。
ウォッチドッグタイマーは、(データシートからの)2つのことに依存しています。
したがって、WDTを1.8秒より長く使用することはできません。
実行できることは、16ビットタイマーの1つ(プリスケーラーもあります。表62、136ページ)を使用して割り込みを生成します。この割り込みは、作成する必要のある割り込みルーチンを呼び出します。割り込みルーチンが行うべきことは、宣言で起動時に設定されるグローバル変数を減らし、この変数が0に達すると、アドレス0(リセット後にAVRが実行を開始するのと同じアドレス)にジャンプします。これらの値を簡単に計算できます。
キーが押された場合は、タイマーとグローバル変数をリセットします。これらすべての割り込みルーチンが変数を変更するので、それを宣言する必要がありますvolatile
。
私はPIC16シリーズの経験が豊富ですが、これがAVRで機能すると確信しています。
ATmega 128では、16ビットタイマーを使用して以下のように設定します。
// Enable overflow interrupt.
TIMSK |= (1 << TOIE1);
// Enable global interrupts.
sei();
// Start timer at Fcpu/1024. Approx 3.33sec for each cycle.(F_CPU = 16MHz External)
TCCR1B |= (1 << CS12) | (1 << CS10);
したがって、このようにタイマーを構成すると、タイマーは3.33秒ごとにオーバーフローし、このオーバーフローの倍数を次のように定義できます。
#define INPUT_KEY_TIMEOUT 10
タイマーISRのステータスを次のように確認する必要があります。
if(system_timer_count == INPUT_KEY_TIMEOUT) {
//Do something if the following condition met.
}
これにより、コントローラーの通常の作業を妨げることなく、任意の時間遅延を作成できます。上記の条件が満たされた場合にのみ、コントローラーはISRで何でも実行できるようになります。
これが他の人に役立つことを願っています。