gpt4 book ai didi

c - 复位 AVR 定时器溢出寄存器

转载 作者:行者123 更新时间:2023-12-02 00:03:33 25 4
gpt4 key购买 nike

我有一个 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() 750 毫秒,并且它只允许操作花费 250 毫秒,这还不够长。

我试图在调用函数之前只设置输出比较寄存器,但它似乎没有影响:
OCR1A = 7812;
unlock_door();

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

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

最佳答案

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

TCNT1 = 0;
unlock_door();

这是一个 good article on AVR timers , 顺便一提。它被称为“AVR 计时器新手指南”,但它也非常适合作为引用。

关于c - 复位 AVR 定时器溢出寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19892329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com