Не работает С-ный код на 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;
}