新闻中心

EEPW首页>嵌入式系统>设计应用> AVR单片机(学习ing)-ATMEGA16的定时/计数器

AVR单片机(学习ing)-ATMEGA16的定时/计数器

作者: 时间:2016-11-27 来源:网络 收藏
6)T/C1 中断屏蔽寄存器- TIMSK


• Bit 5 – TICIE1: T/C1 输入捕捉中断使能
当该位被设为"1”,且状态寄存器中的I 位被设为"1” 时, T/C1 的输入捕捉中断使能。一
旦TIFR 的ICF1 置位,CPU 即开始执行T/C1 输入捕捉中断服务程序( 见P43 “ 中断” )。
• Bit 4 – OCIE1A: 输出比较 A 匹配中断使能
当该位被设为"1”,且状态寄存器中的I 位被设为"1” 时, T/C1 的输出比较A 匹配中断使
能。一旦TIFR 上的OCF1A 置位,CPU 即开始执行T/C1 输出比较A 匹配中断服务程序。
• Bit 3 – OCIE1B: T/C1 输出比较 B 匹配中断使能
当该位被设为"1”,且状态寄存器中的I 位被设为"1” 时,使能T/C1 的输出比较B 匹配中
断使能。一旦TIFR 上的OCF1B 置位,CPU 即开始执行T/C1 输出比较B 匹配中断服务
程序。
• Bit 2 – TOIE1: T/C1 溢出中断使能
当该位被设为"1”,且状态寄存器中的I 位被设为”1” 时, T/C1 的溢出中断使能。一旦
TIFR 上的TOV1 置位, CPU 即开始执行T/C1 溢出中断服务程序。
7)T/C 中断标志寄存器- TIFR


• Bit 5 – ICF1: T/C1 输入捕捉标志位
外部引脚ICP1 出现捕捉事件时ICF1 置位。此外,当ICR1 作为计数器的TOP 值时,一
旦计数器值达到TOP, ICF1 也置位。
执行输入捕捉中断服务程序时ICF1 自动清零。也可以对其写入逻辑"1” 来清除该标志位。
• Bit 4 – OCF1A: T/C1 输出比较 A 匹配标志位
当TCNT1 与OCR1A 匹配成功时,该位被设为"1”。
强制输出比较(FOC1A) 不会置位OCF1A。
执行强制输出比较匹配A 中断服务程序时OCF1A 自动清零。也可以对其写入逻辑"1” 来
清除该标志位。
• Bit 3 – OCF1B: T/C1 输出比较 B 匹配标志位
当TCNT1 与OCR1B 匹配成功时,该位被设为"1”。
强制输出比较(FOC1B) 不会置位OCF1B。
执行强制输出比较匹配B 中断服务程序时OCF1B 自动清零。也可以对其写入逻辑"1” 来
清除该标志位。
• Bit 2 – TOV1: T/C1 溢出标志
该位的设置与T/C1 的工作方式有关。工作于普通模式和CTC 模式时,T/C1 溢出时TOV1
置位。对工作在其它模式下的TOV1 标志位置位,执行溢出中断服务程序时OCF1A 自动清零。也可以对其写入逻辑"1” 来清除该标志位。
6、8 位有PWM 与异步操作的定时器/ 计数器2
小小介绍~~~
T/C2 是一个通用单通道8 位定时/ 计数器,其主要特点如下:
• 单通道计数器
• 比较匹配时清零定时器 ( 自动重载)
• 无干扰脉冲, 相位正确的脉宽调制器 (PWM)
• 频率发生器
• 10 位时钟预分频器
• 溢出与比较匹配中断源(TOV2 与OCF2)
• 允许使用外部的32 kHz 手表晶振作为独立的I/O 时钟源
其实这里重要的应该是异步操作,这里只是简单介绍一下下,后面会有实验专门来操作的,尽量给力~~~这里我也不详细介绍了,重要的是后面的寄存器
寄存器:
定时器/ 计数器TCNT2、输出比较寄存器OCR2 为8 位寄存器。中断请求( 图中简写为
Int.Req.)。信号在定时器中断标志寄存器TIFR 都有反映。 所有中断都可以通过定时器中
断屏蔽寄存器TIMSK 单独进行屏蔽。图中未给出TIFR 与TIMSK。
T/C 的时钟可以为通过预分频器的内部时钟或 通过由TOSC1/2 引脚接入的异步时钟,详
见本节后续部分。异步操作由异步状态寄存器ASSR 控制。时钟选择逻辑模块控制引起
T/C计数值增加(或减少)的时钟源。 没有选择时钟源时T/C处于停止状态。时钟选择逻辑模
块的输出称为clkT2。
双缓冲的输出比较寄存器OCR2 一直与TCNT2 的数值进行比较。波形发生器利用比较结
果产生PWM 波形或在比较输出引脚OC2 输出可变频率的信号。参见P111 “ 输出比较单
元” 。比较匹配结果还会置位比较匹配标志OCF2,用来产生输出比较中断请求。
7、8位T/C2的寄存器
1)T/C2的控制寄存器


