搜索

[技术支持] 89S003我所遇到的例程坑之延时

[复制链接]
348|11
 楼主 | 2020-5-13 12:56 | 显示全部楼层 |阅读模式
89S003的例程里面有个延时程序
void Delay_2us(unsigned int fui_i)
{
        while(fui_i--);       
}
我一直以为官方的延时肯定会有计算的比较精确的,事实证明我太天真了,偏差到让你怀疑人生…………Delay_2us(350),按例程来计算应该是700US,我做红外遥控驱动时想偷懒就用了这个延时。结果…………这条指令居然只有253US,吐血,这个延时函数的对应关系,经测量约为1.38倍关系。就是你参数为1380时,实际迟时约为1000US。太精确就懒得去测了。对了,前题是按16M来计算的。

使用特权

评论回复
| 2020-5-13 14:39 | 显示全部楼层
我一直用定时器中断或者飞读产生延时,对于软件循环延时都没信心
有点奇怪,16兆的1t处理器,一次16位的减,配合while不应该需要2us吧

使用特权

评论回复

评论

wangshujun 2020-5-13 16:01 回复TA
@sbalwalw :中断就是拿来用的,只要心里清楚哪些会有冲突就好 
sbalwalw 2020-5-13 15:11 回复TA
我习惯尽可能少用中断,总感觉太频繁用中断容易出问题。官方也是建议少用中断…… 
| 2020-5-19 22:39 | 显示全部楼层
很正常,我用别家芯片这样延时也不准的。红外调制用硬件pwm

使用特权

评论回复
 楼主 | 2020-5-21 19:54 | 显示全部楼层
gym216 发表于 2020-5-19 22:39
很正常,我用别家芯片这样延时也不准的。红外调制用硬件pwm

正常什么啊,我用STC的软件计算延时,偏差在百分之五以内,现在用89S003的例程延时偏差去到百分之二百以上了…………这叫正常??

使用特权

评论回复
| 2020-5-23 14:03 | 显示全部楼层
本帖最后由 lein2006 于 2020-5-23 14:05 编辑
sbalwalw 发表于 2020-5-21 19:54
正常什么啊,我用STC的软件计算延时,偏差在百分之五以内,现在用89S003的例程延时偏差去到百分之二百以 ...

@sbalwalw
可以试一下这个HC89S003软件延时计算器
https://bbs.21ic.com/icview-2739394-1-1.html

使用特权

评论回复
| 2020-5-27 14:40 | 显示全部楼层
精确延时基本没人会用软件延时去做,只有不带任何中断的程序才能用,而且编译的优化等级不一样,出来的效果可能是不一样的

使用特权

评论回复

评论

sbalwalw 2020-5-27 19:35 回复TA
16M的1T单片机,定时840US,允许正负270US偏差,这叫精确延时?是不是我们对精确的理解不一样呀…… 
| 2020-5-28 09:06 | 显示全部楼层
lz应该先看看汇编后的代码,单字节和多字节变量的代码是相差很远的,在慢慢查查指令占用的周期,再结合频率计算出用时,这个比你用定时器还要麻烦,

使用特权

评论回复
| 2020-5-28 21:37 | 显示全部楼层
STC的软件上自带的延时计算就是很不错,比较精确,芯圣也应该做这样的软件。

使用特权

评论回复
| 2020-5-28 21:45 | 显示全部楼层
我一般是用定时器做精准延时的,这个软件延时只在不精准的场合使用。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表