MSP430_LaunchPad  を試してみました。

メーカーの説明です。 コピペなので怒られるかな?
 リンク先 http://processors.wiki.ti.com/index.php/MSP430_LaunchPad_%28MSP-EXP430G2%29_JP

LaunchPad は、MCU ベースのアプリケーションを作成する初心者にも熟練ユーザーにも使いやすい開発ツールです。$4.30 の LaunchPad には、プロジェクトを開始するために必要なツールがすべて含まれています。
LaunchPad 開発キットは、MSP430 バリュー・ライン・シリーズの 1 つです。LaunchPad には、最大 20 ピンをサポートする統合 DIP ターゲット・ソケットが搭載されているため、MSP430 バリュー・ライン・デバイスを LaunchPad ボードに接続できます。また、オンボードのフラッシュ・エミュレーション・ツールを PC へのダイレクト・インターフェイスとして使用して、プログラミング、デバッグ、評価を簡単に行うことができます。そのほか、ソフトウェアの作成とデバッグ を行うソフトウェア開発環境を無償でダウンロードできます。LaunchPad には、外部デバイスの統合を簡単に行えるオンボードのプッシュ・ボタン、LED、追加入出力ピンが備わっているため、対話型ソリューションの作成に使用で きます。

特徴
LaunchPad は、マイコンと MSP430 ファミリの使いやすく、低価格で、スケーラブルな開発ツールです。
使いやすさ – LaunchPad には、開発に必要なハードウェアとソフトウェアすべてが含まれています。オープン・ソース・プロジェクトとサンプル・コードを使用して、迅速な立ち上げが可能です。 低価格 – $4.30 の LaunchPad には、開発ボード、プログラマブル MSP430 マイコン 2 個、mini USB ケーブル、拡張用 PCB コネクタ、クロック精度向上用外部クリスタル、無償でダウンロード可能なソフトウェア統合開発環境(IDE)など、開発に必要なものすべてが含まれていま す。 スケーラブル – LaunchPad を使用すれば、MSP430 マイコン・ファミリを簡単に開発できます。アプリケーション要件が変更された場合は、LaunchPad で開発したプログラムをハイエンドの MSP430 デバイスに移行できます。


USBポートを使用したシリアル送信でA/Dコンバーターのデータを受信中の動作画面です。
文字列の送信とA/Dコンバータの16bitデータをitoaで文字列に変換して送信しています。
A/Dコンバータのリファレンス設定を電源電圧にしてボリュームで中間位置あたりの電圧を読んでいます。

勝手に追加変更してテストした、プログラムです。

