[ Watchdog Timer ]最近「スイッチ入力で、待ち時間が長い場合リセットをする」プログラムを考えていたのですが、もしかして「Watchdog Timer」が使えるかも知れない。
と、マニアルを読むと結構混乱しました。説明が分かり難く、使わない動作も多く有り説明も多数あります。でもこれって便利そうです。でも使わない機能の説明もかなり多くて、これが逆に分かり難くしています(…これでは頭が混乱しますねー)。
そこで「簡単な実験をしてWatchdog Timerに慣れよう」と思い、次の様に単なるLEDの点滅を考えて見ました。
1] WDTを設定する(1秒で動作)。
2] LEDを点灯させる。
3] 0.5秒後にLED消灯。
4] 初めから見て1秒後にリセット、結果的に1秒ぐらいで点滅している。[ 設定方法 ]Watch dog Timer の設定方法(例はヒューズビットのセット)
動作はメインプログラムに関係なく[ヒューズビットをセットすると]システムリセットに設定される。時間が来ると強制的にリセットされ初期動作になる。
異常動作や時間オーバー設定として使われ、ループから抜け出したい時に使うと便利。(普通はMin16mSからMax8秒迄の設定しか出来ない、それ以上の時間が必要なら更に特別な工夫が必要です)。[ 割り込み動作や特徴 ]
☆ WDTは2つの動作がある。
1] システムリセット
2] 割り込み(他のタイマー割り込みの様な設定)。
☆ WDTは専用のOSCを持つ(128KHz)。
☆ 省エネ動作のスリープなどで止まっても、WDTは動作して再起動などに使える。
☆ ヒューズビットをセットすると、動作はシステムリセット[WDE=1:WDTIE=0]に固定される(全体的に簡単)。
☆ WDE=1:WDTIE=1にすると、初めに割り込み、次にシステムリセットの動作になる。
☆ ノーマルの動作は約16mSでの動作となる(正確では無い、電圧や温度で少し異なる)。
(変更は16mSから2倍々…と8秒まで設定可能)
☆ 動作タイマー変更はWDTCRのWDCE=1にしてWDPnを変更する。[ ヒューズビットの動作 ]
「システムリセット動作」のみ。
☆ スタートのWDE=1とすると動作を開始する。
☆ 時間は16mSを越えるとシステムリセットされる。(normalの状態)
短い場合は、タイマー時間を変更します。[ タイマーの変更方法 ] サンプルを参考に!
☆ 時間の変更はWDCE=1:WDE=1を初め実行する(上に記した)。
☆ 次にWDTCRのWDE=1とWDPnを設定(タイマー時間・4bit)。実験すると!
[ 関連としてMCUSR内のWDRF ]
(Watchdog Reset Flag)Watchdog Resetが起こると[WDRF=1]になり、割り込みやシステムリセットが実行される。
そして「電源オン」又は「このフラッグに[0]を書き込む」とリセットされる。
マニアルでは初期設定で0を書き込むよう勧めている。[ 手順 ]電源は5Vぐらい@とGピン、Cピンは出力で1KΩでLEDで動作の確認をする。
動作させると、点灯の0.5秒間はメイン発振、Watchdog Timert分は消灯の約0.5秒ぐらいになっている。
細かくは調整出来ない。プログラムは[ endless loop ]が入れてありますWDTが動作すると初期設定へ戻る。
/* ATTiny13a WDTimer 2014/11/14 Config FF 4A Used ROM 80bytes 1.2MHz 64mS BO=off */ void main() { // DDRB =0b00010000; WDRF_bit=0; // reset WDTCR = 0b00011000; // WDCE+WDE WDTCR = 0b00001110; // normal 16mS to set 1S PORTB = 0xff; // RB4 ON Delay_ms(500); PORTB=0; // RB4 OFF while(1); // endless loop }
:1000000009C0FECFFDCFFCCFFBCFFACFF9CFF8CFA1 :04001000F7CFF6CF61 :10001400BFE9BDBFB0E0BEBFB0E1B7BBB4B7B77F07 :10002400B4BFB8E1B1BDBEE0B1BDBFEFB8BB24E021 :100034001CE004E30A95F1F71A95E1F72A95D1F744 :0C00440000000000B0E0B8BBFFCFFFCF11 :00000001FF
簡単なので回路図は略す。配線は3本だけでブレッドボード上で動作の確認をしました。
made by M.K
製作 2014/10/31 - 11/14
参考 ソフトWDT・プログラム
Config FF 6A :1.2MHz [このプログラムはヒューズビットでWDTの設定をしない。 ] 001:void main() { 002: // 003: DDRB =0b00010000; 004: PORTB = 0; 005: WDRF_bit=0; // reset 006: WDTCR = 0b00011000; // WDCE+WDE 007: WDTCR = 0b00001101; // normal 16mS to set 0.5S 008: for(i=0;i<5;i++){ // ON-OFF *5 009: PORTB = 0xff; 010: Delay_ms(200); 011: PORTB = 0; 012: Delay_ms(200); 013: asm WDR; // WDTimer reset 014: } 015:// 016: WDTCR |= 0b00011000; // WDT stop 017: WDE_bit = 0; 018: PORTB = 0xff; // LED-ON 019: Delay_ms(1000); 020: PORTB = 0; 021: WDTCR |= 0b00011000; // WDT start 022: WDTCR = 0b00001110; // 1Sec 023:// 024: while(1); // endless loop 025:}005/007 はWDTの設定。初期設定で0.5Secの動作。
008-014 はループ動作でLEDの点滅に使用、5回、1回毎にWDT動作の(013)プリスケラーをリセットしている(システムリセットではない)。
(コンパイラーのコマンドがあるのかも知れないが、不明の為アセンブラーで実行)
016/017 はWDTの停止
018-020 はLED-ONと1秒待ち、LED-OFF
021-022 はWDTの再開、時間設定を1秒に変更、動作させる。 024 無限ループWDTが途中で(1秒)動作してシステムリセットされ(スタートへ)戻る。
1秒点灯・1秒後に消える動作をしている。そして初めの点滅へ戻る。2014年11月15日
[MAIN MENU へ戻る]