值班电路 程序分块测试

1.时钟测试

用P5.4,5.5可以分别输出系统时钟和辅助系统时钟
MCLK = 8MHZ,SMCLK = 1MHZ

void Init_clk(void)
{
unsigned int i;

BCSCTL1=0X00; //将寄存器BCSCTL1的内容清零
//XT2开启,LFTX1工作在低频,ACLK的分频因子为1
do
{
IFG1 &=~OFIFG; //清除OSCFault标志位
for(i=0x20;i>0;i--); //IFG1中断标志寄存器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;

}

2.TIMER A 测试:

增计数模式下,TA OUT1 = 50/1M = 0.05MS周期的方波,也就是20kHZ的方波,OUTMOD选择3,即计数到CCR1,SET,计数到CCR0,RESET。在P2.3可以检测方波的输出。

void Init_timer(void)
{
P2SEL |= BIT3;
P2DIR |= BIT3;
CCR0 = 50;
CCR1 = 25;
TACCTL1 = OUTMOD_3;
TACTL = TASSEL_2 | MC_1 | TACLR; //SMCLK作为TA的时钟源 增计数模式
}

3.AD 测试:
AD中断中去反转一个LED,示波器看到LED的反转周期是1ms
因为TA OUT1是0.05ms,所以AD转换每0.05ms一次
Num_of_Results = 10,完成10次转换要0.5ms,LED周期为0.5*2= 1ms
void Init_ADC(void)
{
P2DIR = 0xFF;
P2OUT = 0x00;
P6SEL |= 0x01; // 使能ADC通道P6.0即A0
ADC12CTL0 = ADC12ON+SHT0_1; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_2+SHS_1; // 使用采样定时器
//ADC12CTL1 = ADC12SSEL_3+ADC12DIV_0; //ADC内核时钟SMCLK 1MHZ
//之前一直出错是因为这一句
ADC12MCTL0 = INCH_0;
ADC12IE = 0x0001; // 使能中断
}

4.注意:
(1)不要用MSC,使用了单次通道序列转换之后,希望每次转换都由SHI来触发
就是每次都要定时器TA OUT1信号的上升沿触发,而不能自动转换
(2)可以不去设置ADC12的内核时钟,设置了反而错误,不明原因,
也许是设置之后采样保持的时间不足,应该是内部问题

#include
#include
#define Num_of_Results 10
int results[Num_of_Results] = {0};

void Init_clk(void);
void Init_timer(void);
void Init_ADC(void);

//********************主函数***************************
void main(void)
{
WDTCTL =WDTPW + WDTHOLD; //关闭看门狗

//P1SEL |= (BIT2+BIT6);
//P1DIR |= (BIT2+BIT6);
//P2OUT |= 0xf0;
//P5SEL |= BIT5+BIT4;
//P5DIR |= BIT5+BIT4;

Init_clk();
Init_ADC();
Init_timer();
ADC12CTL0 |= ENC; // 使能转换
_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;
}
}

你可能感兴趣的:(值班电路 程序分块测试)