OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 19520|回复: 11

pic程序延时函数为何宏定义后就能使用__delay_us();和__delay_ms();

[复制链接]

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-7-3 18:03:27 | 显示全部楼层 |阅读模式

写程序缺不了延时函数,microchip提供了一种特别好的方法,就是只要宏定义了#define _XTAL_FREQ 12000000(之所以这样写,是因为我用的是12M晶振,12M=1200000),就可以调用__delay_us();和__delay_ms();等这些延时函数。

使用方法详情见下面网址

http://wenku.baidu.com/link?url=A-9ZSOIyMgHADXB6SahPz5LjF95Eyf0NKGCPxb7iDwzysK06tL_5sQrKynBWXKlGd7VkVaASx1HQ74NKe5nz-9LCdbqXZJB4phD9REbrkqa

 

但是这是怎么实现的呢?之前一直是不求甚解,学长教给我们这样用就这样用,而且学长说这个十分准确,用了很长时间,也不知道是怎么实现的,百度谷歌都没查到,mplab官网也没特别说明,无奈只能自己找了。

之前一直在芯片手册找,以为这个是写进去以后单片机调用定时器啥的,实现的精准延时。后来仔细想想发现自己错了,这个应该是编译器的事,不应该在芯片手册中找,要在编译器手册中找,于是在官网找到MPLAB XC8 C Compiler User这本书,终于发现原因。

 在手册的第59页终于发现下面这段话:

p59

   发现了自己之前的两个错误:①这种方法并不是十分精准的,想要特别精准的延时需要定时器。当然也已经十分准确了。

②这种方法其实就是调用NOP();函数,根本没用到定时器啥的,之所以要宏定义就是为了让编译器知道一个__delay_us(1);对应几个指令周期也就是几个NOP();函数。而这个其实就是编译器的事了。



终于解决了,虽然没有太大用,但是还是心情大好。分享出来,因为没人写过这么简单的问题,看来以后还得多看看手册。

Good good study , day day up...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-3 21:14:10 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2015-4-28
在线时间
2 小时
发表于 2015-10-21 15:56:58 | 显示全部楼层
钻研精神,佩服  ,我时常也是这样郁闷
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-10-28 20:31:35 | 显示全部楼层
就是指令周期!不可能很准确,除非你把中断关闭!
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-10-28 21:01:48 | 显示全部楼层
回复【4楼】无痕幽雨:
---------------------------------
这个和中断有什么关系?
Good good study , day day up...
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-10-28 21:35:11 | 显示全部楼层
回复【5楼】Just Beat It:
---------------------------------
软件延时时候禁止中断,再把调用延时函数的出栈和压栈指令算进去,这样的软件延时误差不会很大,会做到准确!你说和关闭中断有没有关系????不关闭中断,怎么保证软件延时准确性???
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
 楼主| 发表于 2015-10-28 21:39:03 | 显示全部楼层
回复【6楼】无痕幽雨:
---------------------------------
奥奥,才理解您说的意思,谢谢提醒
Good good study , day day up...
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-2-1
在线时间
1 小时
发表于 2016-3-28 21:44:55 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2015-4-24
在线时间
72 小时
发表于 2016-4-6 17:37:36 | 显示全部楼层
牛逼,服
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-4-9
在线时间
12 小时
发表于 2016-7-26 10:48:16 | 显示全部楼层
谢谢分享,已解惑
回复 支持 反对

使用道具 举报

1

主题

59

帖子

0

精华

高级会员

Rank: 4

积分
966
金钱
966
注册时间
2012-3-27
在线时间
285 小时
发表于 2018-3-22 21:45:27 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-10-23
在线时间
0 小时
发表于 2020-4-14 15:19:12 | 显示全部楼层
钻研的精神值得称赞!给你点赞!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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