3

我有一个ATMega8515,我正在尝试设置一个定时器中断,这样如果一个进程花费的时间太长,它就会关闭。

我设置了计时器:

void init_software_interupt(double time)
{
    OCR1A = time;
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1B |= (1 << WGM12);
    TCCR1B |= (1<<CS10);
    TCCR1B |= (1<<CS12);
    TIMSK |= (1 << OCIE1A);
    sei();
}

这很好用。对于 8MHz 时钟,我计算出的时钟秒数为 7812,它的工作原理与预期每秒打印一次的内容完全相同:

//Timer Interupt
int seconds = 0;
ISR(TIMER1_COMPA_vect){
    seconds++;
    printf("in timer overflow: %d seconds have passed\r\n",seconds);
    in_progress = FALSE;
}

问题是我可能会在 1 秒溢出计数中调用函数 unlock_door() 750ms,它只允许操作花费 250ms,这还不够长。

我试图在调用函数之前设置输出比较寄存器,但它似乎没有影响:

OCR1A = 7812;
unlock_door();

但它不会改变当前的溢出。

如何在调用函数之前重置溢出计时器以确保它需要 1 秒?

4

1 回答 1

3

看起来您正在使用比较中断,而不是溢出中断。OCR1A存储与计数器进行比较的值,并且我相信它TCNT1存储了实际的计时器值。尝试:

TCNT1 = 0;
unlock_door();

顺便说一下,这是一篇关于 AVR 计时器的好文章。它被称为“AVR 计时器新手指南”,但它也非常适合作为参考。

于 2013-11-10T17:43:48.337 回答