ATTiny13a 16 : Watchdog Timerの動作


[ 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 へ戻る]

inserted by FC2 system