Timer 计时器/计数器0未按预期工作

Timer 计时器/计数器0未按预期工作,timer,avr,atmega,Timer,Avr,Atmega,我想做的就是使用Timer0设置一个计时器,但它的行为非常棘手: 首先,使用计时器I,只需打开和关闭LED,以确保计时器按预期工作。每次溢出发生时,我将变量的值增加一,并检查它是否与我的比较值匹配。如果是这样,变量设置为0,LED开关打开/关闭 信号的边缘不一样长。随着比较值的增加,高边越来越短,低边越来越长。这很奇怪,因为它们应该总是一样长 我已经尝试了许多不同的方法来解决这个问题。我已经开始怀疑我的控制器坏了。我用的是atmega8 代码如下: #include <avr/io.h&g

我想做的就是使用Timer0设置一个计时器,但它的行为非常棘手:

首先,使用计时器I,只需打开和关闭LED,以确保计时器按预期工作。每次溢出发生时,我将变量的值增加一,并检查它是否与我的比较值匹配。如果是这样,变量设置为0,LED开关打开/关闭

信号的边缘不一样长。随着比较值的增加,高边越来越短,低边越来越长。这很奇怪,因为它们应该总是一样长

我已经尝试了许多不同的方法来解决这个问题。我已经开始怀疑我的控制器坏了。我用的是atmega8

代码如下:

#include <avr/io.h>
#include <avr/interrupt.h>

char phase;
uint16_t time;

ISR(TIMER0_OVF_vect)
{
    time++;
    if(time >= 4){
        time = 0;
        PORTD ^= 1;
    }
}

int main(void)
{
    SP = RAMEND;

    DDRB |= (1<<DDB3);
    DDRD = 0xff;

    TCCR0 = 3;//Timer0 prescaler: clk/64
    TIMSK= (1<<TOIE0);  //enable timer0 overflow interrupt

    sei(); //set i-bit

    //just another timer for pwm output.
    TCCR2 = 0b01101011;//fast-pwm; clear OC2 on compare match, set at bottom; prescaler: 32
    OCR2 = 100; //set compare value

    time = 0;

    while(1)
    {

    }
}
#包括
#包括
炭相;
uint16时间;
ISR(计时器0 OVF vect)
{
时间++;
如果(时间>=4){
时间=0;
PORTD^=1;
}
}
内部主(空)
{
SP=拉芒;

DDRB |=(1计时器0是一个8位计数器。即使按64的比例缩放,时钟以16 MHz的频率运行,时间比较值设置为4,LED也会每4毫秒切换一次。我怀疑您是否能看到切换发生得足够好,以确定它的关闭时间大于打开时间。

我修复了该问题。我的控制器运行异常,但有一段时间重新启动ason重写保险丝修复了问题。

我使用了什么MCU?您确定只有TCCR0而没有TCCR0A、B吗?