MSP430班(2006/05/01) ウォッチドッグタイマ1

もはや、ほとんど覚えていませんが再開です。ウォッチドッグタイマをインターバルタイマとして使ってみようとしています。


アムスク社のMSP430F1232評価ボードのサンプルプログラムでは、ウォッチドッグタイマをインターバルタイマとして使ってLEDを点滅させています。これは割込みを使っているので、その前に割込みを使わないバージョンを試してみようとしました。

サンプルプログラムをベースに、割込み要求を出さないように変更し、インターバルに到達したときWDTIFGフラグが立つので、それを見てLEDを点滅するようにしました。

#include  <msp430x12x2.h>

void main(void)
{
    WDTCTL = WDT_ADLY_1000; // WDTのクロック・ソースをACLK、
                          // 1sのインターバルタイマに設定
    P1DIR |= 0x0C;          // ポート(P1.2,P1.3)を出力に設定
    P1OUT = 0;              // ポート初期化

    for (;;) {
        // WDTIFGフラグ待ち
        if ((*((volatile unsigned char *)IFG1)) & WDTIFG != 0) {
            P1OUT ^= 0x0C; // LED点滅
            asm("BIC.B #00000001b, IFG1"); // WDTIFGフラグクリア
        }
    }
}

が、うまくいきません。LEDは点灯するので、最初の1回だけはインターバルまで到達しているのですが、点滅しないので、どうやらインターバルタイマのカウンタがクリアされていないようです。

いろいろやってみましたが、うまくいかないので、次のように割込みを使う方法に変更。これは問題なく動作します。割込みハンドラが呼ばれるタイミングで、内部で何かしているんでしょうね。

#include  <msp430x12x2.h>

int xxx = 0;

void main(void)
{
    WDTCTL = WDT_ADLY_1000; // WDTのクロック・ソースをACLK、
                            // 1sのインターバルタイマに設定
    IE1 |= WDTIE;           // WDT割込有効
    P1DIR |= 0x0C;          // ポート(P1.2,P1.3)を出力に設定
    P1OUT = 0;              // ポート初期化

    _BIS_SR(GIE);           // 汎用割込み許可

    xxx = 0;
    for (;;) {
      if (xxx == 1) {
        xxx = 0;
        P1OUT ^= 0x0C;
      }
    }
}

// 割込みハンドラ
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
    xxx = 1;
}

あとは、省電力モードを使うようにすれば、サンプルプログラムとほぼ同じになりそう。


参考文献

  1. 小倉康司, MSP430リファレンスガイド, 技術評論社, 2005
  2. (株)アムスク, MSP430F1232評価ボード サンプルプログラム, 2005

ホーム 特殊工作室 MSP430班