[PIC®/AVR®/dsPIC®产品] PIC16LF1508的这个延时是如何实现的?

[复制链接]
 楼主| 1564564 发表于 2023-8-21 10:46 | 显示全部楼层 |阅读模式
下面的代碼是參考别人的,问一下这个延时函数是怎么实现的?
芯片是pic16lf1508;
#define _XTAL_FREQ 31000
在函数中看到下面这个ms延时函数,然后go to去看了看;
__delay_ms(30);

#define _XTAL_FREQ 31000

#ifdef __PICCPRO__
/****************************************************************/
/* Built-in delay routines                                        */
/****************************************************************/
// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif


还有我的时钟频率是31k;
// SCS INTOSC; IRCF 31KHz_LF;
    OSCCON = 0x02;

就上面的两行代码,一个us一个ms的,二者进率我明白,但是31000/4000 不是近似等于8嘛?就算指令时钟是系统时钟的4倍,结果不也是31嘛?为什么是ms的延时呢?就是这个疑问。
wutaosamuel 发表于 2023-8-22 15:39 | 显示全部楼层
首先,一个指令周期需要4个系统周期(时钟频率),也就是时钟周期是系统周期4倍,假设系统周期为31k,那么指令周期为31k/4,单位赫兹。
所以,时钟一个振荡需要1/31k,而运行一个指令需要4/31k, 单位为秒。
而1ms= 0.001s (=1/1k),也就需要大概8个指令(1ms / 一个指令需要的时间 = 1/1k * 31k/4 = 31/4 个指令)
 楼主| 1564564 发表于 2023-8-23 08:55 | 显示全部楼层
wutaosamuel 发表于 2023-8-22 15:39
首先,一个指令周期需要4个系统周期(时钟频率),也就是时钟周期是系统周期4倍,假设系统周期为31k,那么 ...

感谢大佬
goyhuan 发表于 2023-8-23 19:03 | 显示全部楼层
还是不明白,这个只是一个宏定义,就执行了一下乘法运算?怎么做到延时长短设定?

评论

靠_delay(unsigned long x)这个函数,  发表于 2023-8-24 16:29
wutaosamuel 发表于 2023-8-24 14:19 | 显示全部楼层
主要是根据运行指令的时间,1ms的延迟需要运行31/4个指令(其实就运行7个指令)

宏定义中的_delay(unsigned long x)这个函数会运行x个asm("nop"),nop指令是无操作的空指令,cpu会运行一次指令但是cpu不会做任何动作。
也就是说如果1ms延迟需要7个指令,那么_delay(7),就代表1ms
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

114

帖子

0

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

11

主题

114

帖子

0

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