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



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。

有人对此有任何想法吗?

__delay_ms() 作为宏实现,不能接受变量参数。因此,编写您自己的例程,将所需的延迟作为参数,然后在循环中调用__delay_ms(1),以获得任意数量的毫秒延迟。循环会有一些轻微的开销,所以如果你需要更精确的计时,你必须校准它。

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

__delay_ms()

是一个真正的函数,它是一个宏,它将扩展为内联汇编指令或将消耗指定时间的嵌套指令循环。因此,delay 参数必须是一个常量,并且在运行时不能更改。

如果你想要一个带有参数的实函数,你必须自己编写它。最准确的方法是使用 PIC 的计时器模块。

相关内容

  • 没有找到相关文章