|
| 软件无误差的定时中断程序,供初学者学习和行家拍砖 |
| 新闻出处:21ic
发布时间: 2007-10-07 |
5880527 发布于 2007-10-7 13:19:00 ;看了论坛里很多关于定时器精度的帖子,很是迷惑,一个定时器有那么难伺候吗,特地写一段,12MHZ,定时器0无累计误差和相对误差,绝对误差可以通过T0H、T0L的初始值一次性修正。有比这精度更高的欢迎贴出来探讨 TL EQU 030H ;保存定时器响应时间用 T0H DATA 0F8H ;修改T0H\T0L可以得到想要的定时中断 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 (为方便去掉了无关的其它中断细节)
* - 本贴最后修改时间:2007-10-8 9:43:52 修改者:5880527 123654789 发布于 2007-10-7 13:22:00 频率有 漂移 使你徒劳
5880527 发布于 2007-10-7 13:27:00 本程序只是对中断响应的不一致进行了处理,只保证软件方面无误差,不考虑晶振方面的因素,所以应该能满足前面yangfeng163网友所提的定时器要求
123654789 发布于 2007-10-7 13:30:00 就要 汇编
不能 用 C
5880527 发布于 2007-10-7 13:41:00 能彻底修正其它方法不能真正定时输出的缺点
etual 发布于 2007-10-7 15:33:00 楼主先用你的单片机跑24小时,看误差了多少?
5880527 发布于 2007-10-7 18:18:00 呵呵,其实做电子时钟不用修正都能做到比较高的精度,靠定时中断的概率来保证。比如你最小时间是1毫秒,这里面实际有很多0.999毫秒、0.998毫秒、1.001毫秒...之类的,这样快的和慢的平均起来就是1毫秒了,只要你的初始值取得恰当,这个有点靠运气的感觉。 还有就是每次都修正,延迟的时间加到初始值里去,把下次中断提前弥补这次中断造成的延迟,这个比较合理点,还有自动重装之类的修正方法等等。 前面有网友在“单片机的定时器输出的方波信号频率稳定度怎么样?”里提到的“能不能达到晶振的数量级?”都不能用上述方法实现,因为那些方法都无法保证同一指令在同一时刻执行,只能照我所说的方法来弥补中断响应的不一致,以便达到执行时刻的一致性,那个CPL P1.0能保证每次都同一时刻执行。 当然如果做电子时钟我那方法很可能会精度不高,因为那个初始值第一次算起来比较费劲,我也没具体去算过或说测试过,不过如果准了则软件无误差,这个可以凑或是计算的
|
| 【关闭】 【打印】 |
|
|
|
|