/******************************************************************************
 *  MSP-EXP430G2-LaunchPad User Experience Application
 *  2010/02/21  main.c
 *  A/Dの入力をP1.4に変更
 *  シリアルの送信データを1byteからitoaを追加してint(16bit)を文字列に変換して送
* 信 ******************************************************************************/
#include "msp430x20x2.h" #define LED0 BIT0 #define LED1 BIT6 #define LED_DIR P1DIR #define LED_OUT P1OUT #define BUTTON BIT3 #define BUTTON_OUT P1OUT #define BUTTON_DIR P1DIR #define BUTTON_IN P1IN #define BUTTON_IE P1IE #define BUTTON_IES P1IES #define BUTTON_IFG P1IFG #define BUTTON_REN P1REN #define TXD BIT1 // TXD on P1.1 #define RXD BIT2 // RXD on P1.2 #define APP_STANDBY_MODE 0 #define APP_APPLICATION_MODE 1 #define TIMER_PWM_MODE 0 #define TIMER_UART_MODE 1 #define TIMER_PWM_PERIOD 2000 #define TIMER_PWM_OFFSET 20 #define TEMP_SAME 0 #define TEMP_HOT 1 #define TEMP_COLD 2 #define TEMP_THRESHOLD 5 // Conditions for 9600/4=2400 Baud SW UART, SMCLK = 1MHz #define Bitime_5 0x05*4 // ~ 0.5 bit length + small adjustment #define Bitime 13*4 #define UART_UPDATE_INTERVAL 1000 unsigned char BitCnt; unsigned char applicationMode = APP_STANDBY_MODE; unsigned char timerMode = TIMER_PWM_MODE; unsigned char tempMode; unsigned char calibrateUpdate = 0; unsigned char tempPolarity = TEMP_SAME; unsigned int TXByte; //static const char string1[] = { "Hello PUW2\r\n" }; /* Using an 8-value moving average filter on sampled ADC values */ //long tempMeasured[8]; //long tempAverage; unsigned int tempMeasured[8]; //puw unsigned char tempMeasuredPosition=0; unsigned int tempAverage; long tempCalibrated, tempDifference; //unsigned char str[10]; //--------------------------------------------------------------------- void PreApplicationMode(void) { LED_DIR |= LED0 + LED1; LED_OUT |= LED0; // To enable the LED toggling effect LED_OUT &= ~LED1; BCSCTL1 |= DIVA_1; // ACLK/2 BCSCTL3 |= LFXT1S_2; // ACLK = VLO TACCR0 = 1200; // TACTL = TASSEL_1 | MC_1; // TACLK = SMCLK, Up mode. TACCTL1 = CCIE + OUTMOD_3; // TACCTL1 Capture Compare TACCR1 = 600; __bis_SR_register(LPM3_bits + GIE); // LPM0 with interrupts enabled } //--------------------------------------------------------------------- void ConfigureAdcTempSensor(void) { unsigned char i; /* Configure ADC Temp Sensor Channel */ // ADC10CTL1 = INCH_10 + ADC10DIV_3; // Temp Sensor ADC10CLK/4 ADC10CTL1 = INCH_4 + ADC10DIV_3; // Temp Sensor ADC10CLK/4 // ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE; ADC10CTL0 = SREF_0 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE; __delay_cycles(1000); // Wait for ADC Ref to settle ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled tempCalibrated = ADC10MEM; for (i=0; i < 8; i++) tempMeasured[i] = tempCalibrated; tempAverage = tempCalibrated; } //--------------------------------------------------------------------- void ConfigureTimerPwm(void) { timerMode = TIMER_PWM_MODE; TACCR0 = TIMER_PWM_PERIOD; // TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode. TACCTL0 = CCIE; TACCTL1 = CCIE + OUTMOD_3; // TACCTL1 Capture Compare TACCR1 = 1; } //--------------------------------------------------------------------- void ConfigureTimerUart(void) { timerMode = TIMER_UART_MODE; // Configure TimerA0 UART TX CCTL0 = OUT; // TXD Idle as Mark TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK/8, continuous mode P1SEL |= TXD + RXD; // P1DIR |= TXD; // } //--------------------------------------------------------------------- // Function Transmits Character from TXByte void Transmit() { BitCnt = 0xA; // Load Bit counter, 8data + ST/SP while (CCR0 != TAR) // Prevent async capture CCR0 = TAR; // Current state of TA counter CCR0 += Bitime; // Some time till first bit TXByte |= 0x100; // Add mark stop bit to TXByte TXByte = TXByte << 1; // Add space start bit CCTL0 = CCIS0 + OUTMOD0 + CCIE; // TXD = mark = idle while ( CCTL0 & CCIE ); // Wait for TX completion } //--------------------------------------------------------------------- // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { if (timerMode == TIMER_UART_MODE) { CCR0 += Bitime; // Add Offset to CCR0 if (CCTL0 & CCIS0) // TX on CCI0B? { if ( BitCnt == 0) CCTL0 &= ~ CCIE; // All bits TXed, disable interrupt else { CCTL0 |= OUTMOD2; // TX Space if (TXByte & 0x01) CCTL0 &= ~ OUTMOD2; // TX Mark TXByte = TXByte >> 1; BitCnt --; } } } else { if (tempPolarity == TEMP_HOT) LED_OUT |= LED1; if (tempPolarity == TEMP_COLD) LED_OUT |= LED0; TACCTL0 &= ~CCIFG; } } //--------------------------------------------------------------------- #pragma vector=TIMERA1_VECTOR __interrupt void ta1_isr(void) { TACCTL1 &= ~CCIFG; if (applicationMode == APP_APPLICATION_MODE) LED_OUT &= ~(LED0 + LED1); else LED_OUT ^= (LED0 + LED1); } //--------------------------------------------------------------------- void InitializeClocks(void) { BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; BCSCTL2 &= ~(DIVS_3); // SMCLK = DCO / 8 = 1MHz } //--------------------------------------------------------------------- void InitializeButton(void) // Configure Push Button { BUTTON_DIR &= ~BUTTON; BUTTON_OUT |= BUTTON; BUTTON_REN |= BUTTON; BUTTON_IES |= BUTTON; BUTTON_IFG &= ~BUTTON; BUTTON_IE |= BUTTON; } //--------------------------------------------------------------------- void InitializeLeds(void) { LED_DIR |= LED0 + LED1; LED_OUT &= ~(LED0 + LED1); } /* ************************************************************* * Port Interrupt for Button Press * 1. During standby mode: to exit and enter application mode * 2. During application mode: to recalibrate temp sensor * *********************************************************** */ #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) { BUTTON_IFG = 0; BUTTON_IE &= ~BUTTON; /* Debounce */ WDTCTL = WDT_ADLY_250; IFG1 &= ~WDTIFG; /* clear interrupt flag */ IE1 |= WDTIE; if (applicationMode == APP_APPLICATION_MODE) { tempCalibrated = tempAverage; calibrateUpdate = 1; } else { applicationMode = APP_APPLICATION_MODE; // Switch from STANDBY to APPLICATION MODE __bic_SR_register_on_exit(LPM3_bits); } } //--------------------------------------------------------------------- #pragma vector=WDT_VECTOR __interrupt void WDT_ISR(void) { IE1 &= ~WDTIE; /* disable interrupt */ IFG1 &= ~WDTIFG; /* clear interrupt flag */ WDTCTL = WDTPW + WDTHOLD; /* put WDT back in hold state */ BUTTON_IE |= BUTTON; /* Debouncing complete */ } //--------------------------------------------------------------------- // ADC10 interrupt service routine #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR (void) { __bic_SR_register_on_exit(CPUOFF); // Return to active mode } //--------------------------------------------------------------------- void itoa(int n, char s[]) { int i=0, d=1; /* 変数 i, d を宣言し、初期化 */ if( n < 0 ){ /* n が負の場合 */ s[0] = '-'; /* s[] の先頭にマイナス記号を代入 */ i = i + 1; /* マイナス記号の場所分 i を増やす */ n = -n; /* n を正の数に */ } while( d*10 <= n ) /* d が n と同じ桁になるまで */ d = d * 10; /* d に 10 を乗ずる */ while( d >= 1 ){ s[i] = n / d + '0'; /* n の先頭桁を取得 */ n = n % d; /* n の先頭桁を除去 */ d = d / 10; /* d を 10 分の 1 に */ i++; } s[i] = '\0'; /* s[] の最後に null 文字を代入 */ } //--------------------------------------------------------------------- int ADC10_in() { int tempAverage; int i; ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE);// LPM0 with interrupts enabled //* Moving average filter out of 8 values to somewhat stabilize sampled ADC */ tempMeasured[tempMeasuredPosition++] = ADC10MEM; if (tempMeasuredPosition == 8) tempMeasuredPosition = 0; tempAverage = 0; for (i = 0; i < 8; i++) tempAverage += tempMeasured[i]; tempAverage >>= 3; // Divide by 8 to get average return tempAverage; } //--------------------------------------------------------------------- void TXstr(unsigned char str[]){ unsigned int i = 0; ConfigureTimerUart(); while(str[i] != '\0' ){ TXByte = str[i]; Transmit(); i++; } TXByte = '\r'; Transmit(); TXByte = '\n'; Transmit(); } //--------------------------------------------------------------------- void main(void) { unsigned char str1[] = { "Hello PUW2" }; unsigned char str2[10]; unsigned int uartUpdateTimer = UART_UPDATE_INTERVAL; WDTCTL = WDTPW + WDTHOLD; // Stop WDT InitializeClocks(); InitializeButton(); InitializeLeds(); PreApplicationMode(); // Blinks LEDs, waits for button press /* Application Mode begins */ applicationMode = APP_APPLICATION_MODE; ConfigureAdcTempSensor(); ConfigureTimerPwm(); __enable_interrupt(); // Enable interrupts. INCH_0 ConfigureTimerUart(); TXstr(str1); /* Main Application Loop */ while(1) { tempAverage = ADC10_in(); if ((--uartUpdateTimer == 0) || calibrateUpdate ) { ConfigureTimerUart(); itoa( tempAverage, str2 ); TXstr(str2); uartUpdateTimer = UART_UPDATE_INTERVAL; ConfigureTimerPwm(); } } } --------------------------------------------------------------------------------------
あとがき

 600円の価格で開発基板とサンプルICとフリーの開発環境の一式が入手出来ると言う脅威の価格破壊かも知れません?
