Skip to content

Instantly share code, notes, and snippets.

@totoroAKI
Created October 23, 2018 10:31
Show Gist options
  • Save totoroAKI/422d8ad1a543b16d981b6271f3f9f416 to your computer and use it in GitHub Desktop.
Save totoroAKI/422d8ad1a543b16d981b6271f3f9f416 to your computer and use it in GitHub Desktop.
Blog2
#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 温度センサ LM35DZ [A0]
// 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
// 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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment