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

Комментарии  

+2 #21 AntonChip 29.06.2014 22:40
Цитирую shinkaruk:
Здравствуйте. кто может помочь нужен пример кода
При нажатии кнопки моргает первый светодиод а при отпускании второй,

Моргает однократно.
Насколько я понял нужно сделать прерывание по спадающему фронту моргнуть первым а по возрастающему вторым, только что я не делал ничего не получается((

Можно без прерываний
Код:
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;
}
}
}

Сообщить модератору
0 #22 shinkaruk 01.07.2014 00:57
Цитирую AntonChip:
Цитирую shinkaruk:
Здравствуйте. кто может помочь нужен пример кода
При нажатии кнопки моргает первый светодиод а при отпускании второй,

Моргает однократно.
Насколько я понял нужно сделать прерывание по спадающему фронту моргнуть первым а по возрастающему вторым, только что я не делал ничего не получается((

Можно без прерываний
Код:
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 мс
}
}
Сообщить модератору