Я выбрал основной код для минимума, и у меня проблема с более частыми прерываниями. Таймер настраивается для генерации прерываний на 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--;
}