复位AVR定时器溢出寄存器

时间:2013-11-10 16:50:25

标签: c avr

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

1 个答案:

答案 0 :(得分:3)

看起来你正在使用比较中断,而不是溢出中断。 OCR1A存储计数器所要比较的值,我相信TCNT1存储实际的计时器值。尝试:

TCNT1 = 0;
unlock_door();

顺便说一下,这是一个good article on AVR timers。它被称为“新手的AVR计时器指南”,但它也很适合作为参考。