xc8中有一个称为__delay_ms()
的内置函数,可让您获得准确的延迟。
我的问题是您只能输入__delay_ms(1000)
之类的常量值1秒钟。 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,但不能接受const int。
有人对此有任何想法吗?
答案 0 :(得分:1)
__delay_ms()
被实现为宏,并且不能接受变量参数。因此,编写您自己的例程,该例程将所需的延迟作为参数,然后在循环中调用__delay_ms(1)
,以获得所需的尽可能多的延迟。循环会有一些开销,因此,如果需要更精确的时序,则必须对此进行校准。
如果使用看门狗定时器,则在此循环内可以方便地重置看门狗。我不相信__delay_ms()
宏会重置看门狗。
答案 1 :(得分:0)
__delay_ms()
不是一个实函数,它是一个宏,它将扩展为嵌入式汇编指令或嵌套的指令循环,这将占用指定的时间。因此,delay参数必须是一个常量,并且在运行时不能更改。
如果要使用带有参数的实函数,则必须自己编写。最准确的方法是使用PIC的定时器模块。