打印

Timer计数至中断的延迟

[复制链接]
2551|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leino11121|  楼主 | 2009-4-23 12:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
smileagain| | 2009-4-23 12:28 | 只看该作者

上代码看看

用的是T2的哪一种模式?
猜想可能是计数溢出中断取反I/O口时丢数了

使用特权

评论回复
板凳
leino11121|  楼主 | 2009-4-23 13:30 | 只看该作者

模式及函数

T2计数模式,计数溢出中断。自动重载

也曾怀疑是丢数,但有如下几个原因可
1、丢数会造成周期延长,但实际是缩短
2、输入的计数时钟不同的话,造成的抖动时延也会不同,但改变输入时钟频率,抖动时延相同
3、主频16M,采集1024K的波形应该不会造成丢数。

timer配置代码如下
void TIM1_CONF(void)
{
    TMOD = 0x60;
    TH1 = 0;
    TL1 = 0;
    TR1 = 1;
    ET1 =1;        //Enable Timer1 overflow (tf1) interrupt.
    EA = 1;
}

中断服务函数如下

CSEG AT 0001BH
CPL        P25
PUSH    ACC
PUSH    PSW
…………
POP    PSW
POP      ACC
EXTI

使用特权

评论回复
地板
leino11121|  楼主 | 2009-4-23 13:33 | 只看该作者

时延很小,0.18us左右

抖动时延很小,0.18us左右

使用特权

评论回复
5
smileagain| | 2009-4-23 18:12 | 只看该作者

如果是缩短的话,那应该是晶振的频率漂移了

不管是中断响应延迟还是丢士,都应该使周期变长的
其实晶振的误差比想象中要大,不管是有源的还是无源的
p.s.你不是用T2么,怎么代码里用的是T1计数?

使用特权

评论回复
6
leino11121|  楼主 | 2009-4-23 18:57 | 只看该作者

不是T2,使用的是T1

不能假设是晶振漂移,那样就真的无法验证了

使用特权

评论回复
7
leino11121|  楼主 | 2009-4-23 19:02 | 只看该作者

刚刚试了一下

即使用T1的定时模式,也还是会有抖动

使用特权

评论回复
8
smileagain| | 2009-4-23 20:21 | 只看该作者

那么你先用示波器测一下晶振的频率试试

为什么不能假设是晶振的漂移呢?晶振的稳定性真的没你想象中那么好

使用特权

评论回复
9
leino11121|  楼主 | 2009-4-24 14:41 | 只看该作者

示波器测试过晶振频率,没有问题。

示波器测试过晶振频率,没有问题。

我的分析,因为51没有多级流水线。一条指令分3步,取指 译码 执行,而中断的响应应该是在执行之后,就是说无论中断在那步到来,都要等到当前语句执行完之后才能响应。当中断到来的时间不同造成了中断函数中第一句话的响应时间有差异。

0.18us约等于3/16M

使用特权

评论回复
10
李冬发| | 2009-4-26 01:17 | 只看该作者

中断响应是有先有后的,这个抖动正常得很吧。

使用特权

评论回复
11
红心j| | 2009-4-26 09:46 | 只看该作者

回答4楼:“抖动时延很小,0.18us左右”这是正常的

为什么是正常的,请你仔细看一下书,关于中断的响应。

使用51单片机,中断响应延时时间是不确定的,从0到程序中所有使用的指令中的最大指令周期时间。
中断响应后,执行CPL P25,也会产生时延,但这个时延是共同的,也就是说对于输出,不会对每个周期产生影响。
由于中断响应时间的不确定性,必然造成输出信号周期的不稳定性。
如果要求高精度,只有一个途径,即不使用MCU,而是使用硬件,比如分频/计数器。

使用特权

评论回复
12
leino11121|  楼主 | 2009-4-27 18:44 | 只看该作者

“抖动时延很小,0.18us左右”这是正常的

感谢大家,查了一下书,的确需要等待当前是机器周期执行完之后才响应中断。

再次感谢大家

使用特权

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

本版积分规则

19

主题

47

帖子

0

粉丝