利用MCS-51软件清除定时中断误差
内部一般有若干个定时器,如8051单片机内部有T0和T1两个16位定时器/定数器。每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成,因此,T,0和T1都可以通过字节传送指令为它们赋初值,以获得不同定时时间所需要的计数值。T0和T1在初始值的基础上,每隔12个时钟(一个机器周期),作一次加1运算,当计数器从全1变为全0时自动产生定时器溢出中断请求。
1、定时器的4种工作方式:方式0是13位计数结构,计数器由THi的8位与TLi的低5位构成;方式1是16位计数结构,计数器由THi的8位与TLi的8位组成;方式2是8位计数结构,计数器由TLi的8位组成,当定时器溢时,THi的值能自动装入TLi中,并在此值基础上自动计数,这与其它的方式不同;在方式3下,也是8位的计数器,并且TO的各控制位和引脚归TLO使用,TH0借用T1的各控制位和引脚信号,T1只能按不需要中断的方式2工作,即丁1没有方式3。
定时器的溢出率在不同的工作方式下不同:
工作在方式O时:溢出率=fosc/(12×(2的13次方-Z+NR)Z为定时器初值,NR为定时器溢出恢复初值的周期数。恢复初值周期数为从定时器溢出到定时器初值重新装入的时间。该段时间和CPU响应中断以及程序中何时重新装入初值有关。
由于方式2为自动恢复初值的8位计数器,初值由THi确定;由于方式2是自动重装初值,所以NR=0即不存在重装初值的延时。
2、特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和Tl的启动和停止计数.同时管理定时器T0和T1的溢出标志等。当设置了定时器的工作方式并启动定时器后,定时器就按照被设定的工作方式工作,不需要CPU的干预。当计数器值全为1时,如果再输入一个脉冲则计数值重新回到定时器设置初值,同时把定时器/计数器的溢出标志位(TFO或TFl)置位,作为计数器的溢出标志。
由以上的分析可知:用MCS-51内部定时器产生中断响应时的误差由每次重装定时器初值和中断形成的,所以应该在中断服务程序中应考虑定时器赋初值的时间,应该把定时器溢出到定时器初值重新装入的时间加到定时器初值中,即缩短定时器溢出的时间。
例如:在实现一个时钟的程序中,要求最小单位为1s,一般在大干1s的定时中断情况下常采用硬件定时和软件计数相结合的方式来实现。我们采用定时器TO工作在方式1下,其最长定时时间(11.0592MT=1.0850s):1s~65536×T=71.11ms,我们使用1次定时50ms,20次定时中断得到1s。50ms定时中断的定时值为FFFFH-50ms/(11.0592/12)μs=4C00H。所以,可以编写中断服务程序如下:
在KeiluVision3软件中验证定时器T0每50ms产生一次中断的时间。
在初始化中费时为551μs,每一次中断时间应该考虑该项的影响。在实际处理中可以利用两次中断时间的差来作为定时器的中断时间间隔。通过测试,得到第一次为0.05055642s.第二次为0.10056185s,第三次为015056728s。
可以看出,每中断一次会比定时值长了5.43μs即5个机器周期,所以我们应考虑由停止计数(CLRTRl)到重新启动计数(SETBTRl)之间的5个机器周期的时间。下面我们来分析一下中断服务程序,CLRTRO指令(定时器停止计时)占1个机器周期,两条MOV指令占了2个机器周期,INC指令占了1个机器周期,SETBTRO(定时器开始计时)占了1个机器周期,在中断服务程序中给定时器赋初值时共占用了5个机器周期,所以,应该在给定时器赋初值时加上这个误差,可以把中断服务程序作如下修改:
与修改之前相比加了一条ADD指令,ADD指令就是把在中断服务程序中占用的指令周期加到定时器初值里,所加的数值为中断服务程序中的指令周期之和即7个机器周期(ADDA,07H),修改之后在KeiluVision3软件中验证定时器T0每50ms产生一次中断的时间。通过测试.得到第一次为0.05055100s,第二次为0.100551500s,第三次为0.15055150s。可以看出,这种修改方法很简单,经修改后的中断定时比较精确。
因此,在实际应用定时器产生中断时,为了提高精确度需要考虑到这个定时器中断误差,一般都需要在中断服务程序中加上一定的数值来减少定时器中断误差,通过对定时器的误差分析和校正,可以提高系统的精确度。当然,上面的分析是在软环境下理想晶振下实现的,在现实中会因晶振偏差等因素而造成误差。在实际中特别是指令比较多的情况下应充分利用KeiluVision3的分析工具,通过多次调整计数初值以获取精确的时钟信号,这对于要求精确时钟信号的应用具有重要的意义。
- 上一篇:PPT 2010滚轮不只是翻页
- 下一篇:用MEDWIN编辑编译51单片机C程序