打印

【我重开帖子,回答aolin的】用51做实时时钟,可以吗?

[复制链接]
2099|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
车载音响|  楼主 | 2007-7-25 17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
------------aolin源贴:不要外加时钟芯片,只用标准51和12MHz的晶体,有没有人做成过电子钟?不能有误差的,即不能有算法上带来的误差, 时钟振荡频率不准所引起的误差不计.有朋友实现过吗?------------

楼主是做汽车音响,实时时钟只是MCU的一个副业,主要功能还是收音、CD或者DVD等控制,由于已经有了MCU,所以RTC太浪费。至于功耗这里不讨论,实际上用51的肯定不是做高端汽车音响的。

有些人会选择双时钟的MCU(比如主晶振4M,副振32.768K),但是多一个晶振就多0.4RMB,对于一些吝啬鬼还是不能接收,用单晶振。

对于单晶振做实时时钟,最简单的算法是不重装,不要置初值,因为是全硬件操作,不会引起算法误差。

有的人会说这样得不到标准1S时间,其实对于汽车音响来说1S到底是999ms还是999999us还是1010ms其实问题倒是不大,看不出来。aolin的回帖中很多人就在关注1S要准时,其实大可不必。

但是如果别人用同样的晶振走1个月误差2分钟,而你是误差1小时的话就绝对不一样了。

只要你有装定时器动作,对于51来说就会引起误差,中断需要时间,置初值需要时间。针对置初值的做法可能会有以下几种问题:
1、不考虑置初值的时间和可能发生的中断处理需要的时间。
2、考虑置初值的时间,但是没有考虑可能发生的中断处理需要的时间。
【27楼: 这个很简单的... 把重装载时的指令算进去或者用个合适的重装值,比如:0X2000,显然TL0就不用管它了,还有其它方法... 】
3、考虑置初值的时间,置初值的时候,先读取初值(因为定时器溢出后,会自动从0开始重新走),但是还会存在比较的时候发生外部中断的情况,尤其使用keilc的情况。

以上回答不知道大家有没有不同看法,欢迎讨论!

相关帖子

沙发
车载音响|  楼主 | 2007-7-25 17:58 | 只看该作者

在补充几点

1、有些人会说在读定时器中断中关闭中断允许,但是这样回导致遥控器不灵。
2、其实如果把晶振换成4.194304M晶振,就可以得到1S时间了。

使用特权

评论回复
板凳
naofei67| | 2007-7-25 21:32 | 只看该作者

51不论是C还是汇编,都可以轻易校正此定时误差

"导致遥控器不灵" 也不会发生.

使用特权

评论回复
地板
ayb_ice| | 2007-7-26 07:55 | 只看该作者

这有何难.根本不用关中断,保证没有任何人为误差...

使用特权

评论回复
5
农民讲习所| | 2007-7-26 08:35 | 只看该作者

俺的培训教材就有实现的代码。

使用特权

评论回复
6
aolin| | 2007-7-26 09:00 | 只看该作者

回答得够专业,详细了,100分!

分析得很有道理,基本上每帖涉及的问题都分析了一遍,看得出楼主确实很专业!
我用51不是做车载音响的,51也登不了车载这个大雅之堂,只能做家用音响.

使用特权

评论回复
7
xwj| | 2007-7-26 10:48 | 只看该作者

针对这个问题,去看我特意整理的模板吧

为了避免产生任何误差,重载初值时有15周期关闭中断,
这么小的时间,"导致遥控器不灵" 的情况肯定是不会发生的,否则就是程序写法有问题了.

再就是设置一个巧妙的晶振频率和重载值,如ayb_ice 所说方法,也是可以避免误差的:
 ayb_ice 发表于 2007-7-26 07:44 侃单片机 ←返回版面   

47楼: 建议大家去分析RTX51 TINY的系统定时器中断...

