MSP430程序,用IAR调试时,为什么调试窗口检测的结果与程序设计不符?真奇怪!
///interrupt [TIMERA0_VECTOR] voidTimerA_ISR(void)
#pragmavector=TIMERA0_VECTOR
__interrupt voidTimerA_ISR(void)
{
_DINT(); //disablethe interrupt
ADC12CTL0|= ENC+ADC12SC; //软件启动adc12
do
{
_NOP();
} //等待adc模数转换完成,若转换完成
//ADC12IFG3将被置位
while(ADC12IFG&BIT3==0);
results =ADC12MEM3; //若ADC12IFG3=1,读取ADC12MEM3数值并赋给中间变量results
ADC12CTL0&= ~ENC; //disable convert
_EINT(); //enable theinterrupt
}
在调试中,发现watch窗口中的中间变量results值并不等于 ADC12MEM3的值,而是等于上一次中断时ADC12MEM3的值(举例说明:第一次中断时 ADC12MEM3 =0x256,results=0,第二次中断时 ADC12MEM3 =0x512, results= 0x256 ),请问这是为什么?另外,我这种启动ADC12单通道单次采样的程序写法是否正确? 展开
写这个程序的思想就是错误的。
1)中断函数里长时间等待。这个会造成别的中断事件无法得到及时响应。如果就这么一件任务也就罢了,如果还要处理别的任务,这个就是在浪费生命。
2)你的用意是定时中断,间隔一段时间就去采样一次。你知道这个脉冲采样模式就是干这个得吗?
3) 我没看到你的ADC12初始化代码,不知道你的单通道单次设置是否正确。但是,从你的结果来看应该是错误的。因为单通道单次在执行一次转换后会自动停止,不会出现你说的“发现watch窗口中的中间变量results值并不等于 ADC12MEM3的值,而是等于上一次中断时ADC12MEM3的值(举例说明:第一次中断时 ADC12MEM3 =0x256,results=0,第二次中断时 ADC12MEM3 =0x512, results= 0x256 ),”
4)如果你设置的不是单通道单次,我再推测出现这个问题的原因是:你在单步调试你的代码,但是你要知道AD内核是不会“单步”的,它的ADC12CLK仍在全速运行,也就是说在你单步调试第一个结果的时候,AD已经转换了好几次了,所以基本可以推定你这时候ADC12MEM已经溢出好几次了,你可以去看溢出标志位来check我的猜测。
5)AD采样赋值最好在ADC12的中断服务程序内,这样你主程序可以睡眠进入LPMx,另外有别的突发事件,也可以让CPU及时的响应处理。
2023-06-12 广告