我有一个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 秒?