T/C0的异步操作
T/C0异步工作时要考虑如下几点:
注意:在同步和异步模式之间的转换有可能造成TCNT0、OCR0、TCCR0数据的损毁。安全的步骤应该是:
①清零OCIE0和TOIE0以关闭T/C0的中断。
②设置AS0以选择合适的时钟源。
③位TCNT0、OCR0和TCCR0写入新的数值。
④等待TCNOUB、OCROUB和TCROUB清零。
⑤清除T/C0的中断标志。
⑥需要的话,使能中断。
>振荡器对32.768 kHz的晶振进行了优化,从TOSCl输入外部时钟信号有可能导致不正确的T/C0操作。另外,系统主时钟必须比时钟晶振高4倍以上
>写TCNT0、OCR0和TCCR0时,数据首先送入暂存器,两个TOSCl正跳变后才锁存。在数据从暂存器写入目的寄存器之前不能写入新的数值。3个寄存器具有各自独立的暂存器,因此,写TCNT0不会干扰写OCR0。可以通过异步状态寄存器ASSR检查数据是否已经写入到目的寄存器
>如果要用T/C0作为MCU的唤醒条件,则在TCNT0、OCR0和TCCR0更新结束之前不能进入省电模式或扩展Standby模式,否则,MCU可能在T/C0设置生效之前进入休眠模式。这对于用T/C0的比较匹配中断唤醒MCU尤其重要,因为在更新0CR0或TCNT0时比较匹配是禁止的。如果在更新完成之前(OCROUB为o)MCU就进入了休眠模式,则比较匹配中断永远不会发生,MCU也永远无法唤醒了
>如果要用T/C0作为省电模式或扩展Standby模式的唤醒条件,必须注意重新进入这些模式的过程。中断逻辑需要一个TOSCl周期进行复位。如果从唤醒到重新进入睡眠的时间小于一个TOSCl周期,中断将不再发生,器件也无法唤醒。如果用户怀疑自己程序是否满足这一条件,可以采取如下方法:
①对TCCR0、TCNT0或OCR0写入合适的数据。
②等待ASSR相应的更新忙标志变低。
③进入省电模式或扩展Standby模式。
>若选择了异步工作模式,T/C0的32.768 kHz振荡器将一直工作,除非进入掉电模式或Standby模式。用户应该注意,此振荡器的稳定时间可能长达1 s。因此,建议用户在器件从睡眠模式唤醒或上电时至少等待l s后再使用T/C0。同时,由于启动过程时钟的不稳定性,唤醒时T/C0的数据不可使用。
>省电模式或扩展Standby模式唤醒过程:中断条件满足后,在下一个定时器时钟唤醒过程启动。也就是说,至少一个定时器时钟后处理器才可以读到计数器的数值。唤醒后的4个时钟里Mcu停止,接着执行中断例程。结束中断例程之后,开始SLEEP之后的程序。
>从省电模式唤醒之后的短时间内读取TCNT0可能返回不正确的数据。因为TCN T0是由异步的TOSC时钟驱动的,而读取TCNT0必须通过一个与内部I/O时钟同步的寄存器来完成。同步发生于每个TOSCl的上升沿。从省电模式唤醒后I/O时钟重新激活.而读到的TCNT0数值为进入睡眠模式前的值,直到下一个TOSCl上升沿的到来。从省电模式唤醒的TOSC1相位是完全不可预测的。因此,读取TCNT0的推荐顺序为:
①写一个任意数值到OCR0或TCCR0。
②等待相应的更新忙标志清零。
③读TCNT0。
>在异步模式下,中断标志的同步需要3个处理器周期加一个定时器周期。因此,至少一个定时器时钟后处理器才可以读到引起中断标志置位的计数器数值。输出比较引脚的变化与定时器时钟同步,而不是处理器时钟.
【电子街】推荐阅读: