代码改变世界

ATmega 8 单片机Timer/Counter1总结(1)

2011-10-26 16:16  上帝之骰  阅读(835)  评论(0编辑  收藏  举报

Timer/Counter1 具有输入捕获和双通道输出比较功能。

输入捕获:    

    当外部信号触发输入捕获时,16-bit 计数器TCNT1中的计数值被写入Input Capture Register ICR1,Input Capture Flag ICF1被置位,如果中断被使能,则可以触发中断。中断后,ICF1可以被自动清零,或者可以通过程序向其中写1来清零(很多中断标志位都是这样处理)。

    输入捕获的外部信号可以是IO引脚Input Capture Pin ICP1,或者是模拟比较器的输出,可以通过设置ACIC位来选择(Analog Comparator Input Capture Enable,位于Analog Comparator Control and Status Register – ACSR Bit2)。显然,ACIC = 1,则模拟比较器输出接入输入捕获单元的逻辑前端,否则ICP1有效。

    要注意的是从ICP1或者比较器输入的信号需要经过同步和边缘检测的过程:同步逻辑在每一个系统时钟的上升沿对输入信号进行采样,并将采样信号送给边缘检测逻辑,后者根据ICES1位的设定来确定是否触发捕获时间。这需要消耗2.5-3.5个系统时钟,但是由于系统时钟在MHz,这点延迟一般影响不大。而且对于高速信号,大家肯定会使用专用的逻辑来实现,或者使用频率更高的单片机。

    此外,可以使用noise canceler在边缘检测之前增加额外的4个采样时钟周期,只有4个周期的信号都发生改变,才有可能触发边缘检测。noise canceler可以通过TCCR1B中的ICNC1来使能。

    由于ATmega8 允许在端口输入状态下进行写操作,可以通过软件写ICP1来触发输入捕获。

    使用输入捕获功能时,要小心的是:必须尽快对ICR1进行读取,以免下一次触发到来覆盖本次计数值。在对占空比进行检测时,需要更改检测边沿的方向,这一操作也必须尽快进行,并且在边沿方向改变后ICF1标志位必须软件清零。

写的罗嗦了,底层硬件就是复杂啊,哎。。。