xunke 发表于 2014-3-14 15:00:00

请教! MSP430在IAR定义整型变量int的运算结果怎么出错?

本帖最后由 xunke 于 2014-3-14 15:05 编辑

请高手帮忙看一下,T若定义成int结果就出错、结果总是为FFXX、高8位错了、低8位是对的,如果定义成char 结果就没错了,不知那里问题?下面程序在IAR5调试是通过。
//环境:IAR5.6、launchpad ,,MCU:MSP430G2231,系统时钟:VLO
//功能:读取MCU内部温度传感器,并且温度值用十进制表示。

#include "msp430g2231.h"
int T;
void ADC10_temp()
{
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;
}

//==================
main()
{
WDTCTL = WDTPW + WDTHOLD;
//系统时钟选VLO
BCSCTL3 = LFXT1S_2;
while( IFG1 & OFIFG ){ IFG1 &= ~OFIFG; }
BCSCTL2 = SELM_3 + DIVM_0;

ADC10_temp();
while(1);
}

weihei 发表于 2014-3-14 15:11:35

我会选择这么写。
T = ADC10MEM;
T = T*423/1024 - 278;

IAR有时候优化的时候,这种语句会出问题。我还遇过移位操作也出问题的(a=(b<<8)+xx)格式。原因不详。坐等高手解释。

xunke 发表于 2014-3-16 23:43:43

weihei 发表于 2014-3-14 15:11
我会选择这么写。
T = ADC10MEM;
T = T*423/1024 - 278;


你好,我调试了,你的方法也行不通,真奇怪,反正T 定义为int结果就错了、char就正确。

咖啡可乐 发表于 2014-3-17 00:28:03

运算后变成负值了吧

xunke 发表于 2014-3-17 09:20:38

咖啡可乐 发表于 2014-3-17 00:28
运算后变成负值了吧

是的,怎么回事?请指教!

sunyaqi 发表于 2014-3-17 09:58:08

数据溢出了
16位系统中一个int能存储的数据的范围为-32768~32767
ADC10MEM*423没有超出in范围?

zhugean 发表于 2014-3-18 11:07:17

改成
T = ADC10MEM*423L/1024 - 278;

as9901 发表于 2014-3-18 12:52:14

T = ADC10MEM*423/1024 - 278;
注意这里

xunke 发表于 2014-3-18 22:41:00

sunyaqi 发表于 2014-3-17 09:58
数据溢出了
16位系统中一个int能存储的数据的范围为-32768~32767
ADC10MEM*423没有超出in范围? ...

你好!你说的对。
ADC10MEM*423 这个对于int来说是溢出了,我以为ADC10MEM*423/1024这个是不会溢出的。

xunke 发表于 2014-3-18 22:41:38

zhugean 发表于 2014-3-18 11:07
改成
T = ADC10MEM*423L/1024 - 278;

谢谢各位高手的指教!
页: [1]
查看完整版本: 请教! MSP430在IAR定义整型变量int的运算结果怎么出错?