在使用AVR的定时器0的时候,如果工作模式是普通模式,比较匹配也会产生中断?
使用定时器0,初始化的代码如下(程序其它地方没有再对TCCR0A 进行改动过):
TCCR0A &= 0xb7; //默认普通模式 WGM01 WGM00 :00
TCCR0A |= 0X10; //匹配时位取反 COM0A1 COM0A0:01
TCCR0A |= 0X02; //1/8系统时钟分频
TIMSK0 |= 0X03; //使能溢出中断和匹配中断
OCR0A = 10; //这里目的是为了观察具体猜测结果
在溢出中断函数和匹配中断函数里面,分别进行把端口管脚取反的操作。具体代码如下:
#pragma vector = TIMER0_COMP_vect
__interrupt void Timer0_comp(void)
{
PORTD ^= 0xff;
}
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_ovf(void)
{
PORTE ^= 0xff;
}
最后观察到的结果就是PORTD和PORTE的波形和周期一样,不管把OCR0A的值改为多少。也就是说,程序即会产生溢出中断,也会产生中断。但从两个端口波形比较来看,两个中断基本上是同时发生的。而匹配中断 并不是TCNT0 累加到与OCR0A相等时产生的,但除此之外,还有哪里能产生匹配中断呢?
|