1.時鐘測試
用P5.4钉凌,5.5可以分別輸出系統(tǒng)時鐘和輔助系統(tǒng)時鐘
MCLK = 8MHZ咧最,SMCLK = 1MHZ
<pre>void Init_clk(void)
{
unsigned int i;
BCSCTL1=0X00; //將寄存器BCSCTL1的內(nèi)容清零
//XT2開啟,LFTX1工作在低頻,ACLK的分頻因子為1
do
{
IFG1 &=~OFIFG; //清除OSCFault標(biāo)志位
for(i=0x20;i>0;i--); //IFG1中斷標(biāo)志寄存器1
}
while((IFG1 & OFIFG)== OFIFG);//如果OSCFault=1
BCSCTL2=0X00;
BCSCTL2 += SELM_2; //MCLK的時鐘源為TX2CLK,分頻因子為1 8MHZ
BCSCTL2 += SELS +DIVS_3; //SMCLK的時鐘源為TX2CLK,分頻因子為8 1MHZ
return;
}</pre>
2.TIMER A 測試:
增計數(shù)模式下,TA OUT1 = 50/1M = 0.05MS周期的方波,也就是20kHZ的方波矢沿,OUTMOD選擇3滥搭,即計數(shù)到CCR1,SET捣鲸,計數(shù)到CCR0瑟匆,RESET。在P2.3可以檢測方波的輸出栽惶。
<pre>void Init_timer(void)
{
P2SEL |= BIT3;
P2DIR |= BIT3;
CCR0 = 50;
CCR1 = 25;
TACCTL1 = OUTMOD_3;
TACTL = TASSEL_2 | MC_1 | TACLR; //SMCLK作為TA的時鐘源 增計數(shù)模式
}</pre>
3.AD 測試:
AD中斷中去反轉(zhuǎn)一個LED愁溜,示波器看到LED的反轉(zhuǎn)周期是1ms
因為TA OUT1是0.05ms,所以AD轉(zhuǎn)換每0.05ms一次
Num_of_Results = 10,完成10次轉(zhuǎn)換要0.5ms媒役,LED周期為0.5*2= 1ms
<pre>void Init_ADC(void)
{
P2DIR = 0xFF;
P2OUT = 0x00;
P6SEL |= 0x01; // 使能ADC通道P6.0即A0
ADC12CTL0 = ADC12ON+SHT0_1; // 打開ADC,設(shè)置采樣時間
ADC12CTL1 = SHP+CONSEQ_2+SHS_1; // 使用采樣定時器
//ADC12CTL1 = ADC12SSEL_3+ADC12DIV_0; //ADC內(nèi)核時鐘SMCLK 1MHZ
//之前一直出錯是因為這一句
ADC12MCTL0 = INCH_0;
ADC12IE = 0x0001; // 使能中斷
}</pre>
4.注意:
(1)不要用MSC,使用了單次通道序列轉(zhuǎn)換之后宪迟,希望每次轉(zhuǎn)換都由SHI來觸發(fā)
就是每次都要定時器TA OUT1信號的上升沿觸發(fā)酣衷,而不能自動轉(zhuǎn)換
(2)可以不去設(shè)置ADC12的內(nèi)核時鐘,設(shè)置了反而錯誤次泽,不明原因穿仪,
也許是設(shè)置之后采樣保持的時間不足,應(yīng)該是內(nèi)部問題
<pre>
#include <msp430x14x.h>
#include <stdlib.h>
#define Num_of_Results 10
int results[Num_of_Results] = {0};
void Init_clk(void);
void Init_timer(void);
void Init_ADC(void);
//********************主函數(shù)***************************
void main(void)
{
WDTCTL =WDTPW + WDTHOLD; //關(guān)閉看門狗
//P1SEL |= (BIT2+BIT6);
//P1DIR |= (BIT2+BIT6);
//P2OUT |= 0xf0;
//P5SEL |= BIT5+BIT4;
//P5DIR |= BIT5+BIT4;
Init_clk();
Init_ADC();
Init_timer();
ADC12CTL0 |= ENC; // 使能轉(zhuǎn)換
_BIS_SR(GIE); //使能全局中斷
while(1)
{
}//while
}//main
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static unsigned int index = 0;
results[index++] = ADC12MEM0; // Move results
if (ADC12MEM0 < 0x7FF)
P2OUT &= ~0xF0;
else
P2OUT |= 0xF0;
if (index == Num_of_Results)
{
index = 0;
P2OUT ^= 0X01;
}
}</pre>