此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处
msp430单片机开发实录(13)
现象:
我们的产品用到AD转换的时候,一般是定期开启AD转换,获取AD转换的值,采用的是查询方式,不用AD转换中断。一般在从AD转换结果寄存器中取出AD值之前,要先判断AD转换的状态,也就是判断AD转换是否完成,因为只有转换完成,才能取出正确的AD值,一般情况下都会判断AD转换的忙状态,我一般用下面的语句。
- while (ADC10CTL1 & ADC10BUSY) ;
复制代码
但是今天再看几年前我写的一个程序时,忽然发现,我在那个程序里面用了下面的语句
- while(!(ADC10IFG & ADC10IFG0))
复制代码
目前这两种语句在不同的产品中都用了,并且都已经大批量出货了,没有发现AD转换不准确的问题。那么这两种语句到底有没有区别呢?
试验:
看上面两个语句,第一条语句是判断AD转换的状态是出于“忙”还是“空闲状态”,这个很容易理解,在“忙”的时候,说明正在进行AD转换,所以要等“空闲”的时候,AD转换结果寄存器里面的值才是正确的结果。
而第二条语句用的是判断中断标志,前面我已经说了,我的AD转换是定期开启转换,查询方式,不用中断。那么这里用判断中断标志的方式合适吗?
原来,在430单片机中,有中断功能的模块,一旦启用了这个功能,那么不管我们是否开启了中断使能,只要这个功能产生的条件满足,都会产生一个中断标志,所以这里使用判断中断标志的方法是没问题的,并且这个中断标志是硬件自动清除的。
验证:
分别采用“忙”标志位检测和中断标志判断的方式进行AD转换,反复多次测试,都能够正确获得AD转换结果。
备注:
msp430单片机的中断标志是只要满足相应条件就会产生,跟有没有开启相关中断使能无关,并且这个标志硬件自动清除,程序里面不用处理。