定时计数器1 和 溢出中断 有“奸情”

     既然学AVR,那就不能不说说他的这么多的寄存器啦,霍霍,初学时用到的就只有3个寄存器,PORT,DDR,PIN,学到后来才知道AVR功能之多以比51强大,强大在哪里的?霍霍,秘密当然就在寄存器里面啦,大家都知道,AVR的管脚有2个功能,他的第二功能常常是鲜为人知的,今天想说的就是定时计数器啦,AVR中有三个计数器,其中只有计数器1是16位的,每过一个时钟,定时计数器就会自动的加1,当然,定时计数器1有最大值(0xFFFF),当他达到最大之后,就会产生一个中断,此时,如果我们编写一个中断函数,当中断被使能时,进入中断函数,将一个变量加1,就形成了一个秒表,好,接下来就让我们看看产生该功能所需要的寄存器吧~~~

1:TCCR1B

image

此时我们只需要用到CS12,CS11,CS10,这三个是干嘛用的呢,霍霍,是用来预分频用的,就是将AVR的时钟分割一下,不需要8M那么快,如果我们把8M的时钟256分频,那么每过t秒(t=(1/(8M/256))),定时计数器1就加1,所以我们就要…嘿嘿,给定时器一个初始值, 让他从初始值开始自加,达到最大值后,自然会进入中断函数咯~~~0xFFFF的十进制是65535,所以初始值就是:65535-(8M/256),接下来怎么给定时器赋予一个初始值了?霍霍,请看接下来:

2:TCNT1H与TCNT1L

image

因为定时器1是一个16位的,所以给他分了两个寄存器来储存数据,分别是高位,和地位,如果我想把568F赋值给定时器,就可以这样写:TCNT1H=56;TCNT1L=8F;定时器就是从这个初始值开始自加的…还有最后一布,怎么写中断呢?霍霍,欲知后事如何,请听接下来的分解:

3:TIMSK和SREG

image

这里我们用到这个寄存器也只是用到一部分,即TOIE1,这个是给定时器1的溢出使能,高电平有效,还有千万不要忘了开启全局中断:SREG|BIT(7)这个都忘了,那前面的功夫就白费了…

 

     霍霍,这样一来,定时器1的普通模式就告一段落啦,接下来编写秒表的那点事就靠大家自己领悟啦,霍霍,有不正确的地方还请大家指出来,共同学习,共同进步…未完待续…

posted @ 2010-07-31 15:01  Second Life  阅读(1106)  评论(0编辑  收藏  举报