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

昨日に引き続き、ウォッチドッグタイマをインターバルタイマとして使ってみようとしています。


昨日作ったプログラムでは割込みを使うようにしたので、ついでに[3]を見てMSP430の標準的なプログラムの形態に直してみました。

#include  <msp430x12x2.h>

int xxx = 0;

void main(void)
{
    IE1 |= WDTIE;
    P1DIR |= 0x0C;
    P1OUT = 0;

    xxx = 0;
    for (;;) {
        _BIS_SR(LPM3_bits+GIE);
        if (xxx == 1) {
            xxx = 0;
            P1OUT ^= 0x0C;
        }
    }
}

#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
    _BIC_SR_IRQ(LPM3_bits); // LPMを解除
    xxx = 1;
}

// スタートアップルーチンから呼び出される初期化処理
void __low_level_init(void)
{
    WDTCTL = WDT_ADLY_1000; // WDTのクロック・ソースをACLK、
                            // 1sのインターバルタイマに設定
}

変更点としては、タイマ割込みをLPM3で待つようにしたのと、それに伴い、割込みハンドラでLPM3を解除しています。あとは、WDTの初期化をmainではなく、__low_level_init()で行っています。これはスタートアップルーチンから早い段階で呼び出される初期化用関数ということです。注意点としては、dataやbss領域が初期化されていない(というより、その初期化に時間がかかって待たされるとまずい処理を先に行う)ので、それを考慮した処理にする必要があります。

LPM3を使うことで、どの程度消費電力を低減できたかは、未測定です。それにしても、_BIC_SR_IRQの処理内容は大胆(というか、システムプログラムならでは?)ですよね。


参考文献

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

ホーム 特殊工作室 MSP430班