我有一个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;
}
问题是我可能将函数unlock_door()称为750毫秒进入1秒溢出计数,它只允许操作耗时250ms,这不够长。
我试图在调用函数之前设置输出比较寄存器,但它似乎没有影响:
OCR1A = 7812;
unlock_door();
但它不会改变当前的溢出。
如何在调用函数之前重置溢出计时器以确保它需要1秒钟?
答案 0 :(得分:3)
看起来你正在使用比较中断,而不是溢出中断。 OCR1A
存储计数器所要比较的值,我相信TCNT1
存储实际的计时器值。尝试:
TCNT1 = 0;
unlock_door();
顺便说一下,这是一个good article on AVR timers。它被称为“新手的AVR计时器指南”,但它也很适合作为参考。