PIC XC8和__delay_ms()函数的常数参数问题

时间:2019-04-14 18:04:37

标签: delay mplab xc8

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。

有人对此有任何想法吗?

2 个答案:

答案 0 :(得分:1)

__delay_ms()被实现为宏,并且不能接受变量参数。因此,编写您自己的例程,该例程将所需的延迟作为参数,然后在循环中调用__delay_ms(1),以获得所需的尽可能多的延迟。循环会有一些开销,因此,如果需要更精确的时序,则必须对此进行校准。

如果使用看门狗定时器,则在此循环内可以方便地重置看门狗。我不相信__delay_ms()宏会重置看门狗。

答案 1 :(得分:0)

__delay_ms()不是一个实函数,它是一个宏,它将扩展为嵌入式汇编指令或嵌套的指令循环,这将占用指定的时间。因此,delay参数必须是一个常量,并且在运行时不能更改。

如果要使用带有参数的实函数,则必须自己编写。最准确的方法是使用PIC的定时器模块。