在xc8中有一个名为__delay_ms()
的内置函数,它允许您实现精确的延迟。
我的问题是,您只能在1秒内输入像__delay_ms(1000)
这样的常量值。MPLAB给出了误差
“内联延迟参数必须是常数”
我希望能够在这个变量中添加一个变量,这取决于来自PC GUI和EUSART RX的用户所需的延迟。
我试过使用const int,但这不起作用。
有谁想过怎么做吗?也许是某种方式来操纵这个功能?
更新-我在XC8的pic.h头文件中找到了内置的延迟例程。
守则是:
/****************************************************************/
/* Built-in delay routine */
/****************************************************************/
#pragma intrinsic(_delay)
extern __nonreentrant void _delay(unsigned long);
#pragma intrinsic(_delaywdt)
extern __nonreentrant void _delaywdt(unsigned long);
#if defined(_PIC14E)
#pragma intrinsic(_delay3)
extern __nonreentrant void _delay3(unsigned char);
#endif
// 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
我假设在另一个XC8头文件中的某个位置,x被编程为只接受一个常量,即1000,但不能接受一个constant。
有人对此有什么想法吗?
发布于 2019-04-15 14:55:36
__delay_ms()
是作为宏实现的,不能接受变量参数。因此,编写自己的例程,将所需的延迟作为参数,然后在循环中为任意多个ms延迟调用__delay_ms(1)
。循环将有一些轻微的开销,所以如果您需要更精确的时间,您将不得不校准这一点。
如果您使用的是看门狗计时器,在这个循环内是一个方便的地方重置看门狗。我不相信__delay_ms()
宏会重置看门狗。
发布于 2019-04-15 05:51:02
__delay_ms()
不是一个真正的函数,它是一个宏,它将扩展到在线程序集指令中,或者是一个嵌套的指令循环,它将消耗指定的时间。因此,延迟参数必须是常量,不能在运行时更改。
如果您想要一个带有参数的实际函数,您必须自己编写它。最精确的方法是与您的PIC计时器模块一起工作。
https://stackoverflow.com/questions/55678417
复制相似问题