Atmega168在while循环中随机生成中断

时间:2019-05-10 16:48:12

标签: c timer interrupt avr

我将主代码削减到最低限度,并且我遇到了更经常中断的问题。计时器配置为产生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--;

}

0 个答案:

没有答案