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

xc8编译器自带的延时函数

[复制链接]
1600|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
__delay_ms(x) // request a delay in milliseconds
__delay_us(x) // request a delay in microseconds
__delaywdt_ms(x) // request a delay in milliseconds
__delayw
宏参数必须为常量表达式。如果使用这些宏时未定义振荡器频率符号、所请求的延时周期太大或延时周期不是常量,将会产生错误。


使用特权

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



使用特权

评论回复
板凳
598330983|  楼主 | 2024-3-25 22:36 | 只看该作者
这种函数最好用,不知道跟时钟配置关联不,是否比较准。

使用特权

评论回复
地板
CoolSilicon| | 2024-3-26 10:51 | 只看该作者
看编译器手册的话, 你会发现这些宏,实际上会搭配一个 时钟频率定义的宏来使用的.
不然的话, 它也不知道你时钟到底跑多少, delay的延时也不会准确的.

使用特权

评论回复
5
CoolSilicon| | 2024-3-26 10:51 | 只看该作者
如果不想看手册的话, 其实也可以.
编译器会自动提示你没有定义,然后根据报的错,改一下就可以了..

使用特权

评论回复
6
我想看大海| | 2024-3-26 13:39 | 只看该作者
这个延时函数挺好的,不用自己搞

使用特权

评论回复
7
我想看大海| | 2024-3-26 13:39 | 只看该作者
但是这种基于编译器的延时函数在哪种MCU上都能一样的延时效果吗

使用特权

评论回复
8
我喜欢打游戏| | 2024-3-26 14:04 | 只看该作者
在不同主频的MCU上延时效果一样吗

使用特权

评论回复
9
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也相似, 也利用系统时钟来计算。

使用特权

评论回复
10
黑心单片机| | 2024-3-26 14:33 | 只看该作者
这是根据单片机的主频来构建的吗

使用特权

评论回复
11
药无尘| | 2024-3-27 11:40 | 只看该作者
自带的函数好,希望可以多一些

使用特权

评论回复
12
盗铃何须掩耳| | 2024-3-27 11:42 | 只看该作者
这个准确度咋样

使用特权

评论回复
13
可怜的小弗朗士| | 2024-3-27 13:41 | 只看该作者
自带延时函数,很方便

使用特权

评论回复
14
wutaosamuel| | 2024-3-27 14:28 | 只看该作者
是,需要根据不同主频调整
如果使用MCC生成代码的话,会自动调整

使用特权

评论回复
15
wutaosamuel| | 2024-3-28 09:45 | 只看该作者

都还可以,AVR核是单发流水线,__delay_ms()计算通过__delay()*主频/1000来计算
而PIC核是4发流水线的架构__delay_ms()计算通过__delay()*主频/4000计算, 因为除**取整数,有些主频可能会导致除不尽,可能会影响准确度

使用特权

评论回复
16
micoccd| | 2024-3-28 10:44 | 只看该作者
可以自动调整的话那确实好

使用特权

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

本版积分规则

249

主题

5397

帖子

22

粉丝