AVRウォッチドッグタイマを読む

AVRウォッチドッグタイマー。コード内からウォッチドッグタイマーを読み取る方法はありますか?

使用目的例:ウォッチドッグタイマーが最後にリセットされてから経過した時間の概算(非常に大まかな、+/ - 1秒)を得るこれにより、私のコードでは、外部RTCなどを使用せずに、スリープ状態になった時間を推測できます。

私はattiny85データシートを調べてみましたが、見つかりませんでした。アイデアの人?

1
nl ru de
おそらくこれが欲しいでしょう。/a>
追加された 著者 Carlos.V,

4 答え

ウォッチドッグを1秒に設定してから割り込みモードに設定します。割り込みが発生した場合はウォッチドッグが再びリセットモードに設定されます。その後、コードを手動で割り込みモードに設定する必要があります。割り込みの実行後、タイマーの期限が切れる前にウォッチドッグを割り込みモードに設定するための1秒のウィンドウがある場合は、セカンドタイマーとウォッチドッグが機能的に機能します。 私はattiny10でこのようにウォッチドッグを使っています

4
追加された
これは最も簡単な解決策です。 1回の睡眠でウォッチドッグを使って測定できる最長の時間はとにかく8秒なので、これはせいぜい8回もっと頻繁に起きることを意味します。各ウェイクで実行されるコードを非常に高速にすることができます。単にレジスタの秒カウンタをインクリメントし、WDIEを設定してスリープさせるだけです。このコードを直接ベクトルテーブルに入れてジャンプを節約することもできます(USIベクトルが必要ないと仮定した場合)。
追加された 著者 chews,
これは私が思うにここで最高の答えです。ベクトルテーブルのトリックも賢いショーボートになるでしょう:)
追加された 著者 putolaruan,

私がデータシートで理解していることから、WDTリセットは分割された128kHzクロックのセットからのANDされた信号であり、WDTプリスケーラを通ります。

これが私なら私はWDTがあるたびにリセットされる私自身のタイマーを使うでしょう。その後、これをポーリングして、最後のリセット以降に経過した時間を見積もることができます。これはハードウェアに依存せず、移植性が高いです。

1
追加された
128kHzのRCクロックで動作する可能な限り低い電力構成でも、アイドルモードでは50〜100μAのオーダーで使用されます。ウォッチ ドッグ許可でのパワー ダウン動作は3-9μAのオーダーでだけ使用するので、パワー ダウンでのウォッチ ドッグはアイドルでの通常のタイマよりはるかに電力効率が良いです。
追加された 著者 chews,
スリープモードでもタイマーはスリープしませんか?または、タイマーはCPUクロックにバインドされていませんか?
追加された 著者 Dmitris,
アイドル動作で休止すると、Timer1は走行を続け、必要ならAVRを起こすのに使用することができます。または他の割り込みがAVRを起こすとポーリングすることができます。データシートのセクション7.1.1を参照してください。
追加された 著者 putolaruan,
それは事実かもしれませんが、それはあなたが尋ねた質問ではありません。
追加された 著者 putolaruan,

Note that I am not advocating this solution - only showing that I think it is possible. I think that Kvegaoro's answer is more practical and even likely to use less power for almost all real-life use cases.

こんなことができると思いますが…

  1. Set up watchdog interrupt only mode.
  2. Set up the prescaller to the maximum 8s delay.
  3. Start the Watchdog.
  4. Sleep.
  5. Wake due to some external INT other than the Watchdog.
  6. Stop the Watchdog immediately upon waking.
  7. In a loop, step though the prescaller values from highest to lowest.

    d. clear the Watchdog interrupt flag

    a. set the prescaler to the loop value.

    b. check to see if the Watchdog interrupt flag has become set.

    c. shift the bit from the previous test into a shift register.

これらすべての最後に、シフトレジスタはプリスケーラカウンタ内の値の上位ビットを持っているはずです。

これ、私の推測ではあります。たとえそうでなくても、このメソッドはまだ機能することができます、あなたはそれが呼び出されたことを示すフラグをどこかに設定するウォッチドッグ割り込みハンドラを作成する必要があります。次に、プリスケーラが更新されるたびにこのフラグをチェックして、割り込みが発生したかどうかを確認します。

あなたがこれが実際に意味をなさない稀なユースケースの1つを持っていると私に納得させることができるならば、私は詳細を打ち出すためにいくつかのコードをスピンアップします!

0
追加された
これで私の問題は解決するでしょう。それはひどいアイデアです、そして私がKvegaoroの解決策に対して見ることができる利点はありません。しかし、それは本当に私の質問に答え、そしてすばらしい解決策です。私はまたこれが実行されるのを見るのは楽しいことだろうと思います。しかしそれを正当化することはできません!
追加された 著者 Dmitris,

マイクロコントローラが無限ループに入った場合、ウォッチドッグタイマを使用してマイクロコントローラをリセットします。あなたは好ましい時間でWDTを有効にするか、それを無効にすることができます。 ウォッチドッグタイマーの値を読み取ることはできません

溢れた時にAVRを休止形態から起こすのに通常のタイマ/カウンタを使用することができます。

0
追加された