-1

私はATMEGA12816ACを使用しています。だから私はウォッチドッグタイマーを使って少なくとも10秒後にAVRをリセットしたい。たとえば、キーパッドキーが10秒以内に押されない場合、コントローラーは再起動する必要があります。

wdt_enable(value);のようなライブラリ関数を試し、WDTCR regも構成してみましたが、10秒の遅延を取得できませんでした。

この問題で私を助けてください。

前もって感謝します。

4

2 に答える 2

1

ウォッチドッグタイマーは、(データシートからの)2つのことに依存しています。

  • ウォッチドッグRC発振器の動作モード(41ページの表13)。これを可能な限り低い値、つまり1MHz(デフォルト値)に設定します。
  • ウォッチドッグプリスケーラ(56ページの表22)。これを可能な限り高い値である2,048Kに設定し、最大タイムアウトを1.8秒にします(Vccが5Vの場合)。

したがって、WDTを1.8秒より長く使用することはできません。

実行できることは、16ビットタイマーの1つ(プリスケーラーもあります。表62、136ページ)を使用して割り込みを生成します。この割り込みは、作成する必要のある割り込みルーチンを呼び出します。割り込みルーチンが行うべきことは、宣言で起動時に設定されるグローバル変数を減らし、この変数が0に達すると、アドレス0(リセット後にAVRが実行を開始するのと同じアドレス)にジャンプします。これらの値を簡単に計算できます。

キーが押された場合は、タイマーとグローバル変数をリセットします。これらすべての割り込みルーチンが変数を変更するので、それを宣言する必要がありますvolatile

私はPIC16シリーズの経験が豊富ですが、これがAVRで機能すると確信しています。

于 2013-02-02T13:54:25.420 に答える
1

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で何でも実行できるようになります。

これが他の人に役立つことを願っています。

于 2013-04-19T06:59:59.337 に答える