打印

求助高手用单片机做的时钟,如何减少程序本身累积误差

[复制链接]
楼主: 电子三极管
手机看帖
扫描二维码
随时随地手机跟帖
21
maychang| | 2010-1-19 16:50 | 只看该作者 回帖奖励 |倒序浏览
除了两人,其它都是不知所云。

使用特权

评论回复
22
zhaohua5269| | 2010-1-19 16:56 | 只看该作者
好复杂哦……

使用特权

评论回复
23
HWM| | 2010-1-19 18:00 | 只看该作者
不要折腾了,现在的红绿灯控制器都要求具备通绿带功能,这就必然要求每个分机都是互联互通的,单机版的红绿灯控制器几乎不可能中标。

呵呵,即使自动重载,晶体本身的误差也无法消除,依然有累计误差,依然是不符合 ...
yewuyi 发表于 2010-1-19 16:35

采用网络统一时标,此类问题迎刃而解。

使用特权

评论回复
24
gx_huang| | 2010-1-19 18:11 | 只看该作者
除了3人,其它都不知所云!
既然是51的8位自动重新装载,怎么会有软件误差呢?怎么有中断时间问题呢?
严重怀疑不知所云的人有没有仔细看数据手册,有没有做过项目?

再次说明:51的8位自动装载没有任何软件方面的误差!

使用特权

评论回复
25
DONGXU| | 2010-1-19 19:52 | 只看该作者
误差不是程序造成的,是晶体的原因,要靠其他方法解决

使用特权

评论回复
26
peigang| | 2010-1-19 20:02 | 只看该作者
比较同上

使用特权

评论回复
27
一级菜鸟| | 2010-1-19 20:59 | 只看该作者
15# 一级菜鸟  
自动重装会有误差,不是吧,个人感觉那纯粹是靠硬件来完成的,你说响应中断有误差我还相信
5880527 发表于 2010-1-19 15:09


的确纯粹靠硬件来完成,但是运行不同指令时具有不通的硬件响应中断时间,也就是说:
1、自动重载是靠TF=1来触发的
2、在执行NOP等单机器周期指令时与执行LCALL等多机器周期指令时发生定时器溢出,TF=1的响应时间是不一样的。
3、相邻两个TF=1的时间既然不固定,相邻两次自动重载产生的定时周期就不固定,如何保证无误差?

看明白了么?

使用特权

评论回复
28
HWM| | 2010-1-19 21:10 | 只看该作者
TF是直接由计数器溢出触发,和指令有何关系?
自动重载由硬件自己完成,和中断响应又有何关系?

使用特权

评论回复
29
一级菜鸟| | 2010-1-19 21:14 | 只看该作者
TF是直接由计数器溢出触发,和指令有何关系?
自动重载由硬件自己完成,和中断响应又有何关系?
HWM 发表于 2010-1-19 21:10


重新看过结构,自动重载确实由计数器自行触发,与指令无关,这个你是对的,之前争论过的是软件重装中断,脑子浆糊了。

使用特权

评论回复
30
李冬发| | 2010-1-19 22:30 | 只看该作者
现代版的51手册还真的很浆糊。

使用特权

评论回复
31
yxwsz| | 2010-1-19 23:07 | 只看该作者
如果真正要减小误差,并且所有设备全部同步,建议使用一个GPS模块,GPS模块上有一个秒信号输出和时间输出,用这个作为时间基准源,所有的设备都可以做到精确同步。

使用特权

评论回复
32
电子三极管|  楼主 | 2010-1-20 08:02 | 只看该作者
用51的话 用11.0592  重载高位 不重载地位即可 那我该怎么去重载地位呢 16# 因特网用户

使用特权

评论回复
33
电子三极管|  楼主 | 2010-1-20 15:22 | 只看该作者
整数频率晶振分频后输入中断,在中断内开计数器。  整数频率晶振分频后输入中断(整数频率是指12M的晶振吗 我现在改11.0592M了 我的几个倒计时显示牌还是参差不齐的在跑) 17# 一级菜鸟

使用特权

评论回复
34
DONGXU| | 2010-1-20 21:32 | 只看该作者
用12M晶体和11.0592晶体对误差不会有影响,倒计时器不会有累计误差的.人眼能看出有显示误差肯定有问题,正常情况显示的数字很一致,肯本看不出有误差,不过几十ms的误差已经符合相关标准的要求了.

使用特权

评论回复
35
电子三极管|  楼主 | 2010-1-21 09:38 | 只看该作者
自动重载是这样吗?

void t5ms() interrupt 3 using 1  //定时器1产生的5ms定时中断
{
    TH1 = (65535 - 1738)/256;     //5MS中断程序初始化
    TL1 = (65535 - 1738)%256;   
    Time5ms ++;
//时钟调整
   if(Time5ms>=199)
   { //1S到
       Time5ms = 0;

使用特权

评论回复
36
mxh0506| | 2010-1-21 10:42 | 只看该作者
看了这么多回复, 感觉有问题还是要先自己做点功课再来提问,否则很容易被误导啊.:)
19,20楼的是高手, 听他们的没错.

使用特权

评论回复
37
river1972| | 2010-1-21 12:15 | 只看该作者
其实仔细分析一下自动重载的定义就会明白,从事件触发到装载成功到再次running是需要时间,也许你会说你的速度够快,但是累计误差是很大的。
自己去做一个试验就知道,
一个就是32768hz的频率来运行(够慢吧)带RTC(2Hz)中断的程序,和你们所谓的自动重载,运行一个月看看误差就知道了。
动手总比想象要好

使用特权

评论回复
38
84335262| | 2010-1-30 16:46 | 只看该作者
37# river1972
要长久的算下去,不联机校准谁搞的定啊?

使用特权

评论回复
39
一芯一意| | 2010-7-1 22:03 | 只看该作者
挺不错的嘛。都把项目搞到手了。我昨晚看到你的帖子之后自己也做一个程序。开始用11.0592MH的晶振,结果误差挺大的:十分钟就相关几秒。后来换了个12M的晶振,误差就小了,所以怀疑之前的晶振有问题。但是现在这个还是有让人不可接受的误差:一个小时要快将近一秒。一天就差不多20秒,累积下来一个月就是半小时,一年下来就是6小时,那还叫时钟么,不可接受,还得虚心请教各位。
注:我用的是定时器0方式2自动重装方式。中断里面没有多余的语句。

n++;
if(n>=4000)
{n=0;sec++;}

32# 电子三极管

使用特权

评论回复
40
tcc8073| | 2010-7-2 12:35 | 只看该作者
讨论永远不会出结果,时间误差永远都会存在,不管以什么样的方式处理,不管以什么做标准,问题是你做的产品要求的精度是多少,在一定范围内满足要求就可以了,原子钟还有误差呢.

使用特权

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

本版积分规则