[PIC®/AVR®/dsPIC®产品] xc8编译器自带的延时函数

[复制链接]
2677|15
 楼主| 598330983 发表于 2024-3-12 15:53 | 显示全部楼层 |阅读模式
  1. __delay_ms(x) // request a delay in milliseconds
  2. __delay_us(x) // request a delay in microseconds
  3. __delaywdt_ms(x) // request a delay in milliseconds
  4. __delayw
宏参数必须为常量表达式。如果使用这些宏时未定义振荡器频率符号、所请求的延时周期太大或延时周期不是常量,将会产生错误。


 楼主| 598330983 发表于 2024-3-12 15:54 | 显示全部楼层
  1. #include <xc.h>
  2. void _delay(unsigned long cycles);
  3. void _delaywdt(unsigned long cycles);
这是一个由代码生成器进行扩展的内联函数。在调用时,该程序将扩展为内联汇编延时序列。序列将包含根据参数延迟指定指令周期数的代码。参数必须为常量表达式。
_delay 内联函数可以使用循环和 NOP 指令来实现延时。只有在 PIC18 器件上,_delaywdt 内联函数执行相同的任务,但可以使用 CLRWDT 指令以及循环来实现指定
的延时。
如果所请求的延时周期不是常量表达式或太大(对于 PIC18 器件约为 179,200 条指令,对于其他 8 位 PIC 器件约为 50,659,000 条指令),将会产生错误。要实现非常大的延时,可以多次调用该函数。
  1. #include <xc.h>
  2. void
  3. main(void)
  4. {
  5. control |= 0x80;
  6. _delay(10); // delay for 10 cycles
  7. control &= 0x7F;
  8. }



 楼主| 598330983 发表于 2024-3-25 22:36 | 显示全部楼层
这种函数最好用,不知道跟时钟配置关联不,是否比较准。
CoolSilicon 发表于 2024-3-26 10:51 | 显示全部楼层
看编译器手册的话, 你会发现这些宏,实际上会搭配一个 时钟频率定义的宏来使用的.
不然的话, 它也不知道你时钟到底跑多少, delay的延时也不会准确的.

CoolSilicon 发表于 2024-3-26 10:51 | 显示全部楼层
如果不想看手册的话, 其实也可以.
编译器会自动提示你没有定义,然后根据报的错,改一下就可以了..
我想看大海 发表于 2024-3-26 13:39 | 显示全部楼层
这个延时函数挺好的,不用自己搞
我想看大海 发表于 2024-3-26 13:39 | 显示全部楼层
但是这种基于编译器的延时函数在哪种MCU上都能一样的延时效果吗
我喜欢打游戏 发表于 2024-3-26 14:04 | 显示全部楼层
在不同主频的MCU上延时效果一样吗
wutaosamuel 发表于 2024-3-26 14:20 | 显示全部楼层
肯定和时钟频率相关联的,虽然效率不高,但是还算是比较准的了
如果直接使用_delay()函数,是需要计算1ms有多少个时钟周期或者1us有多少个时钟周期
在8位pic方面, 可以使用__delay_us()和__delay_ms()函数, 具体实现在builtin.h头文件中。而其中的_XTAL_FREQ就是cpu现在用的系统频率。我这里设置的是4MHz,可以在clock.h文件中找到


而8位AVR也相似, 也利用系统时钟来计算。

本帖子中包含更多资源

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

×
黑心单片机 发表于 2024-3-26 14:33 | 显示全部楼层
这是根据单片机的主频来构建的吗
药无尘 发表于 2024-3-27 11:40 | 显示全部楼层
自带的函数好,希望可以多一些
盗铃何须掩耳 发表于 2024-3-27 11:42 | 显示全部楼层
这个准确度咋样
可怜的小弗朗士 发表于 2024-3-27 13:41 | 显示全部楼层
自带延时函数,很方便
wutaosamuel 发表于 2024-3-27 14:28 | 显示全部楼层
是,需要根据不同主频调整
如果使用MCC生成代码的话,会自动调整
wutaosamuel 发表于 2024-3-28 09:45 | 显示全部楼层

都还可以,AVR核是单发流水线,__delay_ms()计算通过__delay()*主频/1000来计算
而PIC核是4发流水线的架构__delay_ms()计算通过__delay()*主频/4000计算, 因为除**取整数,有些主频可能会导致除不尽,可能会影响准确度
micoccd 发表于 2024-3-28 10:44 | 显示全部楼层
可以自动调整的话那确实好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

5575

帖子

22

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