打印

8051 定时器 1s钟的程序

[复制链接]
楼主: nicker88
手机看帖
扫描二维码
随时随地手机跟帖
21
bhsdlmj| | 2010-9-25 20:30 | 只看该作者 回帖奖励 |倒序浏览
哈哈 楼主这个问题太简单了  用不着冷漠来回答 连我都能解释的了

楼主你这个程序先不谈对错  反正看着很让人难受

不是很规矩

冷漠 ,我现在想弄弄硬件 以后还多多指点啊

使用特权

评论回复
22
singleywy| | 2010-9-25 21:50 | 只看该作者
20# 冷漠
不好意思,是我没看懂你的意思,就胡乱发表了,只是一时脑热,还望您见谅,我在这里对我的行为表示深刻地反省,以后不再没大没小的

使用特权

评论回复
23
spring3014| | 2010-9-25 21:53 | 只看该作者
中断处理程序有点长,像ET1,TR1,EA最好放在初始化程序中。

使用特权

评论回复
24
singleywy| | 2010-9-25 21:57 | 只看该作者
20# 冷漠
我在自我检讨中,看到你的签名,让我看到我自己是多么的卑微,我恐怕自己就是口出狂言的人,自己根本没有尊重自己,又何谈尊重他人,以后做什么事还是有分寸的好,谢谢您的教诲,在这里我再郑重地向您表示深刻的歉意,望您能原谅我这卑微的小人

使用特权

评论回复
25
highgear| | 2010-9-25 23:10 | 只看该作者
singleywy 是对的。

从中断发生到执行用户程序的时间是固定的(+7或者 +8, whatever), 可以精确计算。但是正如 14 楼所说, 中断发生的时刻不完全确定, 取决于当时的指令,这会造成一两个周期的误差。解决方法:
1) 自动重装可以解决, 但周期太短;
2) 让定时器自由运行, 中断里不重置定时器, 即timer = 65536, 不过中断时间不一定是 1s 的整数倍。
3) 设置 timer 前, 读定时器, 做出修正。

使用特权

评论回复
26
xwj| | 2010-9-26 00:17 | 只看该作者
个人观点:
singleywy 根本不用道歉。很明显,冷漠没看懂(或许看都没看)你6楼的代码的意思和目的。你14楼的说法也是对的。

使用特权

评论回复
27
highgear| | 2010-9-26 00:30 | 只看该作者
顶 xwj, 顶 singleywy.
还是 xwj 细心。我没有注意到 singleywy 6 楼的代码, 呵呵, 6楼的代码正是用来修正中断误差. 冷漠显然不知道这一点。

使用特权

评论回复
28
xwj| | 2010-9-26 00:36 | 只看该作者
25楼已经说明了,我补充下:
由于51必须执行完当前指令才能进入中断,而51不同指令的执行时间是不一致的,所以“中断发生的时刻不完全确定, 取决于当时的指令,这会造成一两个周期的误差。”——这个误差对于标准51来说为1~3,因为51有1个周期、2个周期、4个周期的指令,看中断时正在执行什么指令了;
另外一个影响中断时间的可能就是中断来时当前正在执行更高或相等优先级的中断程序,这个中断就比如会被延迟或漏掉——当然,对于时间要求严格的肯定不会这样设置,这点可以忽略不计。

然后,那个+7或加多少的说法四不准确的,因为除了上面说的原因外,也没有中断保存现场的时间,而不同人、不同程序中断中做的事情肯定是不同的,会破坏而需要保存、恢复的变量数目必然不同,所以从中断进入到执行到你的重装初值的指令时间也是不能一概而论的。

最后:
其实,就算不用T2的自动重载,只用定时器1不修正也能实现无误差的1S钟的:那就是只重装TH0,而不去动TL0!
这点对于大多数主流晶振频率都能满足的。比如常用的11.0592MHz晶振,11059200%65536=4096=0x1000,很明显低8位是等于0的,是完全不用管的!

使用特权

评论回复
29
xwj| | 2010-9-26 00:49 | 只看该作者
当然,绝大多数时候、绝大多数应用对于中断时间要求并不是非常严格的,多一周期少一周期完全没关系,所以根本不用考虑这些问题,也就不用做什么“修正”了;

