заняття №2

Завдання: Розробимо пристрій управління світлодіодом за допомогою однієї кнопки. При кожному натисканні на кнопку вихід порту до якого підключений світлодіод повинен міняти свій стан на протилежне. Це завдання легко вирішується за допомогою D-тригера, але все ж розглянемо як її можна вирішити за допомогою мікроконтролера.

Схема пристрою така ж як в занятті 1. Алгоритм програми простий. Спочатку налаштовуємо порти введення-виведення. Перевіряємо стан молодшого розряду порту D (PD0) до якого підключена кнопка, а потім виконуємо операцію порівняння, де PD0 перевіряється на рівність одиниці. Якщо умова виконується програма переходить на початок циклу, якщо немає то виконується ще одна операція порівняння, але вже лінії PB0. Спочатку оператор порівняння перевіряє PB0 на рівність нулю, якщо результат істина (PB0 = 0), то розряд скидається в одиницю (PB0 = 1). Якщо помилково, встановлюється в нуль (PB0 = 0). Далі в програму вносимо процедуру очікування, без неї наш світлодіод буде так часто блимати, що наше око не помітить цього. Основний цикл програми буде призупиняється як тільки відбудеться перемикання світлодіода і буде відновлюватися як тільки буде відпущена кнопка.

Налаштовуємо порти введення виведення як в завданні 1:

DDRD = 0x00; // порт D - вхід

PORTD = 0xFF; // підключаємо навантажувальні резистори

DDRB = 0xFF; // порт B - вихід

PORTB = 0x00; // встановлюємо 0 на виході

Пишемо основний цикл програми. Тут ми будемо використовувати умовний оператор if else. Цей оператор виконує різні операції в залежності від деякої умови і записується так:

Умова це будь-який логічний вираз. Якщо результат цього виразу істина, то виконується «набір операторів А», в іншому випадку виконується «набір операторів В»

Процедура очікування натискання кнопки являє собою порожній цикл while. і цей цикл буде виконуватися до тих пір коли умова істинна. Умовою буде рівність лінії PD0 одиниці, тобто до тих пір поки кнопка не було натиснуто.

while ((PIND (1 <

Перевіряємо стан лінії PB0 наступним виразом

if ((PINB (1 <

Перемикаємо стан PB0 на протилежне

PORTB | = (1 <

В іншому випадку залишаємо в PB0 нуль

(1 <

Далі знову перевіряємо стан кнопки

while ((PIND (1< // якщо кнопка натиснута буде виконуватися порожній цикл

Так само в цій програмі можна вирішити проблему брязкоту контактів. Найпростіший спосіб впровадження в програму спеціальних затримок. Брязкіт призводить до того, що на відповідному розряді порту D замість простого переходу з одиниці в нуль ми отримуємо серію імпульсів. Щоб позбутися від цього програмі потрібно перейти в режим очікування як тільки вона виявить перший нульовий рівень на вході. У режимі очікування програма призупиняє всі свої дії і просто відпрацьовує затримку. Для того щоб ввести затримку скористаємося стандартної бібліотекою процедури затримки util / delay.h.

Скористаємося функцією яка реалізує затримку:

_delay_ms (200); // затримка на 200 мілісекунд

Вона забезпечує затримку в будь-яке ціле кількість мікросекунд. Далі цю функцію просто вставляємо після кожного циклу while.

Код програми буде таким:

У статті були використані матеріали з книги Бєлова А.В. "Самовчитель розробника пристроїв на AVR"

Схожі статті