Задача: Разработаем устройство управления светодиодом. Кнопка будет включать и выключать мигание светодиода. Пока кнопка нажата светодиод мигает с частотой 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 мс
}
}