我想要做的就是使用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)
{
}
}
答案 0 :(得分:0)
定时器0是一个8位计数器。即使缩放64,时钟运行频率为16 MHz,时间比较值设置为4,LED也会每4毫秒切换一次。我怀疑你是否能够看到切换发生得足够好以确定它比它更多关闭。
答案 1 :(得分:0)
我解决了这个问题。我的控制器表现得很奇怪,但出于某种原因,重写保险丝解决了这个问题。