TI
マイコン
MSP430
launchpad

TI(Texas Instruments) MSP430 LaunchPadでHello World

More than 1 year has passed since last update.

MSP430 LaunchPad(MSP-EXP430G2)でとりあえずLEDをチカチカさせます。

med_msp-exp430g2_mspexp430g2_lateral.jpg
http://www.ti.com/tool/msp-exp430g2#1

【環境】
OS:Windows 7(64bit)
IDE:Code Composer Studio(TI提供の無償ツール)

#include <msp430.h> 

void initialize() {
    P1DIR |= BIT0;//LED1
    P1DIR |= BIT6;//LED2
}
/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
    initialize();
    while (1) {
        P1OUT ^= BIT0;
        P1OUT ^= BIT6;
        __delay_cycles(100000);
    }
    return 0;
}

ループの中で所定のビットを反転させて、実行をdelayさせます。
この方法でもLEDの点滅を実現できますが、せっかくなのでタイマを使用して実現する方法についても記載します。割り込みを使った処理を行うため上記のループでdelayさせる処理よりも設定が増えます。

#include <msp430.h> 

void init_timer() {
    TACCTL0 |= CCIE; // Enable Interrupt
    TACCR0 = 10000;
    TACTL |= TASSEL_1;
    TACTL |= MC_1;
}

void initialize() {
    P1DIR |= BIT0;
    P1DIR |= BIT6;
    init_timer();
}
/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
    initialize();
    while (1) {
        _bis_SR_register(LPM3_bits + GIE);// ※1
    }
    return 0;
}

#pragma vector=TIMER0_A0_VECTOR //※2
__interrupt void Timer_A0(void)
{
    P1OUT ^= BIT0;
    P1OUT ^= BIT6;
}

初期化の際にタイマ関連のレジスタの設定を行っています。
(※1)は一旦置いておいて(※2)についてですが、これは割り込みルーチンを記述する際の決まりです。
pragmaを用いてコンパイラ特有の指令を記述しています。TIMER0_A0_VECTORというのはmsp430g2553.hで定義されいるアドレスで、この記述によりアドレスがTime_A0の割り込みベクタに設定されます。設定したタイマにより割り込みが発生した時に、この割り込みルーチンが呼ばれるという仕組みになっています。

(※1)ですがこれは動作モードの変更を行っています。
MSP430には動作モードが複数用意されていて、これを簡単に制御できるようになっています。
起動時はActiveModeで動作しており、全力で動作しているといったイメージです。

このプログラムではLPM3というモードで動作させるようにしています。LPMというのは(Low-Power Mode)のことで消費電力を抑えることのできるモードです。LPMも数種類ありActive Mode以外のモードはCPUがOFFになります。話がそれてしまいましたが、(*1)でLPM3というモードに移行しており、CPUがOFFになるのでプログラムもここで停止します。プログラムを停止させたので何らかの方法で復帰しないと機能を実現できません。今回の場合ですとLEDをチカチカさせることができなくなってしまいます。そこでタイマを利用して定期的に復帰させようという流れになっています。

1)whileループ内でLPM3モードへ移行しプログラムが停止
2)タイマ割り込みが発生しLEDをトグル

1と2を繰り返すため、LEDが点滅する動作となります。
仕組みさえわかればdelayで処理するよりもわかりやすいのではないかと思います。LEDを点滅させるだけであればどちらでもいいかと思いますが、処理が複雑になれば個々の処理の制御が難しくなってきます。

LaunchPadで遊びながらしっかりとマスターしたいと思います。