我将主代码削减到最低限度,并且我遇到了更经常中断的问题。计时器配置为产生500ms的中断,但有时更快,例如250ms。
进入while循环有时会闪烁得更快。当我移除延迟线时,led会正确闪烁。
哪里有问题?
#include <avr/interrupt.h>
#define SET_BIT(r,x) r|=_BV(x)
#define CLR_BIT(r,x) r&=~_BV(x)
#define TOG_BIT(r,x) r^=_BV(x)
#include <avr/io.h>
#include <util/delay.h>
#define LED PD4
#define LED_PORT PORTD
#define LED_DIR DDRD
#define LED_ON CLR_BIT(LED_PORT,LED)
#define LED_OFF SET_BIT(LED_PORT,LED)
#define LED_CHECK !(LED_PORT&_BV(LED))
volatile unsigned int LedTime;
void init(void);
int main(void)
{
init();
while (1)
{
if(LedTime==0)
{
TOG_BIT(LED_PORT,LED);
LedTime=500;
}
_delay_us(1);
}
}
void init(void)
{
SET_BIT(LED_DIR,LED);
LED_ON;
TCCR1B |= (1<<WGM12);//ctc
////TCCR1B|=1;//1
//TCCR1B|=2;//8
//TCCR1B|=3;//64
//TCCR1B|=4;//256
TCCR1B|=5;//1024
OCR1A=(F_CPU/1024/1000)-1;
TIMSK1|=_BV(OCIE1A);
sei();
}
ISR(TIMER1_COMPA_vect)//1ms system tick
{
if (LedTime>0) LedTime--;
}