• Bit 7 – FOC2: 强制输出比较
FOC2仅在WGM指明非PWM模式时才有效。但是,为了保证与未来器件的兼容性,使用
PWM 时,写TCCR2 要对其清零。写1 后,波形发生器将立即进行比较操作。比较匹配输
出引脚 OC2 将按照COM21:0 的设置输出相应的电平。要注意FOC2 类似一个锁存信号,
真正对强制输出比较起作用的是COM21:0 的设置。
FOC2 不会引发任何中断,也不会在使用OCR2 作为TOP 的CTC 模式下对定时器进行清
零。
读FOC2 的返回值永远为0。
• Bit 6, 3 – WGM21:0: 波形产生模式
这几位控制计数器的计数序列,计数器最大值TOP 的来源,以及产生何种波形。T/C 支
持的模式有:普通模式,比较匹配发生时清除计数器模式(CTC),以及两种PWM 模式

• Bit 5:4 – COM21:0: 比较匹配输出模式
这些位决定了比较匹配发生时输出引脚OC0 的电平。如果COM01:0 中的一位或全部都
置位, OC0 以比较匹配输出的方式进行工作。同时其方向控制位要设置为1 以使能输出
驱动。
当OC0 连接到物理引脚上时, COM01:0 的功能依赖于WGM01:0 的设置。Table 51 给
出了当WGM01:0 设置为普通模式或CTC 模式时COM01:0 的功能。



• Bit 2:0 – CS22:0: 时钟选择
这三位时钟选择位用于选择T/C 的时钟源,见Table 54。

2)定时器/ 计数器寄存器- TCNT2


通过T/C 寄存器可以直接对计数器的8 位数据进行读写访问。对TCNT2 寄存器的写访问
将在下一个时钟阻止比较匹配。在计数器运行的过程中修改TCNT2 的数值有可能丢失一
次TCNT2 和OCR2 的比较匹配。
3)输出比较寄存器- OCR2

输出比较寄存器包含一个8 位的数据,不间断地与计数器数值TCNT2 进行比较。匹配事
件可以用来产生输出比较中断,或者用来在OC2 引脚上产生波形。
4)异步状态寄存器- ASSR


