历史上的今天
今天是:2025年06月17日(星期二)
2021年06月17日 | 单片机定时中断的几种精确定时编程方法
2021-06-17 来源:eefocus
简介:MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个 机器周期[1]。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不 同的精确定时编程方法。
文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。
1 方法1
在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和 启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时,考虑了由停止计 数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这 个立即数的低位字节(1FH)和高位字节(0FCH)。
......
CLR EA ;禁止所有中断
CLR TR1 ;停止定时器T1
MOV A,#LOW(-1000+7) ;期望数的低位字节
ADD A,TL1 ;进行修正
MOV TL1,A ;重装载低位字节
MOV A,#HIGH(-1000+7) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
SETB TR1 ;重启动定时器
SETB EA ;重开中断
......
此方法适用于各种原因造成的定时误差的情况,为通用方法。
2 方法2
假如定时周期为10ms,通常定时器重装载值为0D8F0H,中断子程序如下[2]:
ORL TL1,#0F0H
MOV TH1,#0D8H
......
这里用ORL TL1,#0F0H代替MOV TL1,#0F0H 可提高定时精度。此方法只适用于重装载值低位字节的低4位为零,且中断响应的延迟时间小于16个机器周期的情况。类似的定时器重装载值有0FFF0H,0FFE0H等。
3 方法3
假如定时周期为1ms,通常定时器重装载值为0FC18H,中断子程序如下:
MOV A,#LOW(-1000+4) ;期望数的低位字节
ADD A,TL1
MOV TL1,A
MOV A,#HIGH(-1000+4) ;对高位字节处理
ADDC A,TH1
MOV TH1,A
DEC TL1 ;恢复提前了的2个机器周期
......
这种方法中不停止定时器计数过程,若在执行指令ADDC A,TH1 或MOV TH1,A时,恰好产生TL1溢出向TH1进位的情况,则TH1的值就不对了,会产生更大的误差。为此,程序段开头为重装载值加4,若有溢出进位,则可提 前发生,其中2个机器周期是考虑到为TL1重装载占用的时间。
此方法适用于系统中无其它更高优先级中断源的情况。若类似方法1,在程序段开头和结尾分别加上禁止所有中断(CLR EA)和开中断(SETB EA)指令,则将适用于所有情况。
4 方法4
假如定时周期不确定,只知道定时器重装载值存放在寄存器R3、R2中,中断子程序如下:
MOV A,#05H ;3个机器周期装载TL1,2个周期提前
ADD A,TL1
ADD A,R2
MOV TL1,A
MOV A,R3 ;处理高位字节
ADDC A,TH1
MOV TH1,A
DEC TL1 ;恢复提前了的2个机器周期
......
此法适用于定时周期不确定的情况,其它同方法3。
5 方法5
当定时中断发生的位置可预知时,通常出现在主程序的AJMP $ (或SJMP $)等待指令处,中断延迟时间为3个或4个机器周期。取固定值4可简化补偿程序。以定时周期1ms为例,中断子程序如下:
ORG 001BH
MOV TL1,#LOW(-1000+4)
MOV TH1,#HIGH(-1000+4)
......
此方法适用于定时中断总发生在同一条指令位置,且无其它中断源的情况。
结 语
上述5种方法误差均不超过1个机器周期,其中方法1、3、4较为通用,适用于任何情况,但程序较长;方法2、5简单,但必须注意满足对应条件,才能使用。当然,也还有其它方法[3],但比较烦琐,并不理想,这里不一一介绍。
史海拾趣
|
DSP目前比较流行的是TI公司的。其实DSP也就是一个大的单片机,只是模块齐全,外设只是多,速度飞快(频率一般在50MHz至上GHz)。其他的嘛,一般化了。感觉有些DSP还不如AVR单片机,你比方说ATMega128拥有128KByte的Flash,还具有片内EEPROM,这个DSP ...… 查看全部问答> |
|
本机 wmware + windbg; 请问:如何查看如下三个函数的系统服务号 本机 wmware + windbg; 请问: 如何查看如下三个函数的系统服务号? NtUserGetMessage(), NtUserDispatchMessage()、 NtUserPeekMessage()。 非常感谢。 如下测试: kd> dd KeServiceDescriptorTableShadow 8089f440 80830f58 ...… 查看全部问答> |
|
我不是搞硬件的,现在有个朋友问我这个问题,他想将USB数据线的中间线体部份用光纤代替,由于光纤是单向传输,这就需要分离出USB的输出输入信号,我想知道USB能否分离出输出输入信号,是不是每一类USB设备都有统一的输出输入针脚,请高人详细给讲讲… 查看全部问答> |
|
单片机 STM8S903K3 本人采用单次扫描模式,可以读的到AD值的变化,但是AD值不准 具体来说,测量到AD口的电压为0.65V 理论计算AD值应该为133,但是程序运行中AD转化器读的AD值是46。差别太大了。 程序如下,请大侠们指点问题出在哪? AD转 ...… 查看全部问答> |
|
用CCS开发的朋友们注意了,Ti推出了图形化的MSP430配置界面,来感受下图形化配置的快捷,下面是Grace的介绍http://processors.wiki.ti.com/index.php/Grace_Quick_Start_Guide?DCMP=Grace&HQS=Other+OT+grace#Welcome 使用介绍,见2楼,Lee大神的 ...… 查看全部问答> |
|
入门小弟求助:error C141: syntax error near ')' 以及不能输入中文 已经解决 [ 本帖最后由 谜一样的双眼 于 2011-9-28 20:59 编辑 ]… 查看全部问答> |
|
其实一直觉得boosterpack是launchpad上一个非常有意思的东西, TI在发布launchpad之初就指定好了统一的扩展规范叫做BYOB(Build Your Own Boosterpack)。 细心的童鞋们可能已经发现了,MSP430的launchpad、M4的launchpad还有C2000的launchpad都 ...… 查看全部问答> |
|
一 MAGIC嵌入式操作系统背景 02年大学计算机应用专业毕业,参加实习工作进行UNIX下的应用软件开发,当时就发现自己在大学学习的知识只能达到软件这个行业的基本入门,而且所学的知识支离破碎根本不知道可以用到什么地方,所以大学期间 ...… 查看全部问答> |




