Не работает С-ный код на AVR Atmega 8515

Новичок в программирование МК. Использую AtmelStudio 7.Не пойму почему не работает код на Atmega8515 (код ниже). На PD4 висит светодиод, который подключен анодом на +5. По моему разумению светодиод должен мигать. А он при подаче питания зажигается через какое то время. По ощущениям как будто прерывание срабатывает 1 раз. Если раскомментировать строчку в обработчике и закомментировать ифчики в while, то светодиод постоянно мигает, как и ожидалось. Прошу помочь! Спасибо!

PS Пересмотрел кучу подобных примеров. Есть подозрения, что "volatile" игнорируется компилятором. Может быть настройка IDE?

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>

volatile int flag = 0;

int main(void)
{
    DDRD = 1 << (PD4);
    PORTD = 1 << PD4;
    TCCR1B = 1 << (CS12);
    TIMSK |= 1 << (TOIE1);
    sei();
    while(1)
    {
        if (flag == 0)
        {
            PORTD = 1 << PD4;
        }
         
        if (flag == 1)
        {
            PORTD = 0 << PD4;
        }
    }
}

ISR(TIMER1_OVF_vect)
{
    cli();
    
    //PORTD ^= 1<<(PD4);
    
    if (flag == 1)
    {
        flag = 0;
    }
    
    if (flag == 0)
    {
        flag = 1;
    }
    
    sei();
}

Ответы (1 шт):

Автор решения: Yakov

попробуй примерно так.

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

volatile int flag = 0;

int main(void)
{
    DDRD = 1 << (PD4);
    PORTD = 1 << PD4;
    TCCR1B = 1 << (CS12);
    TIMSK |= 1 << (TOIE1);
    sei();
    while(1)
    {
        if (flag)
        {
            PORTD ^= 1<<(PD4);
            flag = 0;
        }
        else
            _delay_ms(1);
    }
}

ISR(TIMER1_OVF_vect)
{
    flag = 1;
}
→ Ссылка