組み込み技術を向上したい!!

でも組み込み以外にも手を出し始めました・・・

MSP430 LaunchPadでLチカ

MSP430について

MSP430はTI(Texas Instruments)の16bit低消費電力マイコンです。

LaunchPadは一昔前までは500円くらいで買えたんですが、現在(2015.1月)は1000円くらいするようですね。。。

開発環境(IDE)

TIのCCS(code composer studio)を使います。TIのアカウントとったら誰でもダウンロードできると思います。(16KBコードサイズ制限付き)

eclipseベースなのでとっつきやすいかと思います。

IDEが重いと感じた場合、PCのメモリに余裕があったらeclipse.iniファイルの

--launcher.XXMaxPermSizeとか-vmargsとかの値を適当に256mとか512mとかすると早くなるはずです。

Lチカ(タイマー割り込み)

ターゲットのCPUはMSP430G2553にします。

LaunchPadには赤LEDと緑LEDが実装されているので、タイマー割り込みを使ってこのLEDを制御してみます。

回路図を見ると緑LEDがP1.0、赤LEDがP1.6につながっていることが分かります。

プログラムソースは以下のようになります。

#include  <msp430g2553.h> /* MSP430G2553用のヘッダファイル */
#include <stdint.h> /* uint8_t とか定義してあるヘッダファイル */
void main(void)
{
  WDTCTL = WDTPW +WDTHOLD;       /* ウォッチドッグタイマーを止める*/
  /*----- クロックキャリブレーション -----*/
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) {
    while(1);
  }
  /* 1Mhz */
  BCSCTL1 = CALBC1_1MHZ;            /* Set range */
  DCOCTL = CALDCO_1MHZ;            /* Set DCO step + modulation */
  /*--------------------------------------------*/
  
  P1DIR |= BIT6 + BIT0; /* P1.0とP1.6を出力に設定 */
  P1OUT &= ~(BIT6 + BIT0); /* 最初は両方のLEDを消灯 */

  CCR0 = 1000; /* たぶんTACTLで設定されるタイマーのカウントMAX値 */
  CCR2 = 1000; /* たぶんTACTLで設定されるタイマーのカウントとのコンペアマッチ */
  TACTL = TASSEL_2 + MC_3 + TAIE;      /* SMCLK, up-down mode */
  CCTL2 = CCIE; /* タイマー割り込みスタート */
  
  __bis_SR_register(LPM0_bits + GIE);       /* LPM0モード, 割り込み許可 */
}

/*! **************************************************
* @brief タイマー割り込みの処理
******************************************************/
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
  switch( TA0IV ) {
    static uint8_t toggle_span;
    case  2:  break;        // CCR1 not used
    //------------------------------------//
    // 2msec interrupt
    //------------------------------------//
    case  4:
    toggle_span++;
    if ( toggle_span > 100 ) {
      toggle_span = 0;
      if ( P1OUT&BIT6 ) {
        P1OUT &= ~BIT6;
        P1OUT  |= BIT0;
      }
      else {
        P1OUT &= ~BIT0;
        P1OUT  |= BIT6;
      }
    }
    break;         // CCR2
    case 10:  break; // overflow
  }
}

これでLEDが約0.2秒毎、交互に点滅するはずです!!