首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带PIC XC8和__delay_ms()函数的常参数问题

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

Stack Overflow用户
提问于 2019-04-14 18:04:37
回答 2查看 3.4K关注 0票数 1

在xc8中有一个名为__delay_ms()的内置函数,它允许您实现精确的延迟。

我的问题是,您只能在1秒内输入像__delay_ms(1000)这样的常量值。MPLAB给出了误差

“内联延迟参数必须是常数”

我希望能够在这个变量中添加一个变量,这取决于来自PC GUI和EUSART RX的用户所需的延迟。

我试过使用const int,但这不起作用。

有谁想过怎么做吗?也许是某种方式来操纵这个功能?

更新-我在XC8的pic.h头文件中找到了内置的延迟例程。

守则是:

代码语言:javascript
运行
复制
/****************************************************************/
/* 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。

有人对此有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-15 14:55:36

__delay_ms()是作为宏实现的,不能接受变量参数。因此,编写自己的例程,将所需的延迟作为参数,然后在循环中为任意多个ms延迟调用__delay_ms(1)。循环将有一些轻微的开销,所以如果您需要更精确的时间,您将不得不校准这一点。

如果您使用的是看门狗计时器,在这个循环内是一个方便的地方重置看门狗。我不相信__delay_ms()宏会重置看门狗。

票数 1
EN

Stack Overflow用户

发布于 2019-04-15 05:51:02

__delay_ms()不是一个真正的函数,它是一个宏,它将扩展到在线程序集指令中,或者是一个嵌套的指令循环,它将消耗指定的时间。因此,延迟参数必须是常量,不能在运行时更改。

如果您想要一个带有参数的实际函数,您必须自己编写它。最精确的方法是与您的PIC计时器模块一起工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55678417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档