搜索
bottom↓
回复: 20

一种简单精确的pic延时方法

[复制链接]

出0入0汤圆

发表于 2015-7-24 13:07:50 | 显示全部楼层 |阅读模式
本帖最后由 dengke 于 2015-7-24 13:09 编辑

写程序缺不了延时函数,记得刚开始学习pic的时候总是自己写for延时函数,可是自己写for延时函数有两个缺点,一是换了晶振以后for语句还得重新计算,调试,非常麻烦,二是他的精确度不高。后来发现其实我们完全不必如此,microchip提供了一种特别好的方法,就是只要宏定义了#define _XTAL_FREQ 12000000(之所以这样写,是因为我用的是12M晶振,12M=1200000,如果用4M晶振的话就写#define _XTAL_FREQ 4000000),就可以调用__delay_us();和__delay_ms();等这些延时函数。(谁说我们pic不好用)
使用方法详情见下面网址(内容已经放在附件中了)
http://wenku.baidu.com/link?url= ... dbqXZJB4phD9REbrkqa
这个是怎么实现的呢?我们可以在编译器手册MPLAB XC8 C Compiler User中的第59页找到下面这段话:

发现了这种方法其实就是循环调用NOP();函数,之所以要宏定义就是为了让编译器知道一个__delay_us(1);对应几个指令周期也就是几个NOP();函数。而这个其实就是编译器的事了。
注:这种方法并不是十分精准的,想要特别精准的延时就需要用到定时器了。当然相对自己写的延时函数也已经是十分准确的了。
不仅xc8编译器支持这种方法,picc编译器也支持。



这种方法为什么能用 百度谷歌都没查到,mplab官网也没特别说明,所以在这水一贴。(当时我一直在pic的芯片手册找原因,以为这个是写进去以后单片机调用定时器啥的,实现的精准延时。后来仔细想想发现自己错了,这个应该是编译器的事,不应该在芯片手册中找,要在编译器手册中找,于是在官网找到MPLAB XC8 C Compiler User这本书,终于发现原因。绕了个的弯路)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-8-1 12:18:53 来自手机 | 显示全部楼层
学习,回家下载,谢谢你的总结

出0入0汤圆

发表于 2015-8-1 23:45:53 | 显示全部楼层
凑个热闹,发个中文版的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-8-2 01:05:11 来自手机 | 显示全部楼层
AVR也是一样的,更准些

出0入0汤圆

 楼主| 发表于 2015-8-2 08:02:18 | 显示全部楼层
zhuxm 发表于 2015-8-1 23:45
凑个热闹,发个中文版的。

哈哈,谢谢。

出0入0汤圆

 楼主| 发表于 2015-8-2 08:03:03 | 显示全部楼层
chenliangliang_ 发表于 2015-8-2 01:05
AVR也是一样的,更准些

搜嘎,没用过AVR    0.0

出0入0汤圆

发表于 2015-12-22 15:43:38 | 显示全部楼层
用这种方法,如果大延时,里边是否有加清看门狗指令?

出0入0汤圆

发表于 2015-12-22 16:03:43 | 显示全部楼层
有中断来还准么?

出0入0汤圆

发表于 2016-3-19 15:30:28 | 显示全部楼层
调用 __delay_us();,是要用 什么头文件的啊?我这边 报错,编译不通过

出0入0汤圆

 楼主| 发表于 2016-3-19 20:54:03 | 显示全部楼层
llww30402048 发表于 2016-3-19 15:30
调用 __delay_us();,是要用 什么头文件的啊?我这边 报错,编译不通过

定义这语句#define _XTAL_FREQ 12000000就可以

出0入0汤圆

发表于 2016-3-20 11:40:16 | 显示全部楼层
dengke 发表于 2016-3-19 20:54
定义这语句#define _XTAL_FREQ 12000000就可以

我用的是 C18 编译器,这样不行,调用不了 __delay 函数

出0入0汤圆

发表于 2016-3-27 22:53:28 | 显示全部楼层
我试过 用PICC 可以 xc也可以

出0入0汤圆

发表于 2016-3-27 23:02:53 | 显示全部楼层
这种方法我在看到帖子后在PIC12F1572中应用了   可以使用,我用的是内部16M晶振   us函数调用的时间是多少没有验证,MS大致是正确的

出0入0汤圆

发表于 2016-4-16 14:22:58 | 显示全部楼层
感谢分享。。。。。

出0入0汤圆

发表于 2016-4-17 12:48:56 | 显示全部楼层
Microchip 有些程式碼改用狀態機的方式運作,雖然裡面是用Timer去做延時,不過適合延時比較長時間,時間短的還是樓主方法好__delay_us(1);很方便 ,XC8會編譯錯誤的注意一下 _ _ 是兩個底線,這之前我常出錯。

出0入0汤圆

发表于 2016-8-25 23:37:40 | 显示全部楼层
经常用不知道准不准

出0入0汤圆

发表于 2016-8-26 08:49:37 | 显示全部楼层
谢谢分享,收下了

出0入0汤圆

发表于 2018-8-28 14:34:03 | 显示全部楼层
了解一下

出0入0汤圆

发表于 2018-8-29 09:49:22 | 显示全部楼层
谢谢分享  辛苦了

出0入0汤圆

发表于 2018-8-29 10:24:34 | 显示全部楼层
長知識,謝謝分享

出0入0汤圆

发表于 2018-9-27 20:50:54 | 显示全部楼层
这种宏定义延时在简单的小程序用可以。复杂点的程序用头文件里的宏定义延时编译后会占用更多空间。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表