我使用MSP430f1611周期性采集交流电压 每个500us采集一次 当程序运行设置断点在定时中断里面 前面6次能正常进行到了第7次程序就不按照先前6次运行的那样运行 ADC12CTL0的值前6次都是0892到了第7次开始就乱变了 求大神帮忙看看程序是哪儿没对
void main(void)
{
P6DIR&=~BIT0;//P6。0为输入,ADC0
P6SEL|=BIT0;//P6.0 用于模拟输入通道A0
P6DIR|=BIT6;//P6.6为输出,DAC0
P1DIR|=0xFF;//P1为输出(接74HC595、CD4051地址位、数码管位选择)
P2DIR&=~0x0F;//P2为输入 (接按键)
P2IES=0xff;//设置 P2 口中断是下降沿触发
P2IE=0xff;//允许 P2 口中断
P3DIR|=0xFF;
P3OUT|=BIT0; P3OUT|=BIT3; P3OUT|=BIT4; P3OUT|=BIT5;
Init_CLK();
Adcvolt();
Init_TimerA(); //AD 定时器 时钟初始化
_EINT();
for(;;)
{
}
}
void Init_TimerA(void)
{
// 选择SMCLK,清除TAR
TACTL = TASSEL1 + TACLR;
// 1/8 SMCLK
TACTL += ID1;
TACTL += ID0;
// CCR0 中断允许
CCTL0 = CCIE;
// 时间间隔为 500us
CCR0 = 500;
// 增记数模式
TACTL |= MC0;
return;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00; //将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
}
void Adcvolt(void) //进行电压转换时 ADC12 的初始化
{
ADC12CTL0 &= ~(ENC);
//设置参考电压分别为AVSS和AVCC,输入通道为A0
ADC12MCTL0 = INCH_0 + EOS;
//转换的起始地址为:ADCMEM0
ADC12CTL1 = 0X00;
ADC12CTL1 += CSTARTADD_0;
//采样脉冲由采用定时器产生
ADC12CTL1 += SHP;
//转换模式为:多通道、多次转换
ADC12CTL1 += CONSEQ_1;
//内部时钟源
ADC12CTL1 += ADC12SSEL_0;
//时钟分频为1
ADC12CTL1 += ADC12DIV_0;
ADC12CTL0 += 8 * 0x100;
ADC12CTL0 += MSC;
ADC12CTL0 += ADC12ON;
ADC12IE = 0;
//关闭各个通道的转换中断
//使能ADC转换
ADC12CTL0 |= ENC;
return;
}
// ADC12 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA_ISR(void)
{
int results;
// 关闭转换
ADC12CTL0 &= ~ENC;
// 读出转换结果
results = ADC12MEM0;
ADC_BUF[index] = results;
// 计数器加1
index += 1;
// 采集完40个点
if(index == 40)
{
// 设置标志
nADC_Flag = 1;
// 计数器清0
index = 0;
}
// 开启转换
ADC12CTL0 |= ENC + ADC12SC;
} |