精确定时是用单片机内的定时器好还是时钟芯片好

2020-02-05 08:53发布

刚看了一个帖子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是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
76条回答
zhxzhx
1楼-- · 2020-02-13 07:31
 精彩回答 2  元偷偷看……
millwood0
2楼-- · 2020-02-13 10:36
"可能在你做TL1 += 0x04;的时候TL1又加了1了"

google atomicity.
easywater
3楼-- · 2020-02-13 12:35
回复【10楼】millwood0  
try this:
========zero cumulative error timing routine, from black roman============

-----------------------------------------------------------------------

晚上回去仔细研究一下。
XA144F
4楼-- · 2020-02-13 15:31
我来总结一下吧,使用自动重载或者CTC方式,产生中断请求(标志位置位)的时间间隔是一样的,只是相应中断请求的时间有些差异(立即响应,执行一条指令后响应,或者执行更高优先级中断后响应),但是产生的定时是准确的。
zhxzhx
5楼-- · 2020-02-13 16:18
【69楼】 millwood0

    你10楼的方法,其实就是和我的一样的,只不过我给TH1赋值使可延迟的时间变短了,要技巧配合了,而TL1 += 0x04;这种方式是决不能用的!因为我以前也以为这是个好方法,时间证明无效至少在MCS51上.
sundy123
6楼-- · 2020-02-13 20:22
 精彩回答 2  元偷偷看……

一周热门 更多>