Задача: Разработаем устройство управления светодиодом. Кнопка будет включать и выключать мигание светодиода. Пока кнопка нажата светодиод мигает с частотой 2,5 Hz, если кнопка отпущена светодиод не горит.
Алгоритм программы:
- Производим чтение порта D;
- Проверяем PD0, если он равен нулю включаем алгоритм мигания;
- Если PD0 равен единице выключаем алгоритм мигания и тушим светодиод;
- Переходим к началу основного цикла(первый пункт);
- Пишем алгоритм мигания светодиодом (зажигаем светодиод, пауза, гасим светодиод, пауза);
- Переходим к началу алгоритма(первый пункт).
Настраиваем порты ввода вывода как в занятии №2. Пишем основной цикл программы. Программа не содержит для нас новых операторов. Для создания задержки используется та же самая библиотека подпрограмм util/delay.h. Полный текст программы смотрите ниже.
/***************** Задание №3. Мигание светодиодом ***************/
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD = 0x00; // порт D на вход
PORTD = 0xFF; // подключаем внутренние подтяг. резисторы
DDRB = 0xFF; // порт B на выход
PORTB = 0x00; // устанавливаем нули на выходе
while(1)
{
if(PIND&(1 << PD0)) // Проверяем нажатие кнопки
{
PORTB &= ~(1 << PB0); // Гасим светодиод
}
else
{
PORTB &= ~(1 << PB0); // гасим светодиод
_delay_ms(200); // задержка 200 мс
PORTB |= (1 << PB0); // зажигаем светодиод
_delay_ms(200); // задержка 200мс
}
}
}
В статье были использованы материалы из книги Белова А.В. "Самоучитель разработчика устройств на AVR"


Комментарии
Можно без прерываний
Код:
char flag_0 = 1, flag_1 = 1;
while(1)
{
if(PIND&(1 << PD0)) // Проверяем нажатие кнопки
{
flag_1 = 1;
if(flag_0)
{
PORTB |= (1 << PB0); // зажигаем светодиод
_delay_ms(200); // задержка 200мс
PORTB &= ~(1 << PB0); // гасим светодиод
_delay_ms(200); // задержка 200 мс
flag_0 = 0;
}
}
else
{
flag_0 = 1;
if(flag_1)
{
PORTB |= (1 << PB1); // зажигаем светодиод
_delay_ms(200); // задержка 200мс
PORTB &= ~(1 << PB1); // гасим светодиод
_delay_ms(200); // задержка 200 мс
flag_1 = 0;
}
}
}
все работает только если частота большая то происходят пропуски, всетаки нужно с прерываниями делать(((
я вот питался сам сделать, что я не так делаю ?
Код:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
ISR(SIG_INTERRUPT0)
{
PORTB |= (1 << PB0); // зажигаем светодиод
_delay_ms(200); // задержка 200мс
PORTB &= ~(1 << PB0); // гасим светодиод
_delay_ms(200); // задержка 200 мс
}
}