Занятие кружка было посвящено созданию электронного устройства бегущий огонь. Программа управления создавалась с опорой на регистры микроконтроллера и на языке С. Основой любой программы - алгоритм. Для разработки алгоритма была использована ИС ДРАКОН. Дракон схема в основу, которой легла структура стандартного скретча, включает в себя главную функция int main(), которая разбита на две ветки ветка SETUP и ветка LOOP.
В левой ветке SETUP (настройка портов на вход и выход) используются регистры ввода вывода:
DDRB = 0xff; //вывод сигнала на светодиоды
DDRD = 0x02;//вход кнопки
PORTB = 0x3f; //высокий сигнал на выводах порта В
PORTD |= 1;//высокий сигнал
Кроме того инициализируются переменные сдвига
А = 0;B = 5;
t = 0; //временная задержка
В ветке LOOP развилка обусловлена наличием кнопки которая меняет направление сдвига(перехода к следующему светодиоду).
Предложенная дракон схема была реализована и проверена на макете в виртуальной лаборатории. В ходе отладки программы были обнаружены следующие ошибки:
На схеме сборки, в виртуальной лаборатории кнопка была подключена не верно, так же ошибка была в условии нажатия кнопки - было "PORTB & (1 <<PD1)" надо "PORTD &(1 <<PD1)", из-за отказа использовать схему задержки была ошибка в метках адресации безусловного перехода.
Физически собранное устройство тоже содержало несколько ошибок, которые надо устранить на следующем занятии.
Однако предложенная схема далеко не идеальна так ветках содержится одинаковый код, а все различие только в направлении выбора следующего светодиода(сдвига), чтобы оптимизировать задачу была предложена дракон-схема которая предполагает развилку, обусловленную нажатием кнопки, поместить непосредственно перед операцией сдвига и она будет только давать выбор в переходе к следующему биту порта В, также необходимо переделать условие которое определяет поджог крайнего светодиода (было "A == 6" стало "(A == 6) or (A == -1)"). Кроме того такая модернизация сделает ненужной переменную B.
Листинг программы// ИС Дракон. Маршрутный транслятор.
// Y:\home\deniska\Документы\др длкр\новая мигалка1.drt
// 1. Схема - Гном, Изменение 25.01.2020 9:47:04
// 4. Модуль, Начало
#include <avr/io.h>
// Y:\home\deniska\Документы\др длкр\новая мигалка1.drt
// 2. Схема - процедура, Изменение 25.01.2020 10:20:37, Начало
int main()
{
int A, t;
// ==================== Шампур
// 5. Заголовок / main()
// 6. Ветка / setup
// 7. Действие / настройка портов
DDRB = 0xff;
PORTB = 0xff;
DDRD = 0x00;
PORTD = 0x00;
// 8. Действие / переменная сдвига
A = 0;
// 9. Действие / установка задержки на 0
t = 0;
// 10. Адрес -> 11. Ветка / telo
// ==================== Шампур
// 11. Цикл Ветка / telo
L12: ;
// 12. Действие / зажигаем светодиод
PORTB &= ~(1 << A);
// 13. Вставка / задержка
goto L1_27;
L14: ;
// 14. Действие / гасим предыдущий
PORTB |= 1 << A;
// 15. Вопрос / кнопка нажата? == Да
if (PIND & (1<<PD1)) goto L20;
// 16. Действие / сдвиг
A++;
L17: ;
// 17. Вопрос / горит последний светодиод == Да
if ((A == 6) or (A == -1)) goto L21;
// 18. Вставка / задержка
goto L2_27;
// 19. Цикл Адрес -> 11. Ветка / telo
// ==================== Шампур
L20: ;
// 20. Действие / сдвиг
A--;
goto L17;
// ==================== Шампур
L21: ;
// 21. Вопрос / кнопка нажата? == Да
if (PIND & (1<<PD1)) goto L23;
// 22. Действие / минимальная переменная сдвига
A = 0;
goto L2_27;
// ==================== Шампур
L23: ;
// 23. Действие / максимальная переменная сдвига
A = 5;
goto L2_27;
// ==================== Шампур
// 24. Ветка / aut
// 25. Конец / Конец
// Y:\home\deniska\Документы\др длкр\новая мигалка1.drt
// 3. Схема - вставка, Изменение 25.01.2020 9:50:37, Начало
// ==================== Шампур
// 26. Заголовок / задержка
L1_27: ;
// 27. Цикл Действие / счетчик задержки
t++;
// 28. Вопрос / счетчик равен задержке? == Нет
if (!(t == 32000)) goto L1_27;
// 29. Действие / обнуление счетчика
t=0;
// 30. Конец / Конец
goto L14;
// Y:\home\deniska\Документы\др длкр\новая мигалка1.drt
// 3. Схема - вставка, Изменение 25.01.2020 9:50:37, Начало
// ==================== Шампур
// 26. Заголовок / задержка
L2_27: ;
// 27. Цикл Действие / счетчик задержки
t++;
// 28. Вопрос / счетчик равен задержке? == Нет
if (!(t == 32000)) goto L2_27;
// 29. Действие / обнуление счетчика
t=0;
// 30. Конец / Конец
goto L12;
// 2. Схема, Конец
//
}
// 4. Модуль, Конец
//