打印

软件无误差的定时中断程序,供初学者学习和行家拍砖

[复制链接]
1793|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
5880527|  楼主 | 2007-10-7 13:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;看了论坛里很多关于定时器精度的帖子,很是迷惑,一个定时器有那么难伺候吗,特地写一段,12MHZ,定时器0无累计误差和相对误差,绝对误差可以通过T0H、T0L的初始值一次性修正。有比这精度更高的欢迎贴出来探讨
TL    EQU    030H    ;保存定时器响应时间用
T0H    DATA    0F8H    ;修改T0HT0L可以得到想要的定时中断
T0L    DATA    036H

        
           ORG     0000H
            LJMP    MAIN
           ORG     000BH    
           MOV     TL,TL0    ;中断响应时的定时器值保存用于后面修正用
           LJMP    CTC0     
           ORG     001BH    
           LJMP    CTC1     
           ORG     30H
MAIN:    MOV     SP,#080H
            MOV     TMOD,#011H                
           SETB    PT0        ;此级别必须最高
         SETB    ET0
         SETB    TR0 
         SETB    ET1
         SETB    TR1
         SETB    EA    
    
LOOP:   NOP    ;主循环的任何指令都不会影响执行时间,虽然影响中断响应速度
        NOP
        LJMP    LOOP
;===        
CTC0:   PUSH    PSW    
             PUSH    DPH        
             PUSH    DPL        
             PUSH    ACC        
             MOV     A,TL        ;不同的TL会跳得不同的距离
             MOV     DPTR,#TAB
             JMP      @A+DPTR
TAB:    NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP      ;NOP指令不能太少,否则不够跳而出现错误
            NOP
            NOP
        
            MOV     TH0,T0H 
            MOV     TL0,T0L        
            CPL       P1.0    ;此处开始软件方面无误差(可以根据实际情况修改输出以便用示波器观察)
            NOP
            POP     ACC    
            POP     DPL    
            POP     DPH    
            POP     PSW        
            RETI
CTC1:   PUSH    PSW
                
        POP     PSW
        RETI   
            END
(为方便去掉了无关的其它中断细节)

相关帖子

沙发
123654789| | 2007-10-7 13:22 | 只看该作者

晶振 有 误差

频率有 漂移  使你徒劳

使用特权

评论回复
板凳
5880527|  楼主 | 2007-10-7 13:27 | 只看该作者

谢谢指正

本程序只是对中断响应的不一致进行了处理,只保证软件方面无误差,不考虑晶振方面的因素,所以应该能满足前面yangfeng163网友所提的定时器要求

使用特权

评论回复
地板
123654789| | 2007-10-7 13:30 | 只看该作者

对 要定时 准确

就要 汇编

不能 用 C

使用特权

评论回复
5
5880527|  楼主 | 2007-10-7 13:41 | 只看该作者

个人感觉此方法比任何修正方法更精确,更简单

能彻底修正其它方法不能真正定时输出的缺点

使用特权

评论回复
6
etual| | 2007-10-7 15:33 | 只看该作者

先做个实验

楼主先用你的单片机跑24小时,看误差了多少?

使用特权

评论回复
7
5880527|  楼主 | 2007-10-7 18:18 | 只看该作者

呵呵

     呵呵,其实做电子时钟不用修正都能做到比较高的精度,靠定时中断的概率来保证。比如你最小时间是1毫秒,这里面实际有很多0.999毫秒、0.998毫秒、1.001毫秒...之类的,这样快的和慢的平均起来就是1毫秒了,只要你的初始值取得恰当,这个有点靠运气的感觉。
    还有就是每次都修正,延迟的时间加到初始值里去,把下次中断提前弥补这次中断造成的延迟,这个比较合理点,还有自动重装之类的修正方法等等。
    前面有网友在“单片机的定时器输出的方波信号频率稳定度怎么样?”里提到的“能不能达到晶振的数量级?”都不能用上述方法实现,因为那些方法都无法保证同一指令在同一时刻执行,只能照我所说的方法来弥补中断响应的不一致,以便达到执行时刻的一致性,那个CPL P1.0能保证每次都同一时刻执行。
   当然如果做电子时钟我那方法很可能会精度不高,因为那个初始值第一次算起来比较费劲,我也没具体去算过或说测试过,不过如果准了则软件无误差,这个可以凑或是计算的
 
 

使用特权

评论回复
8
ayb_ice| | 2007-10-8 07:59 | 只看该作者

去分析RTX51TINY源码。。。

使用特权

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

本版积分规则

14

主题

1736

帖子

1

粉丝