原创 HotC51共产儿童团第九课:定时器“自动装载”与晶振频率合理选择

2009-2-26 21:49 2857 2 2 分类: MCU/ 嵌入式
HotC51 发表于 2009-2-26 21:52 裸奔式实时操作系统HotTask51 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: HotC51共产儿童团第九课:定时器“自动装载”与晶振频率合理选择


在"HotC51共产儿童团第八课:手表晶振为何选用32768"里,只讲了一句:
因为32768=0x8000,在16位计数器的“中部”

实际里面有很多“哲理”,并非像老狼同学“忽悠”一句那么简单~~~。

菜农实在是累了~~~,

本来也想听听“儿童团员们”谈谈对32768这个“怪异的数字之认识”~~~


开课:(此课绝非忽悠~~~一切)

首先它说明人类和机器之间对数的进制之间的差异。


手表晶振取32768Hz,因为它在16进制数为0x8000,这样在晶振频率漂移时

“上下调节”方便。

再者,它的低八位为0x00,这对于8位的定时计数器也可精准长定时且有时间

在中断里来处理。

再如51中我们常用11.0592MHz做主频,因为基本51采用12分频。

11059200=0xA8C000Hz它远远超过16位的0xA8倍=168(假定低16位全满)。

我们如何将0xA8C000限定在16位且低8位为0呢,肯定要分频。

11059200/12=921600=0xE1000Hz  

这个数字也告诉我们一个时钟周期为1/921600Hz=1.085uS

若采用8位定时计数器,则“满量程”即为对921600=0xE1000Hz再分频256.

故921600Hz/256=3600Hz 或0xE1000Hz/0x100=0xE10=3600Hz

即8位定时计数器最大定时时间为1/3600HZ=277.778uS.

可以看出,在主频11.0592MHz/12下,8位定时计数器无法实现人类的“整数”。

如何得到人类和机器共同的“整数”定时呢???

采用16位定时计数器,若想定时1.25mS

则时间常数=1.25mS/1/921600Hz=0.00125*921600=1152=0x480

即定时计数器经过1152=0x480个对921600=0xE1000Hz的计数,完成了1.25mS的定时计数工作。

采用16位定时计数器,若想定时50mS

则时间常数=50mS/1/921600Hz=0.05*921600=46080=0xb400

即定时计数器经过46080=0xb400个对921600=0xE1000Hz的计数,完成了50mS的定时计数工作。

可以看出:1.25mS和50mS我们都能和机器进行“整数”的沟通,但后者却可以帮我们在16位定时计

数器上,实现在51MCU的T0/T1上增加定时器“自动装载”功能。

因为在16位定时器计数(+1)时,低8位TLX++==0后,内部会向高8位THX进位,即THX++.

这个“自动过程”和定时器工作模式无关,任何16位的寄存器都会有这样的进位。

所以,定时1.25mS下的时间常数=1.25mS/1/921600Hz=0.00125*921600=1152=0x480不能满足低8位为0
的定时器“自动装载”功能之“基本条件”。

但我们可以看出,
0x480加倍即为0x900(2.50mS)
0x900加倍即为0x1200(5.00mS)
0x900*3即为0x1b00(7.50mS)
0x900*4即为0x2400(10.00mS)
0x900*5即为0x2D00(12.50mS)
0x900*6即为0x3600(15.00mS)

故想定时50mS,即50/2.5=20 即0x900*20即为0xB400(50.00mS)

那么最大的整数mS为多少???
0x10000/0x900=0x1C=28
故0x900*28即为0xFC00(2.50mS*28=70mS)

所以,本课:定时器“自动装载”与晶振频率合理选择

结论为(任何MCU/ARM/DSP都可参考此课之“论点”达到任何定时器都可具备“自动装载”功能):

在11.0592MHz/12下,定时器T0/T1具备“自动装载”功能的定时“基准”为2.50mS.最大定时为70mS

在51上如何真正完成“自动装载”呢???

所谓自动装载,即在定时计数溢出后,TX++后为0, 由硬件内部的初值备份来刷新TX装载。
在51上T2具备16位定时器“自动装载”功能,初值备份为RCAP2H/RCAP2L-àTH2/TL2
T1/T0不具备16位定时器“自动装载”功能。8位的初值备份为THX-àTLX

故具体T0/T1实现可在T0ISR()/T1ISR()刷新THX,注意千万不要搞TLX~~~
你可以睡觉起来用(定时50mS):
THX = (~0xB400 + 1) >> 8; 或 THX = 0x4C;
若你“迷糊时间”在下个50mS来多之前,且TLX内部不向THX进位期间,
可用: THX += 0x4C;  (此句估计雷翻不少人~~~)

上句的THX = 0x4C;表示你肯定会在256个时钟周期内,在TLX从0xff跳变为0x00并向THX进位之前

改写THX的值,这样不会带来任何定时误差。

后句实际是在任何时候对定时误差的补偿和修复。

