MSP430程序,用IAR调试时,为什么调试窗口检测的结果与程序设计不符?真奇怪!

我在定时中断程序中实现软件启动adc12采样转换,中断程序的编写思想是:首先设置ENC和ADC12SC来启动adc采样,然后就是等待,实时判断ADC12IFG3这个转换标... 我在定时中断程序中实现软件启动adc12采样转换,中断程序的编写思想是:首先设置ENC和ADC12SC 来启动adc采样,然后就是等待,实时判断ADC12IFG3这个转换标志位是否为1,当标志位置1时,我认为转换完成,这时读取ADC12MEM3的值并赋给results,具体程序如下:
///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单通道单次采样的程序写法是否正确?
展开
 我来答
cbing2000
2013-12-05 · TA获得超过1275个赞
知道小有建树答主
回答量:990
采纳率:100%
帮助的人:474万
展开全部

写这个程序的思想就是错误的。

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 广告
Linux 嵌入式系统中,USB 启动模式能够烧写 ARM 的 uboot 的原因主要有以下几个方面:1. USB 启动模式相对于传统的 BIOS 启动模式来说,具有更高的兼容性和灵活性,可以支持更多的硬件设备和操作系统。2. USB 启动... 点击进入详情页
本回答由浙江启扬智能科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式