定时器/计数器0无法正常工作

时间:2014-11-30 15:07:29

标签: timer avr atmega

我想要做的就是使用Timer0设置一个计时器,但它表现得非常严厉:

首先使用定时器I,只想打开和关闭LED以确保定时器按预期工作。每次发生溢出时,我都会将变量的值增加1,并检查它是否与我的比较值匹配。如果是,则将变量设置为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)
    {

    }
}

2 个答案:

答案 0 :(得分:0)

定时器0是一个8位计数器。即使缩放64,时钟运行频率为16 MHz,时间比较值设置为4,LED也会每4毫秒切换一次。我怀疑你是否能够看到切换发生得足够好以确定它比它更多关闭。

答案 1 :(得分:0)

我解决了这个问题。我的控制器表现得很奇怪,但出于某种原因,重写保险丝解决了这个问题。