因为在TLX从0xff跳变为0x00并向THX进位时,THX+=1,表示离定时溢出“近”了256个时钟周期。

THX += 0x4C;表示此时由于迷糊过了,THX = 1那么0x4C应该”少”1个即为0X4D。
这里0x4D比0x4C到0xff的“距离”要“块一步”。即修正了“迷糊之过错”。

那末为什么12MHz/12人类的“整数”为什么不能也来个“修正”呢???

搞句: TX(16位) += -500000;或 TX += 0x3CB0  不也解决问题了码???

非也!!!

在11.0592MHz/12下,TX += 0x4C00.看似可以,但可惜51的16位定时器的赋值必须对高低位分别操

作,因为你没本事做到 TLX += 0xB0;if(TLX == 0) THX ++;

这里有中断,TX进位判断即数据临界等诸多问题。

但TX += 0x4C00只要在“TLX从0xff跳变为0x00并向THX进位之前”允许你随便“迷糊”~~~

若非要在12MHz/12下的“人类整数机器非整数”的“晶振频率不合理选择”条件下,实现无误差积

累的定时器“自动装载”,倒也不难做的~~~不过要注意:

首先,坚持“TX += 0x3CB0”的“误差积累消除之原则”,认清“在TLX从0xff跳变为0x00并向THX

进位之前”的“工作斗争大方向”.

1.先用EA = 0;_nop_();“进行镇反活动”,

2.再用TRX = 0;“搞停敌人之心脏”

3.后用TLX+=0xb0 + dl;补偿“读改写”之误差,其中,dl是对“搞停敌人之心脏”活动的代价~~~

4.再TRX=1;EA=1;先让“友军行动”

5.最后用THX += 0x3C + dh;若第3步TLX!=0,则dh=0.

到此,革命终于成功~~~菜农仍需努力~~~

课毕

HotC51@126.com   2009.2.26于菜地。
团部:http://group.ednchina.com/1623/


本课可参见03年菜农的回帖: 为什么我用4M的晶体作时钟却总是不准?




为什么我用4M的晶体作时钟却总是不准?
jameswl 发表于 2003-9-5 16:28 PIC 单片机 ←返回版面   举报该贴

有人叫我换成4.194304M的晶体,不知道行不行。
谁能告诉我这是如何计算的?




用1M,4M,12M,16M这些人类认为的"整数倍"数肯定不好!
hotpower 发表于 2003-9-6 00:18 PIC 单片机 ←返回版面   举报该贴


我是用的TMR0计时的
jameswl 发表于 2003-9-6 14:49 PIC 单片机 ←返回版面   举报该贴

谁能告诉我时钟晶体的频率与实际计时秒数之间的关系是如何计算的?



jameswl:高人已给你选择了“准确的”晶振——4.194304M
hotpower 发表于 2003-9-6 20:58 PIC 单片机 ←返回版面   举报该贴

如此之高人的高见为何不采纳??????????????

我为此高人难受!难受!难受!难受!难受!难受!难受!难受!

我上帖中的——用1M,4M,12M,16M这些人类认为的"整数倍"数肯定不好!

“人类”和“整数”是——关键词!!!!!!!!

jameswl:你遇到高人竟然不知?????????


可叹呀!!!!!!!!



时钟
xmljx 发表于 2003-9-7 01:19 PIC 单片机 ←返回版面   举报该贴

用定时器的自动装载定时,可以说时钟的精确度就只决定于晶振的精确度了.



楼上的说的好——但在时钟和波特率应用方面非整数误差小
hotpower 发表于 2003-9-7 05:02 PIC 单片机 ←返回版面   举报该贴

4.194304M在4分频后为4.194304M/4=1048576Hz=0X100000Hz
1048576Hz对于人类是非整数!肯定不如1MHz好记!!!
但0X100000Hz在计算机“眼里”确成了整数!!!
即在 8位计数器中0X100000Hz=0X1000*0X100Hz
  在16位计数器中0X100000Hz=0X10*0X10000Hz
若采用16分频后
即在 8位计数器中0X100000Hz=0X10*0X100*0X100Hz
  在16位计数器中0X100000Hz=0X10*0X1*0X10000Hz
若采用256分频后
即在 8位计数器中0X100000Hz=0X100*0X10*0X100Hz
  在16位计数器中0X100000Hz=0X100*0X1*0X10000Hz
依此类推
若采用...分频后
...............
...............

故可得出结论——XXXXXXXX(略)
所以,在PIC应用中:
若采用4.194304M晶振,16位计数器,256分频后
则定时1S时间到后,恰好计数器溢出!!!

即使定时器无自动装载方式也无妨!!!
由于不管计数器是+1器或-1器,计数器溢出后都会自动“归零”!!!
不就成了“自动装载方式”了吗????

所以,“用1M,4M,12M,16M这些人类认为的"整数倍"数肯定不好!”



为什么我用4M的晶体作时钟却总是不准?

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条