まだ利用方法が思い浮かばない。
何時もの様にステッピングモーターは廻る様に成りました。ドライバー部分の基板の画像がありません。

--------------------------------------------------------------------------------------
開発メモ
 main()を最後にしています。どうも最初に置くのは馴染めません。
開発環境をインストールした時にコンパイル->デバッグモードにした時にプログラムがソースコードのデバックモードに
なってスタートで動いていたのが動かなくなってしまい元に戻す方法が解らない。
ターミナルからのUSBの仮想ポートが認識されない。デバイスマネージャは登録されているのに?
温度計のサンプルのプロセッシングでも同様な現象が起きている。かなり悩んでしまった。
この基板に付属しているICだけ別途サンプルで購入すると500円位する。どうすればいいのか解らない(趣味の人)
ゆっくり応用方法考えるモードに入るので忘れない様にアップしました。
---------------------------------------------------------------------------------------
 追加

ステッピングモーター回転プログラムです。
ドライブ回路はポートの出力をドライバーICの東芝TD62084に入力しています。
モーターの電源は別途電源より供給します。
//******************************************************************************
//  MSP430x2xx Steping Motor puw2
//  2011/02/06
//  Built with CCE for MSP430 Version: 3.0
//******************************************************************************

#include "msp430f2101.h"

