S3C2410的RTC用十进制显示的问题

[复制链接]
3077|19
 楼主| linnaldf 发表于 2008-7-31 11:58 | 显示全部楼层 |阅读模式
程序代码大致如下:<br />INT8U&nbsp;temp;<br />.....<br />//假设rSECONDDAT为秒寄存器,想以十进制显示秒,但是结果错误。<br />temp&nbsp;=&nbsp;(rSECONDDAT&gt&gt4)*10&nbsp;+&nbsp;rSECONDDAT&0x0f;<br />printf(&quot;十进制显示:%d&quot;,temp);<br /><br />//但直接读取以16进制显示是没有问题的<br />temp&nbsp;=&nbsp;rSECONDDAT;<br />printf(&quot;十六进制显示%x&quot;,temp);<br />......<br /><br />例如某时刻秒寄存器为0x32,<br />十进制显示得不到32<br />十六进制显示是32<br /><br />用WINTC作类似的测试,结果也是一样。<br /><br />但是按照逻辑应该是没有问题的<br /><br />如果真要十进制显示:<br />方法如下:<br />INT8U&nbsp;temp,high,low;<br />high&nbsp;=&nbsp;rSECONDDAT&gt&gt4;<br />low&nbsp;&nbsp;=&nbsp;rSECONDDAT&0x0f;<br />temp&nbsp;=&nbsp;high*10&nbsp;+&nbsp;low;<br />printf(&quot;十进制显示:%d&quot;,temp);<br /><br />大家遇到过没有?
twentyone 发表于 2008-7-31 15:33 | 显示全部楼层

你的TEMP定义有问题吧?

试一试定义成UNSIGNED&nbsp;INT,你定义为INT8U,有可能溢出。只是猜测,你试一试。
 楼主| linnaldf 发表于 2008-7-31 15:53 | 显示全部楼层

每种情况我都验证过了,不是溢出问题,RTC寄存器本来就是8

  
dld2 发表于 2008-7-31 15:59 | 显示全部楼层

呵呵,人家本来就是BCD码

  
 楼主| linnaldf 发表于 2008-7-31 16:19 | 显示全部楼层

现在问题不是BCD码,问题在于为什么那样转换有问题?

  
dld2 发表于 2008-7-31 16:34 | 显示全部楼层

(rSECONDDAT>>4)*10 + (rSECONDDAT&0x0f)

加括号
农民讲习所 发表于 2008-7-31 16:53 | 显示全部楼层

(rSECONDDAT>>4)*10 + (rSECONDDAT&0x0f)还有问题

计算过程中,rSECONDDAT有可能变化。<br />要用变量先读出来。
dld2 发表于 2008-7-31 17:00 | 显示全部楼层

确实

  
 楼主| linnaldf 发表于 2008-7-31 18:11 | 显示全部楼层

不可能有变化吧

像这样,你不能说是data变化了吧?用WINTC测试也是一样的<br />unsigned&nbsp;char&nbsp;data,&nbsp;temp;<br /><br />data&nbsp;=&nbsp;0x12;<br /><br />while(data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;(data&gt&gt4)*10&nbsp;+&nbsp;data&0x0f;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;十进制显示:%d&quot;,temp);<br />}
农民讲习所 发表于 2008-7-31 20:37 | 显示全部楼层

:

首先确认一点,你应该使用int型变量,尽量不要使用char.都ARM9了,弄得和8位MCU一样不好。INT和CHAR比,效率高,而且不容易发生数据对齐32位的错误。<br />第二,dld2&nbsp;说了,后面的运算要加括号。要习惯加括号,可以大幅度提高程序的可靠性和观赏性。<br />第三,rSECONDDAT是硬件寄存器的直接映射,受RTC硬件影响,在(rSECONDDAT&gt&gt4)*10&nbsp;+&nbsp;(rSECONDDAT&0x0f)的前半部分,RTC可以将rSECONDDAT变化。你把rSECONDDAT当作变量看待是不对的,两者实际有区别的。<br />
太阳之母 发表于 2008-7-31 22:39 | 显示全部楼层

嘿嘿

根据9楼的反映的情况看,是WINTC里面的BUG吧?<br /><br />
 楼主| linnaldf 发表于 2008-8-1 10:20 | 显示全部楼层

使用int类型变量也是一样的

这不能说是wintc的问题吧?换了VC来测试,问题如果还有,难道是vc有bug???那microsoft还混的下去?<br />呵呵
dld2 发表于 2008-8-1 10:43 | 显示全部楼层

和你说了加括号

运算顺序不一样的。<br /><br />
 楼主| linnaldf 发表于 2008-8-1 14:58 | 显示全部楼层

dld2的方法可行

谢谢dld2,按照你的方法都加上括号就好了!<br />但我怎么看<br />temp&nbsp;=&nbsp;(rSECONDDAT&gt&gt4)*10&nbsp;+&nbsp;rSECONDDAT&0x0f;<br />跟<br />temp&nbsp;=&nbsp;(rSECONDDAT&gt&gt4)*10&nbsp;+(rSECONDDAT&0x0f);&nbsp;<br />按照逻辑都差不多,很难看出区别,要是大型程序中出现这种情况,还真难发现。<br />
太阳之母 发表于 2008-8-5 21:47 | 显示全部楼层

嘿嘿

为什么?<br />不考虑什么可读性,因为编译器根本就不管这个。<br /><br />temp&nbsp;=&nbsp;(rSECONDDAT&gt&gt4)*10&nbsp;+&nbsp;rSECONDDAT&0x0f;<br />跟<br />temp&nbsp;=&nbsp;(rSECONDDAT&gt&gt4)*10&nbsp;+(rSECONDDAT&0x0f);<br /><br />区别在哪儿?从编译器的角度看。&nbsp;
 楼主| linnaldf 发表于 2008-8-24 00:58 | 显示全部楼层

后来做实验,根本原因是发现+的优先级比&高

有时候太相信自己的C语言功底,都把一些细节忽略了
liuwei_ele 发表于 2008-8-27 17:25 | 显示全部楼层

S3C2410的RTC用十进制显示的问题

直接修改rRTCCON,使数据输出格式为十进制不就OK了吗...
 楼主| linnaldf 发表于 2008-8-30 01:29 | 显示全部楼层

回:直接修改rRTCCON,使数据输出格式为十进制不就OK了吗...

&nbsp;&nbsp;&nbsp;rRTCCON能这样设置吗?就这几个设置位:CLKRST&nbsp;CNTSEL&nbsp;CLKSEL&nbsp;RTCEN,只有CNTSEL像一点,但设置1是保留的,0是初始态。<br />&nbsp;&nbsp;&nbsp;能否验证一下?贴贴验证代码?
l0p0c 发表于 2008-8-30 08:56 | 显示全部楼层

这个应该不是什么大的问题,还是需要认真看看!

  
 楼主| linnaldf 发表于 2008-8-30 14:13 | 显示全部楼层

硬件决定了输出格式只有BCD一种吧,怎么能弄个十进制呢

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

70

帖子

1

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