江上酒酒 发表于 2024-10-21 15:43:09

关于延时函数

在keil5上写的延时函数经过debug不断测试后,时间规定下来了,但烧录到单片机里进行运行,时间与程序里写的时间对不上,这个问题该怎么解决呀?

邮箱 发表于 2024-10-21 15:46:41

时钟设置对了吗?

江上酒酒 发表于 2024-10-21 15:51:34

邮箱 发表于 2024-10-21 15:46
时钟设置对了吗?

我是新手,对这还不懂,我没有管时钟。那时钟的话该如何去设定呀,大佬。

远行的鹿 发表于 2024-10-21 15:58:30

使用AIapp-ISP-v6.94R软件生成吧,选择型号频率自动生成。

江上酒酒 发表于 2024-10-21 16:26:38

远行的鹿 发表于 2024-10-21 15:58
使用AIapp-ISP-v6.94R软件生成吧,选择型号频率自动生成。

这个我之前试过,让它单独运行这个时间还是比较准的,但是假设引入一个1毫秒的延时函数,让它连续运行1000次,相当于经过了一秒,这个时候把程序烧录到单片机再运行,时间就又不对了

远行的鹿 发表于 2024-10-21 16:40:29

江上酒酒 发表于 2024-10-21 16:26
这个我之前试过,让它单独运行这个时间还是比较准的,但是假设引入一个1毫秒的延时函数,让它连续运行100 ...

考虑是否有其他中断打断了程序的执行导致时间变长,关闭中断跑一下看看

soma 发表于 2024-10-21 17:20:59

不要在debug里面测软件延时,要用逻辑分析仪去看。

DebugLab 发表于 2024-10-21 17:21:49

江上酒酒 发表于 2024-10-21 16:26
这个我之前试过,让它单独运行这个时间还是比较准的,但是假设引入一个1毫秒的延时函数,让它连续运行100 ...

这个只适合运行1次,而且要考虑中断的影响,运行多次会加入其他的判断和跳转时间,这是正常的

DebugLab 发表于 2024-10-21 17:31:04

江上酒酒 发表于 2024-10-21 16:26
这个我之前试过,让它单独运行这个时间还是比较准的,但是假设引入一个1毫秒的延时函数,让它连续运行100 ...

1秒的时间比较长,不建议用软件延时,如果你的单片机型号有RTC,可以使用RTC的秒中断,如果没有,使用定时器的自动装载模式,这是硬件完成的,没有误差,就算在中断程序中使用软件累加为一个比较长的时间,也不会产生误差
比如20ms产生一个中断,中断函数内使用const unsigned char累加到50来定时1秒,响应中断时硬件会立即自动重新装载定时器值,不受中断函数执行时间影响,中断函数执行时间远小于20ms即可
注意中断频率要尽量低,避免频繁进入中断影响主程序运行,中断函数执行时间应尽量短,要远小于中断频率,如果中断函数执行时间大于中断周期,则退出中断后又会立即进入中断,主程序就无法运行了

晓飛飛 发表于 2024-10-21 19:29:11

你所谓对不上是说有误差吧,那这个误差你实测有多少,希望误差控制在什么范围内,这些都要量化,不然总觉得不好,总觉得不够,到底要做到什么地步才算好,需要一个量化的东西,比如1分钟误差不超1秒,或者1秒误差不超1毫秒,不同的要求有不同的解决方案,问题太笼统,得到的答案也就很笼统。如果是微秒级的问题,通过NOP空指令的数量调整傻延迟即可,如果是毫秒级的范畴,考虑用定时器或者定时器+软定时器基本能解决所有问题,如果是分钟、小时,甚至年月日的话,用RTC又比较适合。
页: [1] 2
查看完整版本: 关于延时函数