请教!
程序一如下:
//环境:IAR5.6、launchpad ,,MCU:MSP430G2231,系统时钟:VLO
//功能:读取MCU内部温度传感器,并且温度值用十进制表示。
#include "msp430g2231.h"
char ADC10_TEMP( )
{ char T;
ADC10CTL0 = SREF_1 + REFON + ADC10SR + ADC10ON;
ADC10CTL1 = INCH_10 + ADC10SSEL_1 + CONSEQ_0;
ADC10CTL0 |= ENC + ADC10SC;
while( ADC10CTL1&ADC10BUSY );
ADC10CTL0 &= ~ADC10IFG;
//T = 1500mV*TEMP/1024/3.55 – 986/3.55
T = ADC10MEM*423/1024 – 278;
return( T );
}
char T;
main()
{ WDTCTL = WDTPW + WDTHOLD;
BCSCTL3 = LFXT1S_2;
while( IFG1&OFIFG ){ IFG1 &= ~OFIFG; }
BCSCTL2 = SELM_3 + DIVM_0;
while(1)
{ T = ADC10_TEMP(); LPM3; }
}
程序二如下:
//环境:IAR5.6、launchpad ,,MCU:MSP430G2231,系统时钟:VLO
//功能:读取MCU内部温度传感器,并且温度值用十进制表示。
#include "msp430g2231.h"
int ADC10_temp()
{
int T;
ADC10CTL0 = SREF_1 + REFON + ADC10SR + ADC10ON;
ADC10CTL1 = INCH_10 + ADC10SSEL_1 + CONSEQ_0;
ADC10CTL0 |= ENC + ADC10SC;
while( ADC10CTL1& ADC10BUSY );
ADC10CTL0 &= ~ADC10IFG;
T = ADC10MEM*423/1024 – 278; return(T);}
int T;
main()
{ WDTCTL = WDTPW + WDTHOLD;
//系统时钟选VLO
BCSCTL3 = LFXT1S_2;
while( IFG1 & OFIFG ){ IFG1 &= ~OFIFG; }
BCSCTL2 = SELM_3 + DIVM_0;
T = ADC10_temp(); while(1);
}
以上程序一和程序二是基本是一样的,就是T的类型不同,程序一结果正确,但是程序二的结果是错误的,是什么原因呢?
Bruce Wei:
楼主你好!
T = (int)(ADC10MEM*423/1024 – 278); 这个和第一个程序不一样,楼主可以自己调试下找下原因。
user1223687:
回复 Bruce Wei:
我调试过了,把“T = (int)(ADC10MEM*423/1024 – 278);”改成一样的话,程序二的结果还是有错。
kooking:
能想到的就是char表示int时越界了
Ken Wang:
回复 user1223687:
Hi Xunke,
方便的话,能不能在线调试的时候设个断点,看下寄存器ADC10MEM的具体数字是多少?然后再具体计算一下,ADC10MEM*423/1024-278的结果是多少?
另外还有一个小建议,如果是做除法运算的话,还是建议使用向右移位的语句会来得计算效率和速度更好一些。即:T= (ADC10MEM * 423)<< 10;
谢谢
ken
user1223687:
回复 Ken Wang:
你好
“(ADC10MEM * 423)<< 10” 有误吧,应该是((ADC10MEM * 423)>>10 ) – 278;
Ken Wang:
回复 user1223687:
Hi xunke,
不好意思,是我打错了。给你造成误解了。
谢谢
ken
user1223687:
回复 Ken Wang:
没事,人非圣贤!
我调试了,程序一和程序二的ADC10MEM都一样的、都是正确的,就是T的类型不一样,T的结果就不一样。
user1223687:
回复 Ken Wang:
是不是IAR C不支持int运算?
zc:
建议先把全局变量T和局部变量T 改为不同的变量名!再debug看一下
user1223687:
回复 zc:
改成不同名,结果还是不对,只要是int 型的,结果就不对了、结果就是 FFxx、高8位是错的、低8位是对了。