質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

4回答

1005閲覧

Arduino pro miniのウォッチドッグタイマーについて

rr0044is

総合スコア6

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/08/29 12:20

Arduino pro miniでウォッチドッグタイマーを使用したいです.
何秒間のタイマーでもいいので,例えばある値が20未満の時にArduinoをリセットさせ,それ以外の場合はそのまま通信を続けるようにしたいです.
そのようなソ使い方のソースコードのサンプルがなく路頭に迷っています.
#include <avr/wdt.h>
void software_reset() {
wdt_disable();
wdt_enable(WDTO_15MS);
while (1) {}
}

これらはなんとなくわかるのですがどのように応用していけばいいのかわかりません.
どなたかご教授お願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

まず根本的な話ですが、ウォッチドッグタイマは異常時にリセットするためのものですので、ウォッチドッグタイマを発動させておいてリセットはしないというのは、一般的な使い方ではありません。
「ある値が20未満の時リセット」のような動作は異常ではないので、ウォッチドッグタイマでない普通のタイマで割り込みすることで行うべきではないかと思います。
(もっともATmega328Pにソフトウェアリセット命令は無いようですが。)

ただ、ATmega328Pのデータシートを見るとウォッチドッグタイマの発動時に(リセットするのでなく)割り込みを掛ける機能はあるようです。
Watchdog Interrupt Flagあたりを見ると良いです。Arduinoから使う方法は知りません。
つまり、ウォッチドッグタイマでリセットしない設定にしておいて、割り込み内である値を見て、20未満ならリセットさせるという形です。
なおウォッチドッグタイマでリセットさせない設定は危険ですから、自動でリセットするようになる仕組みになっているようです。それを回避し毎回リセットさせないよう設定し直す必要があります。

投稿2018/09/01 11:21

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

通常は

while (1) { hoge(); fuga(); piyo(); wdt_reset(); }

のようにループ内で毎回wdt_reset()を実行します。
このときに、例えばhuga()の処理が15ms以上かかるなどするとArduinoのリセットがかかります。

if(ある値が20以上){ wdt_reset(); }

とすれば、
ある値が20未満の時はウォッチドッグタイマをリセットしないので、
Arduinoのリセットがかかります。

投稿2018/08/31 04:16

編集2018/08/31 04:18
hillacken

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rr0044is

2018/08/31 05:55

ありがとうございます. そのような感じでコードを作りましたが一回arduinoがリセットされるとリセットが永遠に繰り返されてしまいます.どうすればよいでしょうか?
hillacken

2018/08/31 06:04

ある値が20未満のままなのではないでしょうか?
rr0044is

2018/08/31 06:07

おそらく最速の15msでリセットを繰り返してしまい20以上になっているはずなのにリセットの無限ループに陥ってしまいます.
hillacken

2018/08/31 06:20

WDTO_500MSにしたらいかがでしょうか?
rr0044is

2018/08/31 06:24

初期設定では2Sなのですが,一度システムリセットがかかると15msでリセットが繰り返されえるみたいです.起動時にwdtをoffにする必要があるのですがあまりうまくいきません
hillacken

2018/08/31 06:27

それは別の質問ですね。
guest

0

まずは通常の割り込みと多くのCPUでのウォッチドックタイマーとの存在意義と意味を勉強する事から。単にウォッチドックの実例をググるだけでは本質を見誤ります。
他の回答者様のヘッダーでググるだけでは本質に近づくにはパワーが必要かと。
まず一般的な本質で、’システムが正常に動作しているか?’を確認するすべとして。
リセットするのが本質ではありません。
どちらかと言えば正常検査、特にアナライザーとしての局面があります。
正常動作の条件(正常動作している時とそれ以外の明確な判定)と定期的(ここが定周期の割り込みにつながります)に検査する事。
ますは貴殿のシステムでの正常動作時の条件と、それが確立する周期的な時間の把握が必要かと。

まあ多くのシステムでは、’どう動いてるか不明だからリセットしてやれ’と変な解釈されての例が。

投稿2018/08/29 14:40

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「wdt.h」でぐぐるといろいろ引っかかるようですが、それではダメでしょうか

投稿2018/08/29 14:13

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問