volatile unsigned int   Xpat_no = 0 ;   // モーター励磁位置
volatile unsigned char  Xcw = 0 ;       // モーター回転方向
volatile unsigned int   Xcount;         // モーターパルス
volatile unsigned int i;                // volatile to prevent optimization
volatile unsigned char  pat[8];

//---------------------------------------------------------------------
int main(void)
{
#define reiji2
#ifdef reiji12
    //1励磁パターン
    pat[0] = 0x08;
    pat[1] = 0x04;
    pat[2] = 0x02;
    pat[3] = 0x01;
    pat[4] = 0x08;
    pat[5] = 0x04;
    pat[6] = 0x02;
    pat[7] = 0x01;
#endif

#ifdef reiji2
    //2相励磁パターン
    pat[0] = 0x03;
    pat[1] = 0x06;
    pat[2] = 0x0c;
    pat[3] = 0x09;
    pat[4] = 0x03;
    pat[5] = 0x06;
    pat[6] = 0x0c;
    pat[7] = 0x09;
#endif

#ifdef reiji12
    //1−2相励磁パターン
    pat[0] = 0x01;
    pat[1] = 0x03;
    pat[2] = 0x02;
    pat[3] = 0x06;
    pat[4] = 0x04;
    pat[5] = 0x0c;
    pat[6] = 0x08;
    pat[7] = 0x09;
#endif

  WDTCTL = WDTPW + WDTHOLD;    // Stop watchdog timer
  P1DIR = 0x0F;                  // Set P1.0 to P1.3 output direction
  Xcount=480;
  
  for (;;)
  {
      if(Xcount > 0){            // 1軸
        if (Xcw == 0){
          if(Xpat_no == 7) Xpat_no = 0; else Xpat_no++;
        }else{
          if(Xpat_no == 0) Xpat_no = 7; else Xpat_no--;
        }
        Xcount--;
        P1OUT = pat[Xpat_no];    // 励磁パターンをポートBへ出力

        i = 500;                 // Speed Delay
        do i--;
        while (i != 0);
      }else{
        P1OUT = 0x00;   // 励磁OFF
      }    
  }
}
//---------------------------------------------------------------------