#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; } }