而老x早前做的那个“51DIY的VGA显示的俄罗斯方块”则对中断时间极端敏感,同步头只要相差一个周期(跳动),就会造成液晶显示器时而显示时而黑屏(其实黑屏时显示器是判断失步了在重新同步),而图像数据只要差一个周期(跳动)就会造成重影和锯齿,
这时宏观上的“准确”都是没用的,必须在微观上每次中断都是完全相等的254个周期,所以老x是采取了极端措施来确保中断进入时间完全一致的:)
大家感兴趣的话可以去看看我的源程序,保证会有收获,捕获白看哦~:lol

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
123jj + 1
30
流行音乐| | 2010-9-26 00:59 | 只看该作者
要么用指令时间补偿,要么中断周期太短,难道这个问题就没有完美的方法了么?
这个问题表面是精确定时1s的问题,但在实际应用中,误差那么几个us甚至几个ms我们都能接受。关键是在长时间计时的时候这些误差是否会累积,如果这些误差不会累积,例如这一秒快了几十个us,下一秒又慢了几十个us,总之能保证长时间计时的累积误差小于1ppm甚至0.001ppm这就很让人满意了。
讨论这个问题,我觉得要把瞬时误差和累积误差分别讨论。
瞬时误差都能很容易做到让人满意的100us以内,这已经不是问题了。
还没解决的问题就剩累积误差了,累积误差用相对误差来衡量更为实用,例如用ppm为单位。

好了,现在就可以把问题明确了:如何让软件计时做到累积误差小于1ppm甚至0.001ppm。

注:我说的都是软件误差。有些人说“硬件误差都做不到1ppm以下,讨论软件误差没有意义”,那么我向一下,万一哪天天文台同意你用他们的时钟,你难道还要他们帮你把计时软件写好?

使用特权

评论回复
31
123jj| | 2010-9-26 05:03 | 只看该作者
呵呵,老x说的对!

使用特权

评论回复
32
fzu_csc| | 2010-9-26 08:20 | 只看该作者
9# xwj

常量运算根本不占用时间吧

使用特权

评论回复
33
xuyiyi| | 2010-9-26 08:45 | 只看该作者
9# xwj  

常量运算根本不占用时间吧
fzu_csc 发表于 2010-9-26 08:20



看到现在,又一高手露脸了~~~

使用特权

评论回复
34
highgear| | 2010-9-26 11:04 | 只看该作者
顶 xwj 的28楼, 29楼。

回 30 楼:只要晶振的精度可以保证, 软件可以通过基准时间校正的方法来解决累计误差。

使用特权

评论回复
35
冷漠| | 2010-9-26 11:08 | 只看该作者
本帖最后由 冷漠 于 2010-9-26 15:45 编辑

25楼highgear 抄书抄的太过时了,不知哪个年代的书内容,所长今年53岁,多少年前的51资料,那时的51还没有T2吧?莫名其妙:

singleywy 是对的。

从中断发生到执行用户程序的时间是固定的(+7或者 +8, whatever), 可以精确计算。但是正如 14 楼所说, 中断发生的时刻不完全确定, 取决于当时的指令,这会造成一两个周期的误差。解决方法:
1) 自动重装可以解决, 但周期太短;
2) 让定时器自由运行, 中断里不重置定时器, 即timer = 65536, 不过中断时间不一定是 1s 的整数倍。
3) 设置 timer 前, 读定时器, 做出修正。




1) 自动重装可以解决, 但周期太短;
        HotPower和所长同岁,但是Hot不断在学习,Hot写了一篇T2定时器的应用研究。那才叫研究。所长光知道抄书: 自动重装可以解决, 但周期太短;也跟Hot学学玩T2,什么叫周期太短? 仔细看看T2自动重装的最大周期是多少?现在玩自动重载谁还用T0 / T1 ? highgear 感情连T2都不会用?那还在这装个什么劲高手?
“5年了,昆仑派一点长进都没有。”

