Atmega168 случайным образом генерирует прерывание в цикле while - PullRequest
0 голосов
/ 10 мая 2019

Я выбрал основной код для минимума, и у меня проблема с более частыми прерываниями. Таймер настраивается для генерации прерываний на 500 мс, но иногда быстрее, например, 250 мс.

Светодиодный цикл иногда мигает быстрее. Когда я удаляю линию задержки, светодиод правильно мигает.

Где проблема?

#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--;

}
...