PICC乘法讨论

[复制链接]
3474|10
 楼主| phoenix110 发表于 2008-6-24 11:47 | 显示全部楼层 |阅读模式
我写了一个子程序,编译可以通过,实际计算错误,请大家帮忙看看什么问题?是12位A/D,所以是0x800。错误在这句话上:voltage&nbsp;=&nbsp;data*5000;但是我定义的是长整型,是四个字节,应该不会溢出,但实际每次单步执行到这里就错。我怀疑是PICC的编译器的问题,我用的芯片是PIC18F4523,但是,如果是编译器的问题,我还必须需要他,我该怎么办呢?<br />uint&nbsp;AdOperate(&nbsp;uint&nbsp;data&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;voltage;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;&nbsp;&nbsp;&nbsp;current;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;data&nbsp;&gt&nbsp;0x800&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//*&nbsp;传感器2.5V输出为0,大于2.5V为正,小于2.5V为负;&nbsp;&nbsp;&nbsp;&nbsp;2exp12=4096,2.5V对应0x800&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;data&nbsp;-&nbsp;0x800;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;0x800&nbsp;-&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;voltage&nbsp;=&nbsp;data*5000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;convert&nbsp;mv&nbsp;voltage&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;voltage&nbsp;=voltage/4095;<br />&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;voltage/4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;convert&nbsp;output&nbsp;current&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;current;<br />}
xieyuanbin 发表于 2008-6-24 11:57 | 显示全部楼层

你用12位AD?

0X800是什么概念?<br />8位的一半是0X80,10位的一半是0X200,0X80012位AD?程序有没有输入一个数字仿真过?<br />voltage&nbsp;=voltage/4095应为4096
yewuyi 发表于 2008-6-24 12:00 | 显示全部楼层

current&nbsp;=&nbsp;voltage/4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;convert&nbsp;output&nbsp;current&nbsp;*/
yewuyi 发表于 2008-6-24 12:27 | 显示全部楼层

current = voltage/4;

这个计算本来就有点问题,<br /><br />unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;voltage;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;&nbsp;&nbsp;&nbsp;current;<br />
 楼主| phoenix110 发表于 2008-6-24 13:27 | 显示全部楼层

回复4楼

有问题吗?应该是一个强制转换,在语言书写是不规范,给理解造成歧意。<br />应该是(uint)current&nbsp;=&nbsp;voltage/4;谢谢指教;<br />但错误是这句:voltage&nbsp;=&nbsp;data*5000;&nbsp;
zalin 发表于 2008-6-24 14:48 | 显示全部楼层

voltage = (unsigned long)data*5000;

  
dream2010 发表于 2008-6-24 15:03 | 显示全部楼层

稍微修改下

错误是这句:voltage&nbsp;=&nbsp;data*5000;&nbsp;
 楼主| phoenix110 发表于 2008-6-24 16:01 | 显示全部楼层

没有明白7楼什么意思?

  
 楼主| phoenix110 发表于 2008-6-24 16:10 | 显示全部楼层

回复六楼zalin

zalin说的是正确的,验证通过。但是为什么,我开头定义了是unsigned&nbsp;long类型啊,为什么到时候还需要强制再定义,大家讨论一下?
tdh03z 发表于 2008-6-24 20:00 | 显示全部楼层

data是uint啊,C51也是这样

  
su_mj000 发表于 2008-6-26 04:09 | 显示全部楼层

应使用带符号格式

int&nbsp;AdOperate(&nbsp;uint&nbsp;data&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;voltage;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;current;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;data&nbsp;&gt=&nbsp;0x800&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//*&nbsp;传感器2.5V输出为0,大于2.5V为正,小于2.5V为负;&nbsp;&nbsp;&nbsp;&nbsp;2exp12=4096,2.5V对应0x800&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;data&nbsp;-&nbsp;0x800;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;0x800&nbsp;-&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;voltage&nbsp;=&nbsp;((long)data)*5000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;convert&nbsp;mv&nbsp;voltage&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;voltage&nbsp;=voltage/4095;<br />&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;voltage/4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;convert&nbsp;output&nbsp;current&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;current;<br />}<br /><br />大多数DAC的数据输出是原码格式。用无符号格式会造成数据错误。<br />所以要使用强制转化:voltage&nbsp;=&nbsp;((long)data)*5000;<br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部