我正在尝试模拟 Arduino 函数 micros()。为此,我编写了一个计时器,如代码中所示。
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint32_t micros = 0; // micros from start
volatile uint32_t t = 0;
ISR(TIM0_OVF_vect){
micros += 60; // ((1/9600000)*8)*(256-184) = 0,00006 seconds = 60 microseconds
TCNT0 = 184;
}
inline void timer_ini(){
SREG |= (1<<7);
TCCR0B |= (1<<CS01); // 8x
TCNT0 = 184;
TIMSK0 |= (1<<TOIE0); // enable ovf interupt
};
int main(void)
{
timer_ini();
DDRB = 0b00011000;
PORTB =0b00011000;
while (1)
{
if(t<micros){
t+= 1000000; // 1 second delay
PORTB ^= 0b11000;
}
}
}
一般来说,我有一个变量micros,它包含从微控制器上电开始的微秒值。使用定时器/计数器溢出中断,其值每 60 微秒递增一次。 溢出频率已设置为 9.6 MHz(检查熔丝位)。分频取8x。结果,通过公式得出 60 微秒:((1/9600000)8)(256-184) = 0.00006 秒 = 60 微秒。
但是当我将 LED 编程为每 1 秒闪烁一次 (t+=1000000) 时,实际上它每 10 秒闪烁一次。当我指定 100 毫秒 (t+=100000) 的值时,它每秒都会闪烁。
我手动检查了计算结果,并在excel中进行了计算,但仍然不行。我在 arduino ide 中编写了一个类似的程序,它按照我想要的方式工作。
默认情况下,对 CLKDIV8 通量进行编程。我将其值设置为非编程,一切都按预期工作。