打印

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

[复制链接]
2068|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linnaldf|  楼主 | 2008-7-31 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序代码大致如下:
INT8U temp;
.....
//假设rSECONDDAT为秒寄存器,想以十进制显示秒,但是结果错误。
temp = (rSECONDDAT>>4)*10 + rSECONDDAT&0x0f;
printf("十进制显示:%d",temp);

//但直接读取以16进制显示是没有问题的
temp = rSECONDDAT;
printf("十六进制显示%x",temp);
......

例如某时刻秒寄存器为0x32,
十进制显示得不到32
十六进制显示是32

用WINTC作类似的测试,结果也是一样。

但是按照逻辑应该是没有问题的

如果真要十进制显示:
方法如下:
INT8U temp,high,low;
high = rSECONDDAT>>4;
low  = rSECONDDAT&0x0f;
temp = high*10 + low;
printf("十进制显示:%d",temp);

大家遇到过没有?

相关帖子

沙发
twentyone| | 2008-7-31 15:33 | 只看该作者

你的TEMP定义有问题吧?

试一试定义成UNSIGNED INT,你定义为INT8U,有可能溢出。只是猜测,你试一试。

使用特权

评论回复
板凳
linnaldf|  楼主 | 2008-7-31 15:53 | 只看该作者

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

使用特权

评论回复
地板
dld2| | 2008-7-31 15:59 | 只看该作者

呵呵,人家本来就是BCD码

使用特权

评论回复
5
linnaldf|  楼主 | 2008-7-31 16:19 | 只看该作者

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

使用特权

评论回复
6
dld2| | 2008-7-31 16:34 | 只看该作者

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

加括号

使用特权

评论回复
7
农民讲习所| | 2008-7-31 16:53 | 只看该作者

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

计算过程中,rSECONDDAT有可能变化。
要用变量先读出来。

使用特权

评论回复
8
dld2| | 2008-7-31 17:00 | 只看该作者

确实

使用特权

评论回复
9
linnaldf|  楼主 | 2008-7-31 18:11 | 只看该作者

不可能有变化吧

像这样,你不能说是data变化了吧?用WINTC测试也是一样的
unsigned char data, temp;

data = 0x12;

while(data)
{
    temp = (data>>4)*10 + data&0x0f;
    printf("十进制显示:%d",temp);
}

使用特权

评论回复
10
农民讲习所| | 2008-7-31 20:37 | 只看该作者

:

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

使用特权

评论回复
11
太阳之母| | 2008-7-31 22:39 | 只看该作者

嘿嘿

根据9楼的反映的情况看,是WINTC里面的BUG吧?

使用特权

评论回复
12
linnaldf|  楼主 | 2008-8-1 10:20 | 只看该作者

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

这不能说是wintc的问题吧?换了VC来测试,问题如果还有,难道是vc有bug???那microsoft还混的下去?
呵呵

使用特权

评论回复
13
dld2| | 2008-8-1 10:43 | 只看该作者

和你说了加括号

运算顺序不一样的。

使用特权

评论回复
14
linnaldf|  楼主 | 2008-8-1 14:58 | 只看该作者

dld2的方法可行

谢谢dld2,按照你的方法都加上括号就好了!
但我怎么看
temp = (rSECONDDAT>>4)*10 + rSECONDDAT&0x0f;

temp = (rSECONDDAT>>4)*10 +(rSECONDDAT&0x0f); 
按照逻辑都差不多,很难看出区别,要是大型程序中出现这种情况,还真难发现。

使用特权

评论回复
15
太阳之母| | 2008-8-5 21:47 | 只看该作者

嘿嘿

为什么?
不考虑什么可读性,因为编译器根本就不管这个。

temp = (rSECONDDAT>>4)*10 + rSECONDDAT&0x0f;

temp = (rSECONDDAT>>4)*10 +(rSECONDDAT&0x0f);

区别在哪儿?从编译器的角度看。 

使用特权

评论回复
16
linnaldf|  楼主 | 2008-8-24 00:58 | 只看该作者

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

有时候太相信自己的C语言功底,都把一些细节忽略了

使用特权

评论回复
17
liuwei_ele| | 2008-8-27 17:25 | 只看该作者

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

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

使用特权

评论回复
18
linnaldf|  楼主 | 2008-8-30 01:29 | 只看该作者

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

   rRTCCON能这样设置吗?就这几个设置位:CLKRST CNTSEL CLKSEL RTCEN,只有CNTSEL像一点,但设置1是保留的,0是初始态。
   能否验证一下?贴贴验证代码?

使用特权

评论回复
19
l0p0c| | 2008-8-30 08:56 | 只看该作者

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

使用特权

评论回复
20
linnaldf|  楼主 | 2008-8-30 14:13 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

70

帖子

1

粉丝