• Bit 3 – AS2: 异步 T/C2
AS2为"0”时T/C2由I/O时钟clkI/O驱动;AS2为"1”时T/C2由连接到TOSC1引脚的晶体振荡
器驱动。改变AS2 有可能破坏TCNT2、OCR2 与TCCR2 的内容。
• Bit 2 – TCN2UB: T/C2 更新中
T/C2工作于异步模式时,写TCNT2将引起TCN2UB置位。当TCNT2从暂存寄存器更新完
毕后TCN2UB 由硬件清零。TCN2UB 为0 表明TCNT2 可以写入新值了。
• Bit 1 – OCR2UB: 输出比较寄存器2 更新中
T/C2工作于异步模式时,写OCR2将引起OCR2UB置位。当OCR2从暂存寄存器更新完毕
后OCR2UB 由硬件清零。OCR2UB 为0 表明OCR2 可以写入新值了。
• Bit 0 – TCR2UB: T/C2 控制寄存器更新中
T/C2工作于异步模式时,写TCCR2将引起TCR2UB置位。当TCCR2从暂存寄存器更新完
毕后TCR2UB 由硬件清零。TCR2UB 为0 表明TCCR2 可以写入新值了。
如果在更新忙标志置位的时候写上述任何一个寄存器都将引起数据的破坏,并引发不必
要的中断。
读取TCNT2、OCR2 和TCCR2 的机制是不同的。读取TCNT2 得到的是实际的值,而
OCR2 和TCCR2 则是从暂存寄存器中读取的。
定时器/ 计数器2 的异步操作(这里还是挺重要的~~
T/C2 工作于异步模式时要考虑如下几点:
• 警告:在同步和异步模式之间的转换有可能造成TCNT2、OCR2 和TCCR2 数据的损
毁。安全的步骤应该是:
1. 清零OCIE2 和TOIE2 以关闭T/C2 的中断
2. 设置AS2 以选择合适的时钟源
3. 对TCNT2、OCR2 和TCCR2 写入新的数据
4. 切换到异步模式:等待TCN2UB、OCR2UB 和TCR2UB 清零
5. 清除T/C2 的中断标志
6. 需要的话使能中断
• 振荡器最好使用32.768 kHz手表晶振。给TOSC1 提供外部时钟,可能会造成T/C2 工
作错误。系统主时钟必须比晶振高4 倍以上。
• 写TCNT2,OCR2和TCCR2时数据首先送入暂存器,两个TOSC1时钟正跳变后才锁
存到对应到的寄存器。在数据从暂存器写入目的寄存器之前不能执行新的数据写入
操作。3 个寄存器具有各自独立的暂存器,因此写TCNT2 并不会干扰OCR2 的写
操作。异步状态寄存器ASSR 用来检查数据是否已经写入到目的寄存器。
• 如果要用T/C2 作为MCU 省电模式或扩展Standby 模式的唤醒条件,则在TCNT2,
OCR2A和TCCR2A更新结束之前不能进入这些休眠模式,否则MCU可能会在T/C2设
置生效之前进入休眠模式。这对于用T/C2 的比较匹配中断唤醒MCU 尤其重要,因
为在更新OCR2 或TCNT2 时比较匹配是禁止的。如果在更新完成之前(OCR2UB为0)MCU 就进入了休眠模式,那么比较匹配中断永远不会发生, MCU 也永远无法
唤醒了。
• 如果要用T/C2作为省电模式或扩展Standby模式的唤醒条件,必须注意重新进入这些
休眠模式的过程。中断逻辑需要一个TOSC1 周期进行复位。如果从唤醒到重新进入
休眠的时间小于一个TOSC1 周期,中断将不再发生,器件也无法唤醒。如果用户怀
疑自己程序是否满足这一条件,可以采取如下方法:
1. 对TCCR2、TCNT2 或OCR2 写入合适的数据
2. 等待ASSR 相应的更新忙标志清零
3. 进入省电模式或扩展Standby 模式
• 若选择了异步工作模式,T/C2 的 32.768 kHz 振荡器将一直工作,除非进入掉电模式
或 Standby 模式。用户应该注意,此振荡器的稳定时间可能长达1 秒钟。因此,建
议用户在器件上电复位,或从掉电/Standby 模式唤醒时至少等待1 秒钟后再使用
T/C2。同时,由于启动过程时钟的不稳定性,唤醒时所有的T/C2 寄存器的内容都可
能不正确,不论使用的是晶体还是外部时钟信号。用户必须重新给这些寄存器赋值。
• 使用异步时钟时省电模式或扩展Standby 模式的唤醒过程:中断条件满足后,在下一
个定时器时钟唤醒过程启动。也就是说,在处理器可以读取计数器的数值之前计数
器至少又累加了一个时钟。唤醒后MCU 停止4 个时钟,接着执行中断服务程序。中
断服务程序结束之后开始执行SLEEP 语句之后的程序。
• 从省电模式唤醒之后的短时间内读取TCNT2 可能返回不正确的数据。因为TCNT2 是
由异步的TOSC 时钟驱动的,而读取TCNT2 必须通过一个与内部I/O 时钟同步的寄
存器来完成。同步发生于每个TOSC1 的上升沿。从省电模式唤醒后I/O 时钟重新激
活,而读到的TCNT2 数值为进入休眠模式前的值,直到下一个TOSC1 上升沿的到
来。从省电模式唤醒时TOSC1 的相位是完全不可预测的,而且与唤醒时间有关。因
此,读取TCNT2 的推荐序列为:
1. 写一个任意数值到OCR2 或TCCR2
2. 等待相应的更新忙标志清零
3. 读TCNT2
• 在异步模式下,中断标志的同步需要3 个处理器周期加一个定时器周期。在处理器可
以读取引起中断标志置位的计数器数值之前计数器至少又累加了一个时钟。输出比
较引脚的变化与定时器时钟同步,而不是处理器时钟。
5)定时器/ 计数器中断屏蔽寄存器- TIMSK
• Bit 7 – OCIE2: T/C2 输出比较匹配中断使能
当OCIE2 和状态寄存器的全局中断使能位I 都为"1” 时,T/C2 的输出比较匹配A 中断使
能。当T/C2 的比较匹配发生,即TIFR 中的OCF2 置位时,中断服务程序得以执行。
• Bit 6 – TOIE2: T/C2 溢出中断使能
当TOIE2 和状态寄存器的全局中断使能位I 都为"1” 时,T/C2 的溢出中断使能。当T/C2
发生溢出,即TIFR 中的TOV2 位置位时,中断服务程序得以执行。
6)定时器/ 计数器 中断标志寄存器- TIFR


• Bit 7 – OCF2: 输出比较标志 2
当T/C2 与OCR2( 输出比较寄存器2) 的值匹配时,OCF2 置位。此位在中断服务程序里
硬件清零,也可以通过对其写1 来清零。当SREG 中的位I、OCIE2 和OCF2 都置位时,
中断服务程序得到执行。
• Bit 6 – TOV2: T/C2 溢出标志
当T/C2 溢出时, TOV2 置位。执行相应的中断服务程序时此位硬件清零。此外, TOV2
也可以通过写1 来清零。当SREG 中的位I、TOIE2 和TOV2 都置位时,中断服务程序
得到执行。在PWM 模式中,当T/C2 在0x00 改变记数方向时, TOV2 置位。
这里也用到特殊功能寄存器:补充:


好了,现在基本上好了~~累死了
下面就是实验了,哈哈
4位秒表啊~~~吼吼
先贴张图片看看那


然后就是Proteus仿真~~~
出了点问题~~整了半天~~哭
个人认为是个Bug~~你懂得,我以前用51的时候就有这个问题,显示不完整,可能是更新太快了~

评论


技术专区

关闭