【问题标题】:Constant argument problem with PIC XC8 and __delay_ms() functionPIC XC8 和 __delay_ms() 函数的常量参数问题
【发布时间】:2019-04-14 18:04:37
【问题描述】:

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 mplab xc8


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      __delay_ms() 不是一个真正的函数,它是一个宏,将扩展为内联汇编指令或指令的嵌套循环,将消耗指定的时间。所以延迟参数必须是一个常数,并且在运行时不能改变。

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

      【讨论】:

      • 嗨,迈克,我在 XC8 的 pic.h 头文件中找到了该宏,但不知道 x 值是什么以及它只是一个常数。这已添加到我的原始线程中。
      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多