搜索
bottom↓
回复: 12

一个很典型的定时程序,为何时间上总差呢?

[复制链接]

出0入399汤圆

发表于 2013-10-12 14:44:00 | 显示全部楼层 |阅读模式
本帖最后由 R88 于 2013-10-12 14:45 编辑



1s的定时用示波器看RC4口总差20ms左右。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-10-13 00:29:21 | 显示全部楼层
从定时器溢出到下一个计数周期开始,中间经历了中断触发、重写定时器初始值什么的,都是要花时间的,必然有误差
想没误差的话得用类似自动重载计数值的连续计数模式

出0入0汤圆

发表于 2013-10-13 06:09:38 | 显示全部楼层
想没误差的话得用类似自动重载计数值的连续计数模式


Or insert one  operator in front of the '=' sign.

出0入0汤圆

发表于 2013-10-13 08:38:49 | 显示全部楼层
这个经典的定时方式本身会有误差,这个硬件定的,主要是中断前的那条指令是不确定的周期,例如触发中断时在执行NOP等指令,下一个周期进入中断相应流程,而执行MUL等多周期指令时,需要该指令执行完毕,就是在镖准核中会有1-4个指令延时,导致你的最终定时中断定时不准;
解决方法计算加法或减法吧,不要直接赋值;例子参考KEIL自带的RTOS_TNY

出0入399汤圆

 楼主| 发表于 2013-10-13 09:32:10 | 显示全部楼层
dashashi 发表于 2013-10-13 00:29
从定时器溢出到下一个计数周期开始,中间经历了中断触发、重写定时器初始值什么的,都是要花时间的,必然有 ...

就是因为有你所说的误差,所以我才让进入中断的次数尽可能次数少,,,进入20次,那么一次就是1ms。。。。这中间的过程我想不会花费1ms的时间吧。。也就是3us-5us左右。。。

出0入399汤圆

 楼主| 发表于 2013-10-13 09:36:23 | 显示全部楼层
dashashi 发表于 2013-10-13 00:29
从定时器溢出到下一个计数周期开始,中间经历了中断触发、重写定时器初始值什么的,都是要花时间的,必然有 ...

最重要的是你说的这些操作最终对定时时间产生的效果是延时时间变长。。。。但是我现在用示波器看得情况是----时间上少20ms左右。。。。

出0入399汤圆

 楼主| 发表于 2013-10-13 09:37:24 | 显示全部楼层
millwood0 发表于 2013-10-13 06:09
Or insert one  operator in front of the '=' sign.

插入一个操作在赋值前面是什么意思??

出0入399汤圆

 楼主| 发表于 2013-10-13 09:40:47 | 显示全部楼层
mcu5i51 发表于 2013-10-13 08:38
这个经典的定时方式本身会有误差,这个硬件定的,主要是中断前的那条指令是不确定的周期,例如触发中断时在执 ...

我没安装keil,很少写程序。您把对应的代码传上来让大家看看吧。。。顺便看下5,6楼。。

出0入0汤圆

发表于 2013-10-13 19:08:58 | 显示全部楼层
R88 发表于 2013-10-13 09:36
最重要的是你说的这些操作最终对定时时间产生的效果是延时时间变长。。。。但是我现在用示波器看得情况是 ...

这个- -有没有可能只计数了19次?或者晶振不准?
少20ms确实有点多了- -

出0入399汤圆

 楼主| 发表于 2013-10-14 09:02:57 | 显示全部楼层
dashashi 发表于 2013-10-13 19:08
这个- -有没有可能只计数了19次?或者晶振不准?
少20ms确实有点多了- -


晶振很准啊,我测了晶振的4分频--很准,而且我使用了内部振荡器也试了一下还是一样。。

程序楼主位有,那不就是20次吗??

出0入0汤圆

发表于 2013-10-14 10:25:04 | 显示全部楼层
R88 发表于 2013-10-14 09:02
晶振很准啊,我测了晶振的4分频--很准,而且我使用了内部振荡器也试了一下还是一样。。

程序楼主位有, ...

嗯- -反复看了N遍都应该是20次- -不然LZ试试在每一次中断里面都翻转一次输出- -
如果这样只有40多ms那应该就是定时器的问题了- -就再仔细检查检查定时器- -

出0入399汤圆

 楼主| 发表于 2013-10-15 08:45:57 | 显示全部楼层
dashashi 发表于 2013-10-14 10:25
嗯- -反复看了N遍都应该是20次- -不然LZ试试在每一次中断里面都翻转一次输出- -
如果这样只有40多ms那应 ...

是40多ms,离50ms差个1ms多。。。不知道哪产生的误差?

出0入0汤圆

发表于 2013-10-17 11:17:01 | 显示全部楼层
R88 发表于 2013-10-13 09:40
我没安装keil,很少写程序。您把对应的代码传上来让大家看看吧。。。顺便看下5,6楼。。 ...

标准51芯片,可以看仿真时钟数值
u16 tmp;
TRX = 0;
tmp = THX<<8 | TLX;
tmp += TIM_CLK;
TLX = tmp;
THX = tmp>>8;
TRX = 1;


记得就是这样了,每次都会有误差,但是宏观看没有误差,需要注意的是TIM_CLK需要对计算加减法和停止计时器的用时补偿,这里用汇编会很方便,C的话要加入一个变量计算复杂些
汇编代码找Keil 自带的RTOS_TNY,它补偿了7个时钟,结果就是正好了,其他51芯片结果可能不同,需要按照指令集处理
最好的方式其实是基于硬件的,比如51的定时方式2,自动装载模式,或用52的T2实现,都可以和芯片指令集无关
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 04:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表