from
http://www.avrbeginners.net/architecture/timers/timers.html
https://arduino-info.wikispaces.com/Timers-Arduino
http://web.engr.oregonstate.edu/~traylor/ece473/lectures/tcnt1-3.pdf
atmege328,是一个8位机,AVR( 1997年,由ATMEL公司挪威设计中心的A先生和V先生,利用ATMEL公司的 内置Flash 存储技术,共同研发出RISC高速 8位 单片机)
定时器时钟
----可以等于系统时钟(从晶振或任何时钟选项使用),
----也可以先由预分频器减慢。当使用预分频器时,您可以获得更大的计时器值,预分频器可以设置为1,8,64,256或1024。
当使用16位(0xFFFF )定时器时,预分频器设置为1024,一个8 MHz的AVR为8.38秒,
直接使用系统时钟相当于分频器设置为1,预分频器也可以设置为8,64,256或1024。
如果直接使用系统时钟(8M时钟)最小的时间分辨率是0.125μs,16位定时器最多可以计时长度是0.008192秒。可以记忆为 --千分之8秒。
由于预分频器每1024个时钟周期递增一次定时器,分辨率也为1024个时钟周期:1024个时钟周期= 0.000128秒, 一个8 MHz的AVR的 16位定时器 加上1024 预分频器 ,可以计数(0xFFFF + 1)* 1024个时钟周期= 67108864个时钟周期,即8.388608秒。可以记忆为-- 8秒。
也可以使用外部引脚作为定时器时钟或通过预分频器停止定时器。
当使用16位(0xFFFF )定时器时
8位定时器的计时器硬件图:
1、定时器时钟(来自系统时钟,预分频系统时钟或外部引脚T0)对T / C寄存器(TCNT0)进行递增计数。
2、当它翻转(0xFF - > 0x00)时,定时器/计数器1 溢出中断标志置位。
如果TIMSK(定时器中断屏蔽寄存器)中的相应位置位(在这种情况下该位被命名为“TOIE0”)并且全局中断使能,则微指令将跳转到相应的中断向量(在2313中这是向量编号7 )。
定时器/计数器--寄存器概述:
[ TCNT1 ] 计数寄存器。
[ TCCR1A / TCCR1B ] 。包括:
----定时器模式,是否以及如何将比较输出引脚连接到Timer1。
----PWM 分频,在寄存器的8位、9位到10位,
----输入噪声过滤器(用计数的方法),也是分频??
----输入捕捉边沿选择
----比较匹配时,是否要清零定时器/计数器1
----预分频器
[ OCR1 ] output compair register
----输出比较寄存器 用于在比较后生成中断。它与TCNT1比较,当两者匹配时,触发比较匹配中断。
[ ICR1 ] input compair register
----输入捕捉寄存器可用于捕捉外部 ICP引脚上 的脉冲边沿。An input capture register (ICRx) is available for capturing the counter value at the occurrence of external (edge) events such as an external pin change or comparator state change.
[ TIMSK和TIFR ]
----定时器中断屏蔽寄存器(TIMSK)和定时器中断标志(TIFR)寄存器用于通过置位TIMSK中的位来控制哪些中断为“有效”,并确定哪些中断正在等待(TIFR)。全局中断使能。
重要注意事项:CPU仅有8位,所以16位寄存器一次只能访问8位(八个比特,一个字节),访问定时器寄存器时使用一个16位的临时寄存器。
16位 写:当写入高字节(TCNT1H和TCNT1A有啥关系??)时,数据被放置在TEMP寄存器中。当写入低字节时,数据一起传输到TCNT寄存器。必须首先写入高字节才能写入16位。
16位 读:读取低字节时,首先读取低字节以获得真正的16位读取。
定时器模式
[普通模式]
在这种模式下,定时器数值一直增加。
它向上计数,从0xFFFF翻转到0x0000时,TCNT1向上计数并触发T / C1溢出中断。小心!定时器的16位计数器仅能 计数1-64K。
[ 输出比较模式 ]
在这种模式下,定时器数值一直增加。
与OCR1A中的值进行比较。当这些值彼此相等时,输出比较中断标志(TIFR中的OCF)置1,可以调用ISR。
[ 输入捕捉模式 ]
在这种模式下,定时器数值一直增加。
可用于测量ICP引脚的次数。一些外部电路产生可用于这种方式的脉冲。可以用它测量电机的转速。您可以将其设置为测量引脚上升沿或下降沿的次数。
[ PWM模式 ]
在这种模式下,定时器先++增加,到达顶峰时--减小
16位定时器的脉宽调制器(PWM)模式。PWM可设置为8,9或10位的分辨率。
某些外部硬件可能需要一个低电平有效的PWM信号,因此可以选择反相和不反相PWM。有硬件反转PWM信号的选项可节省代码空间和处理时间。
PWM在达到TOP值时,才自动写入OCR1的新值,因此防止产生非指定的脉冲宽度。