另外配合RTX51 TINY的os_wait2(K_IVL, ticks),如果你搞明白了什么叫K_IVL就差不多了...
51的232通信为什么喜欢用11.0592MHZ的晶振....
就拿标准的51 12M晶振做RTC,这东东只用一个中断T0中断绝对可以搞定,51的中断响应时间在3~9个周期,如果10MS中断一次T0的初值是65536-10000 = 0xD8F0
在中断中可以这样送初值ORL TL0,#0F0; MOV TH0,#0D8H,这样只要中断响应小于16个周期不会产生任何误差...
方法很多这里不一一列举...

相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=2614699&tp=%u8F6F%u4EF6%u65E0%u7D2F%u79EF%u8BEF%u5DEE%u7684%u5B9A%u65F6%u4E2D%u65AD%u7A0B%u5E8F%u6A21%u677F%uFF0C%u4F9B%u521D%u5B66%u8005%u5B66%u4E60%u548C%u884C%u5BB6%u62CD%u7816

使用特权

评论回复
8
gyt| | 2007-7-26 18:05 | 只看该作者

支持LS的xwj大虾

使用特权

评论回复
9
fsaok| | 2007-7-26 21:53 | 只看该作者

不过如此

...

呵呵

使用特权

评论回复
10
车载音响|  楼主 | 2007-7-27 08:52 | 只看该作者

re:7楼

为了避免产生任何误差,重载初值时有15周期关闭中断,
这么小的时间,"导致遥控器不灵" 的情况肯定是不会发生的,否则就是程序写法有问题了.

既然有15个周期关闭中断,就可能存在软件设计上的问题。如果有小于15us的脉冲中断信号,将无法触发,是把。
至于遥控器,只是使用外部中断的一个例子。

使用特权

评论回复
11
车载音响|  楼主 | 2007-7-27 08:55 | 只看该作者

re:7楼引用 ayb_ice

在中断中可以这样送初值ORL TL0,#0F0; MOV TH0,#0D8H,这样只要中断响应小于16个周期不会产生任何误差...
如果在T0中断中,发生外部中断,而且外部中断优先级比T0中断高,调用了外部中断后会大于16个周期把????这个又是如何解决。

使用特权

评论回复
12
xwj| | 2007-7-27 09:02 | 只看该作者

Re 10楼:边沿触发时硬件置标志的,你就算100uS再得到中断条

也能进入中断的,只是进入的时机不是实时的,存在误差罢了

就算没有任何打扰,一触发就进中断,也还是要等待原来指令运行完,要保存现场的,还是需要延迟一点时间才会运行你的实际中断程序的,所以设计程序时本来就该考虑到这些影响

使用特权

评论回复
13
xwj| | 2007-7-27 09:19 | 只看该作者

Re 11楼:对于aolin源贴强调的前提,保证T0中断的优先级时必

另一种办法就是用前后台系统,中断只重载初值、置标志,由系统循环去查询标志、计算、处理等,以让出更多的时间给其他的中断;


而对于OS系统、是不是标准的NmS,意义并不大哦,根本就不必在意这个问题

使用特权

评论回复
14
车载音响|  楼主 | 2007-7-27 17:32 | 只看该作者

re:12楼,我指的是15us的脉冲,整个脉冲宽度15us

如果15us来时刚好关闭中断,15us过时刚好开启中断,这个脉冲能发生中断吗?

使用特权

评论回复
15
车载音响|  楼主 | 2007-7-27 17:34 | 只看该作者

T0中断如果优先级高且频率高,可能会导致通讯异常的啊

当然,我指的通讯一般不会是uart这类通讯

使用特权

评论回复
16
cbbs| | 2007-7-27 18:42 | 只看该作者

re

 re:12楼,我指的是15us的脉冲,整个脉冲宽度15us 

如果15us来时刚好关闭中断,15us过时刚好开启中断,这个脉冲能发生中断吗?
 
 
==================================
只要中断没有被响应,那中断标志位就不会被自动清零,当重新开放中断时,那么已置位的中断标志位就会请求进入中断服务。

但是当一次中断没有被及时响应时,第二次中断又到来了,那么第一次的中断将被丢弃。

使用特权

评论回复
17
sio4| | 2007-7-28 08:14 | 只看该作者

一般除了系统复位可以关闭中断,一般是不允许关闭中断的

使用特权

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

本版积分规则

15

主题

120

帖子

0

粉丝