打印
[AVR单片机]

256发现avr的一个优点

[复制链接]
3814|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电脑圆圆|  楼主 | 2009-11-13 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 电脑圆圆 于 2009-11-13 17:15 编辑

__delay_cycles延迟那可是惊人的精确

测试程序:
TCNT3=0;
USART0_Send(TCNT3>>8);
USART0_Send(TCNT3&0xFF);
TCCR3B |= 0x04; //启动计数器3,256分频
__delay_cycles(11059200);
TCCR3B = 0; //停止计数器3
USART0_Send(TCNT3>>8);
USART0_Send(TCNT3&0xFF);

串口接收:00 00 A8 C0
OxA8C0*256 == 11059200!

相关帖子

沙发
laslison| | 2009-11-13 19:04 | 只看该作者
256指什么?

使用特权

评论回复
板凳
ningling_21| | 2009-11-15 22:16 | 只看该作者
看不太明白...

使用特权

评论回复
地板
XZL| | 2009-11-16 11:11 | 只看该作者
是测量脉宽的实验吗?

使用特权

评论回复
5
电脑圆圆|  楼主 | 2009-11-16 17:00 | 只看该作者
晕死,什么都看不懂。没那么深奥啊!
__delay_cycles是开发环境自带的一个软件延迟程序,如果自己写,肯定得不到精确的延迟时间,而这个延迟函数能够精确得到延迟,__delay_cycles(11059200),晶振为11059200,故延迟1秒,为了验证,我同时运行定时器3,延迟完再停止计数器,再计算计数器所计的时钟个数,得出的结果一样。
  利用这个函数可以方便很多,比如模拟串口,不用花太多的时间去自己弄个可靠的延迟程序

使用特权

评论回复
6
电脑圆圆|  楼主 | 2009-11-16 17:03 | 只看该作者
256哪个误打的,没什么意义

使用特权

评论回复
7
BitFu| | 2009-11-16 19:49 | 只看该作者
如果精确算延时应当在中断中做,这样的延时还占用定时器资源,完全没有必要

使用特权

评论回复
8
电脑圆圆|  楼主 | 2009-11-17 08:00 | 只看该作者
这哪里占定时器资源了?这是个延迟程序,定时器是我用来同这衡量这个延迟的精度

使用特权

评论回复
9
电脑圆圆|  楼主 | 2009-11-17 08:09 | 只看该作者
有些人觉得精确延迟必须用定时器,因为软件延迟占用系统时间,但有时候用延迟是因为延迟这段时间不干别的事情,就算利用定时器也是浪费资源,当定时器精度也没有任何优势,__delay_cycles()就派上用场

使用特权

评论回复
10
huangqi412| | 2009-11-17 08:38 | 只看该作者
一点不奇怪吧.   跟AVR无关,跟编译器有关.

使用特权

评论回复
11
zhiwei| | 2009-11-17 11:18 | 只看该作者
来个中断怎么办?严重影响CPU使用率,就像中病毒一样,呵呵。

使用特权

评论回复
12
电脑圆圆|  楼主 | 2009-11-17 23:50 | 只看该作者
你会中断吗?这能影响中断?

使用特权

评论回复
13
84335262| | 2009-11-18 10:49 | 只看该作者
1.确实会受中断影响,除非你禁止中断,或者你的系统中没有用到中断(如你现在这样)。而一般小系统是都会有中断的。
2.你的结果是分频256以后得出的,也就是说误差都有256个时钟周期。难以证明你说的“惊人的精确”。
3.在不需要精确定时的时候,啥延时程序都行,在需要精确定时……这个还是有点点问题的,个人认为。

使用特权

评论回复
14
yixin1937| | 2009-11-18 14:28 | 只看该作者
同意楼上的说法~有这种可能

使用特权

评论回复
15
电脑圆圆|  楼主 | 2009-11-18 17:25 | 只看该作者
本帖最后由 电脑圆圆 于 2009-11-18 17:52 编辑

因为计数器计数上线是65535,而我要计数超过11059200,故需分频,若计数为65535以下不分频,误差为2clk,这个误差也可以认为是先开计数器和后停计数器指令所多走的clk,故误差为0;

使用特权

评论回复
16
电脑圆圆|  楼主 | 2009-11-18 17:49 | 只看该作者
zhiwei:
avr跟电脑不一样知道吗?他不能随时加软件,所有的中断,所有可以预想的可能都得考虑在内,如果你使用mcu发现病毒说明你的程序有bug

使用特权

评论回复
17
电脑圆圆|  楼主 | 2009-11-18 17:56 | 只看该作者
84335262:
这里我导论的是需要精确的延迟,为什么我需要延迟?因为这段时间我不想干别的事情,简单吧?

使用特权

评论回复
18
donkey89| | 2009-11-18 21:32 | 只看该作者
暴汗,一个延时也讨论半天.要精确一定得用定时器,它就是干这个的

使用特权

评论回复
19
84335262| | 2009-11-19 00:01 | 只看该作者
17# 电脑圆圆
嗯,如果你只是要做一个定时器的话那确实没啥两样。特别是你用汇编做的话,效果可以做到完全相同:lol

使用特权

评论回复
20
电脑圆圆|  楼主 | 2009-11-19 08:00 | 只看该作者
我只想说__delay_cycles这个延迟精确,借此推荐给大家,没想冒出这么多bug,O(∩_∩)O~

使用特权

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

本版积分规则

12

主题

251

帖子

0

粉丝