打印
[PIC®/AVR®/dsPIC®产品]

PIC16LF1508的这个延时是如何实现的?

[复制链接]
249|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
还是不明白,这个只是一个宏定义,就执行了一下乘法运算?怎么做到延时长短设定?

使用特权

评论回复
评论
wutaosamuel 2023-8-24 16:29 回复TA
靠_delay(unsigned long x)这个函数, 
5
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

使用特权

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

本版积分规则

7

主题

81

帖子

0

粉丝