浅谈MCS 51 单片机定时误差原因

2019-09-07 07:13谢琪林攀枝花学院
数码世界 2019年9期
关键词:中断延时指令

谢琪林 攀枝花学院

在MCS 51 单片机的控制系统中, 常常要求有些定时或者延时控制。定时或者延时控制一般有如下2 种方法: 软件延时,即让CPU 循环执行一段时间, 以实现延时和硬件定时, 即利用MCS 51 系列单片机硬件集成的2 个16 位可编程定时/计数器。但采用上述这两种方法来实现时间控制时却容易产生误差, 对于一般低频率的应用中对时间控制精度要求低的场合来说没有太大的问题, 而在高频实时控制应用中对时间控制精度要求高的场合来讲问题就凸现出来, 必须加以纠正和补偿。

1 软件延时误差的产生及纠正

软件延时原理: 利用CPU 内部定时机构, 使每执行一条指令需要若干个指令周期的原理, 运用软件编程, 让机器循环执行一段程序, 而得到一个固定的时间段, 就将这段时间作为定时时间。软件定时的时间长短完全取决于指令的执行时间, 此方法主要用于短时间定时。例, 采用软件方法设置一个502μs 的定时时间, 设晶体振荡频率为12MHz。可编制如下的子程序段用于软件定时。

DELAY: MOV R2, #64H ; 1 个时钟周期

DL1: NOP ; 1 个时钟周期

NOP ;

DJNZ R2, DL1 ; 2 个时钟周期

RET ; 1 个时钟周期

在该程序段中, 采用减1 指令计数, 计数初值100( 64H) 预先设置在寄存器R2 中, 各指令的执行时间如程序段中的注释所示。软件定时的时间可由各指令的执行时间以及循环次数100( 64H) 所确定, 计算如下:

但在很多情况下, 只考虑了循环体的执行时间, 没有考虑本例中的MOV、RET 指令, 即在设计延时500μs 时也采用了本程序, 这样就有一个误差, 误差率是0.4%, 这个误差非常大。另外在使用软件定时过程中, 程序也容易被其他程序或事件打断( 如中断服务程序) , 这样也会引起来较大的定时误差, 因此必须防止程序被其他程序或事件打断。同时, 这种以牺牲CPU 的时间获取延时的方法随CPU 工作频率不同而发生变化, 即定时程序的通用性差。

2 硬件定时误差的产生及纠正

硬件定时原理就是利用51 单片机片内二个16 位定时器/计数器,即定时器T0 和定时器T1, 设置为定时工作方式,定时器计数8051 片内振荡器输出经12 分频后的脉冲, 即每个机器周期使定时器的数值加1 直至计满溢出, 然后中断CPU 的当前操作, 执行相应的中断服务程序。但在这个过程中很容易产生单片机定时器溢出中断的时间误差, 产生时间误差有三个原因: 一是中断响应时间; 二是定时器溢出中断信号时, CPU 正在执行某指令;三是定时器溢出中断信号时, CPU 正在执行某中断服务程序。

2.1 中断响应时间的误差

MCS 51 单片机的最短中断响应时间为3 个机器周期, 其中中断请求标志位查询占1 个机器周期, 而这个机器周期又恰好是执行指令的最后一个机器周期,在这个机器周期结束后,中断即被响应,产生LCALL 指令,而执行这条长调指令需要2 个机器周期, 这样中断响应共经历了3 个机器周期。而在这些时间中定时器继续从0 开始计数,因此产生了3 个机器周期的误差。

2.2 CPU 正在执行某指令时的误差

中断响应的一个前提是当前指令执行完毕, 若定时器的溢出中断时, CPU 正在执行某指令,因此它不能及时响应。当CPU 执行此指令后再响应中断所延迟的最长时间为该指令的指令周期,即误差的最大值为执行该指令所需的时间。由于各指令都有对应的指令周期, 因此这种误差将因CPU 正在执行指令的不同而不同。在8051 单片机指令系统中,多数指令的指令周期为1~2 个机器周期,因此最大时间误差一般为1~2 个机器周期。若振荡器振荡频率为FOSC , CPU 正在执行指令的机器周期数为CI ,则最大时间误差为ΔTMAX1=12/FOSC×CI (us)。例如FOSC =12MHZ , CPU 正在执行乘法指令(CI=4) , 此时的最大时间误差为:

2.3 CPU 正在执行某中断服务程序时的误差

定时器溢出中断信号时, 若CPU 正在执行同级或高优先级中断服务程序,则它仍需继续执行这些程序,不能及时响应定时器的溢出中断请求,其延迟时间由中断转移指令周期T1、 中断服务程序执行时间T2、 中断返回指令的指令周期T3 及中断返回原断点后执行下一条指令周期T4 (如乘法指令)组成。中断转移指令和中断返回指令的指令周期都分别为2 个机器周期。中断服务程序的执行时间为该程序所含指令的指令周期的总和。因此,最大时间误差ΔTMAX2 为:ΔTMAX2 =(T1+ T2+T3+T4)12/FOSC=(2+T2+2+4)12/FOSC=12(T2+8)/ FOSC若设FOSC=12MHZ ,则最大时间误差为:

ΔTMAX2=12(T2+8)/FOSC=12(T2+8)/12×106=(T2+8)×10 6(s)=T2+8(μs)由于上式中T2 一般大于8,因此,这种时间误差一般取决于正在执行的中断服务程序。当CPU 正在执行中断返回指令RETI、或正在读写IE 或IP 指令时, 这种误差在5 个机器周期内。

结束语

使用上述的各种修正方法后基本能得到一个比较精确额定时, 针对不同情况应采用灵活的修正方法同时也应注意一些事项, 例如不能采用定时器工作模式2 自动重装初值的方式,否则误差会更大,并且得不到控制。另外硬件方面的因素也应值得注意,比如应考虑晶体自身的精度、晶体的频率漂移误差, 尽量选用振荡频率高的时钟以减少误差。

猜你喜欢
中断延时指令
基于 Verilog HDL 的多周期 CPU 设计与实现
多级中断屏蔽技术分析
《单一形状固定循环指令G90车外圆仿真》教案设计
一种考虑GPS信号中断的导航滤波算法
日光灯断电关闭及自动延时开关设计
关于ARM+FPGA组建PLC高速指令控制器的研究
Linux中断线程化分析及中断延时测试
基于数据选择的引信测试回波信号高精度延时
跟踪导练(二)(5)
宋湘延时答妙对