#include <msp430.h>     //MSP430F2619TPM
/**
 * main.c
 */
// 端子設定 /////////////////////////////////////////////////////////
// LED
#define test_LED    0b00000001          // P1.0 test_LED
#define RED_LED     0b00000010          // P4.1 RED_LED  [TB1]
#define BLUE_LED    0b00000100          // P4.2 BLUE_LED [TB2]
#define GREEN_LED   0b00001000          // P4.3 GREEN_LED[TB3]

// ADC
#define ADC0        0b00000001          // P6.0 可変抵抗 入力

// Timer B
#define Tpwm        8000000/4000       // TimerBの分周用カウンタ
#define Tpwm2       4000/2              // TimerBのさらなる分周用カウンタ
///////////////////////////////////////////////////////////////////


/* グローバル変数 */////////////////////////////////////////////////////
int INTERRUPT_FLAG = 0;     // 割り込み種類フラグ
unsigned int TB_CM = 0;     // TimerBがコンペアマッチするごとにインクリメント
////////////////////////////////////////////////////////////////////


/* 関数定義  */////////////////////////////////////////////////////////
void setup( void );
////////////////////////////////////////////////////////////////////


/* 初期設定 *////////////////////////////////////////////////////////
void setup() {
    WDTCTL = WDTPW + WDTHOLD;       // Stop WathcDog Timer,

    SVSCTL &= ~SVSFG;               // 低電圧フラグを消去    Supply Voltage Supervisor
    SVSCTL = 0x60 + PORON;          // SVS POR enabled @ 2.5V  電圧低下検出.この電圧以下ではマイコンリセット.
    while(!(SVSCTL & SVSON));       // 電圧監視機能がONになるまで待機

    BCSCTL1 = CALBC1_8MHZ;          // Set RSELx
    DCOCTL  = CALDCO_8MHZ;          // Set DCOx and MODx = MCLK :8MHZ


    P1DIR = test_LED;                           // P1.0:OUT
    P4DIR = RED_LED | BLUE_LED | GREEN_LED;     // P4.1,4.2,4.3:OUT,   the others;IN
    P4SEL = RED_LED;                            // | BLUE_LED | GREEN_LED;
    P6SEL = ADC0;                               // P6.0; Primary peripheral module function = A0


    // Setup ADC //                                     // The ADC12OSC is generated internally and is in the 5-MHz range
    ADC12CTL0  = SHT0_2 + SHT1_2 + REFON + ADC12ON;     // ADC12OSC(~5MHZ), 16 cycle, Set sampling time:xxus, turn on ADC12
    ADC12CTL1  = SHP + ADC12SSEL_0;                     // Use sampling timer, Single-channel, single-conversion
    //// 各チャンネルの設定 ////
    ADC12MCTL0 = SREF_0 + INCH_0;                       // VRef = AVcc, channel = A0
                                                        // SHT0x:Bits 11-8 Sample-and-hold time.   for registers ADC12MEM0 to ADC12MEM7.
                                                        //      0000:4    ADC12CLK cycles     0001:8    ADC12CLK cycles
                                                        //      0010:16   ADC12CLK cycles     0011:32   ADC12CLK cycles
                                                        //      0100:64   ADC12CLK cycles     0101:96   ADC12CLK cycles
                                                        //      0110:128  ADC12CLK cycles     0111:192  ADC12CLK cycles
                                                        //      1000:256  ADC12CLK cycles     1001:384  ADC12CLK cycles
                                                        //      1010:512  ADC12CLK cycles     1011:768  ADC12CLK cycles
                                                        //      1100:1024 ADC12CLK cycles     1101:1024 ADC12CLK cycles
                                                        //      1110:1024 ADC12CLK cycles     1111:1024 ADC12CLK cycles



    // setup Timer_B //
    TBCTL = TBSSEL_2 + ID_0 + MC_1 + TBIE;      // Timer_B Control resister (13.3.1 TBCTL, Timer_A Control Register  P.391)
                                                //   00 TBCLK :外部入力のタイマー用クロック(P1.0 TBCLK)
                                                //   01 ACLK  :補助クロック(外部32768HZ発振子) /(div)
                                                //   10 SMCLK :サブシステムクロック(DCOから) /(div)
                                                //   11 INCLK :外部入力クロック(P2.1 TAINCLK)

    TBCCR0 = Tpwm;          // TBCCRx:Bits 15-0  TBCCRx:Timer_B Capture/Compare Resister  (13.3.3 TBCCRx, Timer_B Capture/Compare Register x, P.390)
    TBCCR1 = Tpwm*0.3;      //
    TBCCTL0 = CCIE;         // 13.3.4 TBCCTLx, Capture/Compare Control Register, P.
    TBCCTL1 = OUTMOD_7;     //



    __bis_SR_register(GIE);                  // 汎用割り込み許可
    ADC12CTL0 |= ENC;                        // ADC go working
}
////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////
/*!!! ************************************************
*  タイマー割り込みの処理
******************************************************/
#pragma vector = TIMERB0_VECTOR     // Datasheet, Interrupt Vector Addresses P.16
 __interrupt void TIMER_B0(void)     // Timer interrupt 発生時に割り込む関数の定義
{
     TBCTL &= ~TBIFG;               // タイマーの割り込みフラグのクリア
     INTERRUPT_FLAG = 1;
     TB_CM++;
 }
 ////////////////////////////////////////////////////////////////////





 ////////////////////////////////////////////////////////////////////
int main(void)
{
    setup();    // システム初期設定.これ以前には何も処理をしないこと

    int AD0 = 0;
    int Tpwm1 = Tpwm2;

    P1OUT = test_LED;
    P4OUT = 0x00;

    ADC12CTL0 |= ADC12SC;           // ADC12 enable, start conversion



    while(1){
        if(INTERRUPT_FLAG == 1){
            AD0 = ADC12MEM0;
            ADC12CTL0 |= ADC12SC;           // ADC12 enable, start conversion

            TBCCR1 = Tpwm*(AD0*0.7 + 4095*0.05)/4095;

            if(TB_CM > Tpwm1){
                TB_CM = 0;
                P4OUT ^= BLUE_LED;
            }
						
        }
        P4OUT ^= GREEN_LED;
    }
}