[PIC®/AVR®/dsPIC®产品] 关于__delay_ms()的使用问题

[复制链接]
 楼主| 星星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在这里是强制转换吧不是变量的数据类型
 楼主| 星星ARM 发表于 2016-11-30 09:11 来自手机 | 显示全部楼层
jili2716 发表于 2016-11-29 20:30
unsigned long在这里是强制转换吧不是变量的数据类型

强制转换?晶体是4000000UL那么转换后的值是多少?
jili2716 发表于 2016-11-30 22:10 | 显示全部楼层
你看没看过这个延时最底层的函数应该对你有帮助
 楼主| 星星ARM 发表于 2016-12-3 15:46 来自手机 | 显示全部楼层
jili2716 发表于 2016-11-30 22:10
你看没看过这个延时最底层的函数应该对你有帮助

就这么简单的计算,我也不知道为什么会出这个问题!!
北极风 发表于 2016-12-4 11:28 | 显示全部楼层
__delay_ms()函数调用_delay()函数,_delay()函数如果请求的延时周期太长(约50,659,000 个指令周期),将会产生错误。要实现非常
大的延时,可以多次调用该函数。
《MPLAB XC8 C 编译器 用户指南》上这样解释。
 楼主| 星星ARM 发表于 2016-12-4 15:31 来自手机 | 显示全部楼层
北极风 发表于 2016-12-4 11:28
__delay_ms()函数调用_delay()函数,_delay()函数如果请求的延时周期太长(约50,659,000 个指令周期),将 ...

那为什么是50659000?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

95

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

9

主题

95

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部