刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器T0中断函数**********/
void t0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?
aa++;
if(aa==18)//这里的意思是中断18次,需要1秒的时间(晶振12MHz),我怎么感觉应该是中断20次用时1秒?
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
----------------问题附在注释里面,请指点一下,看看这个18是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
非自动重装模式一样要考虑中断后CPU响应时间和赋初值的时间,
-------------------------------- 我都说了,定时精确与否是单片机内的定时器与时钟芯片的事,与中断无关。关于非自动重装模式赋初值的时间,不知道你是想说什么。如果是说非自动重装模式的计时是从赋初值开始的,那的确不能忽略赋初值的时间。但是从逻辑上分析一下,就知道,这个很不正确。既然初值都没有赋上,何来的计时开始呢。如果那你想说,下一次的赋初值的时间,那你就多虑了。既然都是非自动重装模式了,那计时的开始和结束,当然是在本次的计时数值之内的啦,干嘛还要费劲用上下次啊。否则用自动重载岂不是更好。
*************************************************************************************
比较,先比较小时,小时匹配再比较分钟,这样比较的次数最少,效率高,最多比较次数也才23+59次而已,
-------------------------------- 这个确实很好
*************************************************************************************
带闹钟的时钟芯片也有,闹钟时间到来以后CPU响应的时间不会超过1S吧?闹钟可是一分钟之内都有效的,忽略
--------------------------------恩,这个也要用到中断吧。否则,闹钟时间到来时,cpu可是正在干别的啊。既然用了中断,那就有相应中断的相应时间误差。与单片机内的定时器同。
*************************************************************************************
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。
--------------------------------不是有说,自动重载是由硬件完成的(貌似老师也是这么讲的)吗,与软件无关吧。如果您说的是自动重载要占用一个1个周期的话(按12M算是1us),那在计时中,我少记一个数不就可以了吗,这个只是算法问题,也与精确性无关啊。若是说,自定重载的时间不定,那就没有办法了,不过好像,无此说法啊
*************************************************************************************
听说过CPU死机,跑飞的,没听过时钟芯片跑飞,死机的(孤陋寡闻了,呵呵),而且时钟芯片的耗电比CPU可是小很多的,特别是在掉电以后
--------------------------------至于这个嘛,我的考虑是,多个器件,就多了一个故障几率,况且也增加了电路面积,还增加了成本。至于耗电嘛,好像我不必考虑吧,我做的是定时开关,又不是电子表,至于掉电就更不必考虑了。省电模式下的方案,我确实不知,还望指教。
这个不用问了啊
我都说了,定时精确与否是单片机内的定时器与时钟芯片的事,与中断无关。关于非自动重装模式赋初值的时间,不知道你是想说什么。如果是说非自动重装模式的计时是从赋初值开始的,那的确不能忽略赋初值的时间。但是从逻辑上分析一下,就知道,这个很不正确。既然初值都没有赋上,何来的计时开始呢。如果那你想说,下一次的赋初值的时间,那你就多虑了。既然都是非自动重装模式了,那计时的开始和结束,当然是在本次的计时数值之内的啦,干嘛还要费劲用上下次啊。否则用自动重载岂不是更好。
-----------------------------------------------------------------------
“如果是说非自动重装模式的计时是从赋初值开始的,那的确不能忽略赋初值的时间。但是从逻辑上分析一下,就知道,这个很不正确。既然初值都没有赋上,何来的计时开始呢。”--------------你忘记了定时器溢出以后初值就是0xff(8位的话),即使当时CPU没有处理,定时器一样在0xff上计数,只要定时器启动了并且有计数脉冲那么定时器就会一直计数。
“既然都是非自动重装模式了,那计时的开始和结束,当然是在本次的计时数值之内的啦”,----------------再好好想想,定时没有溢出之前CPU是不知道的,除非是实现计算好进中断的时间(这个上面已经讨论,时间可能不一样),上面很多人都说了自动重载完全就是硬件操作,不存在累积误差。
“恩,这个也要用到中断吧。否则,闹钟时间到来时,cpu可是正在干别的啊。既然用了中断,那就有相应中断的相应时间误差。与单片机内的定时器同。 ”---------------中断处理时间对于闹钟时间来说实在是微乎其微了,假设在12:00闹钟时间到,即使CPU是在12:00:01才处理,相信你也不会在意。
*************************************************************************************
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。
--------------------------------不是有说,自动重载是由硬件完成的(貌似老师也是这么讲的)吗,与软件无关吧。如果您说的是自动重载要占用一个1个周期的话(按12M算是1us),那在计时中,我少记一个数不就可以了吗,这个只是算法问题,也与精确性无关啊。若是说,自定重载的时间不定,那就没有办法了,不过好像,无此说法啊
-----------------------------
你忘记了1~4个周期的误差是用定时器的,看看你在上面说的“单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。”
回复【41楼】zgxbcf
明显是始终芯片定时精确啊
这个不用问了啊
-----------------------------------------------------------------------
在晶振精度一样的情况下,用时钟芯片与定时器精度一样
一周热门 更多>