冷漠说过6楼singleywyw的程序有错吗?在这论坛上,恐怕只有2个人(除了singleywy)知道6楼的程序是参考了Intel 蓝本的,不是完全他自己写的!——冷漠会说Intel写错了吗?只有highgear或者所长这种人才会经常闹这样的笑话,说冷漠这个无知那个错,结果万没想到:冷漠是摘抄的Intel、Keil 使用手册资料或者国家引进的世界著名大学教材上的内容!——尴尬之极,只好硬着头皮说书上的内容也有错误。当然当然,highgerar比清华外籍教授高明多了。600元一小时授课费是看不上的。现代阿Q 。“拿起皮鞭将你打……”只能自我解嘲而已。

2个人是:
第一个人:ayb_ice;
第二个人:冷漠;

且比较下面2段程序内容:

1、6楼singleywy:


#pragma ASM

PUSH ACC

PUSH PSW ;

MOV A,#(60536 MOD 256) ;default worth is 5ms

CLR TR0
ADD A,TL0
ADDC A,#08H

MOV TL0,A
MOV A,TH0
ADDC A,#(60536 /256)
MOV TH0,A
SETB TR0

POP PSW

POP ACC
#pragma ENDASM




2 、Intel 蓝本内容:

……
; ACC required by some Cygnal devices
; Update 8051 Interrupt Timer

CLR  TR0

MOV    A , TL0

ADD   A , #LOW (?RTX_CLOCK + 7)

MOV   TL0 , A

MOV   A , TH0

ADDC   A , #HIGH (?RTX_CLOCK + 7)

MOV  TH0,A

SETB  TR0

……

使用特权

评论回复
36
yulri| | 2010-9-26 11:29 | 只看该作者
没有签名的必是大牛。多是B型血型?LS可是B型血型?

有签名的不过是表现一种活着有目标,有激励的人。O,A 血型居多。不知冷漠说的可对?
冷漠 发表于 2010-9-25 20:15

呵呵,受教了,没想到一个签名竟然整出这么多哲理来,难道心中的目标要通过签名又或者天天喊叫着才能说明一个人有目标么?才能说明是一个活着有目标,有激励的人吗?费解!没有反驳你的意思,我知道凭我的口才是说不过你的,我只是说一下自己心中的疑虑而已!
至于我的血型,不好意思,我自己也不知道!:)

使用特权

评论回复
37
冷漠| | 2010-9-26 14:17 | 只看该作者
本帖最后由 冷漠 于 2010-9-26 15:30 编辑

#36楼

所以,我很欣赏别人的签名,就像每个人都有自己最喜欢的格言。文如其人,他们每天活着知道自己为什么活着,应该做什么。他们知道自己是谁。
     而像highgear ,所长那类人是绝对不知道每天活着应该干什么的。他们不可能有明确喜欢的名言,他们每天活着也不知道该干什么,没事干就整天和别人比较,今天和这个比,明天和那个比,结果比较了半辈子,生活中除了充满不满和抱怨,一点都没快乐过;因为他们不知道这么一个道理:永远会有人比你做得好,这是残忍的无底洞。贬低他人并不能抬高自己,那是一种病态心理。恐怕highgear 年过30,还不知道自己的血型吧,不知道整天活着干啥,连冷漠都知道了:——B型。
所长:——B型 / AB型。

使用特权

评论回复
38
singleywy| | 2010-9-26 14:22 | 只看该作者
35# 冷漠
恩,当时是我误解你的意思了,不过我那段代码是自己写的不是参考inter的蓝本,因为网上有关定时器自动修正的**很少,有都是千篇一律呀,而且是错误的,我参考的就是网上错误的定时器修正,然后自己更改的来的,不过inter的蓝本就是蓝本呀,果然与众不同,代码如此简洁,该省的都省了,学习了

使用特权

评论回复
39
lixiaoxu2meng| | 2010-9-26 14:39 | 只看该作者
不好意思我是穷山沟里出来的, 我也不知道我的血型。 我今年24刚毕业一年,我倒没觉得我有什么异常。

使用特权

评论回复
40
mcu_lover| | 2010-9-26 15:09 | 只看该作者
学习了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则