Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1035129
  • 博文数量: 178
  • 博客积分: 10222
  • 博客等级: 上将
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-03 11:27
个人简介

有所追求

文章分类

全部博文(178)

文章存档

2012年(1)

2011年(5)

2010年(3)

2009年(78)

2008年(91)

我的朋友

分类:

2009-03-28 23:46:31

前两个系列讨论了自由运行计数器的时钟基准和定时溢出问题,这一次讨论一下TCNT时间的计算问题.


    
尽管可以复位TCNT,TCNT可以置O,但是在操作之前必须十分小心,所有的计时通道都是从TCNT得到它们的时钟基准.因此,TCNT通过复位来使某个应用的定时器从$0000开始,其它的计时通道可能也会被影响.所以应该习惯于耗用时间而不是复位定时器.也就是说,必须计算关键事件之间的时间差.另外还要考虑定时器溢出.


   
计算耗用的时间就是用停止时的时间减去开始时的时间,这对自由运行计数器来说稍微有些复杂.通常,当对某个事件计时时,计数器不会复位.因此,可能会遇到不同的计时情况.   最简单的情况:停止时间大于开始时间,且没有发生定时器溢出.这种情况下,耗用的时间就是停止时间减去开始时间,将脉冲数乘以TCNT的时钟周期,就可以将耗用时钟脉冲数转化为真实的时间.


    
另外还有一种情况是:停止时间小于开始时间,并且发生了一次TCNT溢出.


    
还是举个例子:比如前一个脉冲的下降沿进了中断,此时TCNTdata1,后一个肪冲的下降沿也进了中断,此时TCNTdata2,那么data2-data1就是二者的间隔时间。但是会有个问题,如果data2data1小,即TCNT溢出了一次,怎么办?这个不用但心,无符号数的情况下,1415254.对于16位的数运算一样的道理。呵呵,TCNT溢出一次好解决,多次呢?对了,TOF溢出中断,记录TCNT溢出的次数,再做运算就行了。但是似乎没有那个必要了,TCNT本来就是16位的,这样一来,data2-datAa1就不知道是多少位了,数据太大了,没有必要,还不如调节TCNT的时钟基准.


    无论什么情况,可以用一个简单的等式搞定:
    1
:耗时的时钟脉冲数=(nX216次方)+(停止计数-开始计数)
    2
:耗用的时间=(耗用的时钟脉冲数)X(TCNT时钟周期)


1
式中:n表示开始和停止这间(TOF)定时器溢出个数.
由于TOF的个数在正确计算耗用时间时非常重要,因此要确保计算出的耗用时间的精确性,每次定时器溢出标志(TOF)置位后都必须将其复位.

阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~