为 attiny13a 自行编写的 micros() 速度慢 10 倍

问题描述 投票:0回答:1

我正在尝试模拟 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 中编写了一个类似的程序,它按照我想要的方式工作。

avr microchip atmel atmelstudio attiny
1个回答
0
投票

默认情况下,对 CLKDIV8 通量进行编程。我将其值设置为非编程,一切都按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.