打印
[PIC®/AVR®/dsPIC®产品]

关于__delay_ms()的使用问题

[复制链接]
4796|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星ARM|  楼主 | 2016-11-28 22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在mplab x IDE中定义晶体为4M调用__delay_ms(x)时发现这个x的值只能取最大197,我看头文件中类型是unsigned long原型:(unsigned long)(x*(xtal/4000))既然是unsigned  long那么应该可以取很大的值才对啊?为什么我只能取197?希望百忙之中能帮我解惑,谢谢
沙发
xyz549040622| | 2016-11-29 08:46 | 只看该作者
超过197后报错提示什么呢,函数原型的全部代码发上来看看。

使用特权

评论回复
板凳
星星ARM|  楼主 | 2016-11-29 08:59 | 只看该作者
xyz549040622 发表于 2016-11-29 08:46
超过197后报错提示什么呢,函数原型的全部代码发上来看看。

说我的括号中的数太大了,#ifdef __PICCPRO__
/****************************************************************/
/* Built-in delay routine                                        */
/****************************************************************/
#pragma intrinsic(_delay)
extern __nonreentrant void _delay(unsigned long);
// 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

使用特权

评论回复
地板
jili2716| | 2016-11-29 20:30 | 只看该作者
unsigned long在这里是强制转换吧不是变量的数据类型

使用特权

评论回复
5
星星ARM|  楼主 | 2016-11-30 09:11 | 只看该作者
jili2716 发表于 2016-11-29 20:30
unsigned long在这里是强制转换吧不是变量的数据类型

强制转换?晶体是4000000UL那么转换后的值是多少?

使用特权

评论回复
6
jili2716| | 2016-11-30 22:10 | 只看该作者
你看没看过这个延时最底层的函数应该对你有帮助

使用特权

评论回复
7
星星ARM|  楼主 | 2016-12-3 15:46 | 只看该作者
jili2716 发表于 2016-11-30 22:10
你看没看过这个延时最底层的函数应该对你有帮助

就这么简单的计算,我也不知道为什么会出这个问题!!

使用特权

评论回复
8
北极风| | 2016-12-4 11:28 | 只看该作者
__delay_ms()函数调用_delay()函数,_delay()函数如果请求的延时周期太长(约50,659,000 个指令周期),将会产生错误。要实现非常
大的延时,可以多次调用该函数。
《MPLAB XC8 C 编译器 用户指南》上这样解释。

使用特权

评论回复
9
星星ARM|  楼主 | 2016-12-4 15:31 | 只看该作者
北极风 发表于 2016-12-4 11:28
__delay_ms()函数调用_delay()函数,_delay()函数如果请求的延时周期太长(约50,659,000 个指令周期),将 ...

那为什么是50659000?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

91

帖子

0

粉丝