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

[复制链接]
10445|43
maychang 发表于 2010-1-19 16:50 | 显示全部楼层
除了两人,其它都是不知所云。
zhaohua5269 发表于 2010-1-19 16:56 | 显示全部楼层
好复杂哦……
HWM 发表于 2010-1-19 18:00 | 显示全部楼层
不要折腾了,现在的红绿灯控制器都要求具备通绿带功能,这就必然要求每个分机都是互联互通的,单机版的红绿灯控制器几乎不可能中标。

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

采用网络统一时标,此类问题迎刃而解。
gx_huang 发表于 2010-1-19 18:11 | 显示全部楼层
除了3人,其它都不知所云!
既然是51的8位自动重新装载,怎么会有软件误差呢?怎么有中断时间问题呢?
严重怀疑不知所云的人有没有仔细看数据手册,有没有做过项目?

再次说明:51的8位自动装载没有任何软件方面的误差!
DONGXU 发表于 2010-1-19 19:52 | 显示全部楼层
误差不是程序造成的,是晶体的原因,要靠其他方法解决
peigang 发表于 2010-1-19 20:02 | 显示全部楼层
比较同上
一级菜鸟 发表于 2010-1-19 20:59 | 显示全部楼层
15# 一级菜鸟  
自动重装会有误差,不是吧,个人感觉那纯粹是靠硬件来完成的,你说响应中断有误差我还相信
5880527 发表于 2010-1-19 15:09


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

看明白了么?
HWM 发表于 2010-1-19 21:10 | 显示全部楼层
TF是直接由计数器溢出触发,和指令有何关系?
自动重载由硬件自己完成,和中断响应又有何关系?
一级菜鸟 发表于 2010-1-19 21:14 | 显示全部楼层
TF是直接由计数器溢出触发,和指令有何关系?
自动重载由硬件自己完成,和中断响应又有何关系?
HWM 发表于 2010-1-19 21:10


重新看过结构,自动重载确实由计数器自行触发,与指令无关,这个你是对的,之前争论过的是软件重装中断,脑子浆糊了。
李冬发 发表于 2010-1-19 22:30 | 显示全部楼层
现代版的51手册还真的很浆糊。
yxwsz 发表于 2010-1-19 23:07 | 显示全部楼层
如果真正要减小误差,并且所有设备全部同步,建议使用一个GPS模块,GPS模块上有一个秒信号输出和时间输出,用这个作为时间基准源,所有的设备都可以做到精确同步。
 楼主| 电子三极管 发表于 2010-1-20 08:02 | 显示全部楼层
用51的话 用11.0592  重载高位 不重载地位即可 那我该怎么去重载地位呢 16# 因特网用户
 楼主| 电子三极管 发表于 2010-1-20 15:22 | 显示全部楼层
整数频率晶振分频后输入中断,在中断内开计数器。  整数频率晶振分频后输入中断(整数频率是指12M的晶振吗 我现在改11.0592M了 我的几个倒计时显示牌还是参差不齐的在跑) 17# 一级菜鸟
DONGXU 发表于 2010-1-20 21:32 | 显示全部楼层
用12M晶体和11.0592晶体对误差不会有影响,倒计时器不会有累计误差的.人眼能看出有显示误差肯定有问题,正常情况显示的数字很一致,肯本看不出有误差,不过几十ms的误差已经符合相关标准的要求了.
 楼主| 电子三极管 发表于 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;
mxh0506 发表于 2010-1-21 10:42 | 显示全部楼层
看了这么多回复, 感觉有问题还是要先自己做点功课再来提问,否则很容易被误导啊.:)
19,20楼的是高手, 听他们的没错.
river1972 发表于 2010-1-21 12:15 | 显示全部楼层
其实仔细分析一下自动重载的定义就会明白,从事件触发到装载成功到再次running是需要时间,也许你会说你的速度够快,但是累计误差是很大的。
自己去做一个试验就知道,
一个就是32768hz的频率来运行(够慢吧)带RTC(2Hz)中断的程序,和你们所谓的自动重载,运行一个月看看误差就知道了。
动手总比想象要好
84335262 发表于 2010-1-30 16:46 | 显示全部楼层
37# river1972
要长久的算下去,不联机校准谁搞的定啊?
一芯一意 发表于 2010-7-1 22:03 | 显示全部楼层
挺不错的嘛。都把项目搞到手了。我昨晚看到你的帖子之后自己也做一个程序。开始用11.0592MH的晶振,结果误差挺大的:十分钟就相关几秒。后来换了个12M的晶振,误差就小了,所以怀疑之前的晶振有问题。但是现在这个还是有让人不可接受的误差:一个小时要快将近一秒。一天就差不多20秒,累积下来一个月就是半小时,一年下来就是6小时,那还叫时钟么,不可接受,还得虚心请教各位。
注:我用的是定时器0方式2自动重装方式。中断里面没有多余的语句。

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

32# 电子三极管
tcc8073 发表于 2010-7-2 12:35 | 显示全部楼层
讨论永远不会出结果,时间误差永远都会存在,不管以什么样的方式处理,不管以什么做标准,问题是你做的产品要求的精度是多少,在一定范围内满足要求就可以了,原子钟还有误差呢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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