1 前语
单片机内部一般有若干个守时器。如8051单片机内部有守时器0和守时器1。在守时器计数溢出时,便向CPU宣布中止请求。当CPU正在履行某指令或某中止服务程序时,它呼应守时器溢出中止往往推迟一段时刻。这种延时虽对单片机低频操控系统影响甚微,但对单片机高频操控系统的实时操控精度却有较大的影响,有时还或许构成操控事端。为扩展单片机的使用规模,本文介绍它的守时器溢出中止与CPU呼应中止的时刻差错、补偿差错的办法和实例。
2 差错原因、巨细及特色
发生单片机守时器溢出中止与CPU呼应中止的时刻差错有两个原因。一是守时器溢出中止信号时,CPU正在履行某指令;二是守时器溢出中止信号时,CPU正在履行某中止服务程序。
2.1. CPU正在履行某指令时的差错及巨细
因为CPU正在履行某指令,因而它不能及时呼应守时器的溢出中止。当CPU履行此指令后再呼应中止所推迟的最长时刻为该指令的指令周期,即差错的最大值为履行该指令所需的时刻。因为各指令都有对应的指令周期,因而这种差错将因CPU正在履行指令的不同而不同。如守时器溢出中止时,CPU正在履行指令MOV A, Rn,其最大差错为1个机器周期。而履行指令MOV Rn, direct时,其最大差错为2个机器周期。当CPU正在履行乘法 或除法指令 时,最大时刻差错可达4个机器周期。在8051单片机指令系统中,大都指令的指令周期为1~2个机器周期,因而最大时刻差错一般为1~2个机器周期。若振动器振动频率为fosc,CPU正在履行指令的机器周期数为Ci,则最大时刻差错为Δtmax1=12/fosc×Ci(us)。例如fosc=12MHZ,CPU正在履行乘法指令(Ci=4),此刻的最大时刻差错为:
Δtmax1=12/fosc×Ci=12/(12×106)×4=4×10-6(s)=4(μs)
2.2 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.3 差错非固定性特色
守时器溢出中止与CPU呼应中止的时刻差错具有非固定性特色。即这种差错因CPU正在履行指令的不同而有相当大的差异。如CPU正在履行某中止服务程序,这种差错将远远大于履行一条指令时的差错。后者差错或许是前者差错的几倍、几十倍、乃至更大。如相同只履行一条指令,这种差错也有较大的不同。如履行乘法指令MUL AB 比履行MOV A, Rn指令的时刻差错增加了3个机器周期。这种差错的非固定不只给差错剖析带来不方便,一起也给差错补偿带来困难。
3 差错补偿办法
因为守时器发生溢出中止与CPU呼应中止请求的时刻差错具有非固定性,因而,这种差错很难用惯例办法补偿。为此,本文介绍一种新办法。现介绍该办法的基本思路、守时器新初值及使用状况。
3.1 基本思路
为使守时器溢出中止与CPU呼应中止完成同步,该办法针对中止呼应与中止请求的时刻差错,对守时器原有的计数初值进行修正,以延伸守时器计数时刻,然后补偿差错。在该办法中,当守时器溢出中止得到呼应后,即中止守时器的计数,并读出计数值。该计数值是守时器溢出后,从头从OOH开端每个机器周期持续加1所计的值。然后,将这个值与守时器的中止计数时刻求和。若在守时器原计数初值中减去这个和构成新计数初值,则守时器能在新计数初值下使溢出中止与CPU呼应中止完成同步,然后到达差错的补偿要求。
3.2 守时器新计数初值
若守时器为计数办法,操作办法为1,则计数器初值X0=216-t0×fosc/12。式中fosc为振动器的振动频率。t0为需求守时的时刻,也为中止的间隔时刻。X0为守时器原计数初值。在对守时器溢出中止与CPU呼应中止时刻差错进行补偿时,守时器的新计数初值X1为:
X1=216-t3× fosc/12
t3=t0+t1+t2
式中t0为中止间隔时刻。t1为守时器中止计数时刻,该时刻为守时器中止计数到从头启动计数之间一切程序指令周期数的总和。t2为守时器溢出中止后,从头从OOH开端直至计数器中止时计的值。在差错补偿中,若将守时器计数初值X1替代X0,则可使守时器下次的溢出中止与CPU呼应中止完成同步。
3.3 实例
要求补偿守时器每1ms发生一次溢出中止时的中止呼应推迟的差错。若振动器振动频率fosc=12MHZ,守时器作业在计数办法,作业形式为1,则补偿中止呼应时刻差错时的守时器新初值X1为:
X1=216-t3× fosc/12=216-(t0+ t1)- t2=216-(1000+ 13)- t2
差错补偿程序为:
……
0 CLR EA ;关CPU中止
1 CLR TRi ;中止守时器计数
2 MOV R0, #OOH ;R0清零
3 MOV R0, #LOW(216) ;守时器最大计数值的低8位送R0
4 MOV A, R0
5 SUBB A, #LOW(1000+13) ;216的低8位减去( t0+ t1)的低8位送累加器A
6 SUBB A, TLi ;216的低8位减去( t0+ t1+ t2)的低8位送TLi
7 MOV TLi, A
8 MOV R0, #OOH ;R0清零
9 MOV R0, #HIGH(216) ;216 的高8位送R0
10 MOV A, R0
11 SUBB A, #HIGH(1000+13) ;216的高8位减去( t0+ t1)的高8位送A
12 SUBB A, THi ;216的高8位减去( t0+ t1 +t2)的高8位送A
13 MOV THi, A
14 SETB TRi ;从头启动守时器
在上式和上段程序中,因为fosc=12MHZ,中止间隔时刻为1ms,因而t0的机器周期数为1000。因为第1条指令到第14条指令的指令周期的机器周期数之和为13,因而,t1为13个机器周期。CPU虽在履行第一条指令CLR TRi 后中止守时器计数,但在TLi、THi中别离保存了t2的低位数据和高位数据。
4 结束语
因为本文介绍的差错补偿办法能对守时器溢出中止与CPU呼应中止的非固定性时刻差错进行有用补偿,因而,该办法关于进步高频操控系统实时操控精度和扩展单片机使用规模都有较高的实用价值。