c-AVR ATtiny24定时器比较中断不工作



我正在用timer0驱动一个时钟来记录过去的秒数。最初,我使用的是ATtiny85,它运行良好,但当我切换到ATtiny24时,中断似乎将时钟重置为初始值。

我知道中断是触发的,因为当我注释掉timer0设置和ISR时,我可以更改时钟上的小时和分钟(当timer0处于活动状态时,当我使用按钮更改时间时,时钟会重置回来(

以下是计时器0设置和ISR 的代码供参考

timer0设置

cli();
TCCR0A = 0x00;
TCCR0B = 0x00;

TCCR0B |= (1 << CS02) | (1 << CS00); // prescaler to 1024

TCCR0A |= (1 << WGM01); // set to CTC mode
OCR0A = 124; //reset on 124
TCNT0 = 0;

TIMSK0 |= (1 << OCIE0A); // enable interrupt on OCR0A match

initOutput();
sei();

ISR

ISR(TIMER0_COMPA_vect){
cli();

if(ticks == 124){
ticks = 0;

seconds++;
displayUpdate = 1;

if(seconds > 59)
{
minutes++;
seconds = 0;
displayUpdate = 1;
}

if(minutes > 59)
{
hours++;
minutes = 0;
if(hours == 12){buff[8] ^= 1;}
}

if(hours < 10 && digits[7] == 128)
{
digits[7] = 0;

}else if(hours >= 10 && digits[7] == 0){
digits[7] = 128;
}

if(hours > 12)
{
hours = 1;
}
}else{
ticks++;
}
sei();
}

实际上,我在您的代码中没有发现错误,但在检查数据表后,我发现ATtin25和ATtiny85之间存在差异。在ATtiny24数据表中,中断矢量称为TIM0_COMPA,在ATtiny85数据表中称为TIMER0_COMPA(中断矢量,均见第48页(。因此,尝试将ISR重命名为:

ISR(TIM0_COMPA_vect)
{
// ...
}

对不起,我这里没有控制器来检查它是否工作。

最新更新