"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

пятница, 24 января 2020 г.

Занятие кружка от 24.01.20

Занятие кружка было посвящено созданию электронного устройства бегущий огонь. Программа управления создавалась с опорой на регистры микроконтроллера и на языке С. Основой любой программы - алгоритм. Для разработки алгоритма была использована ИС ДРАКОН. Дракон схема в основу, которой  легла структура стандартного скретча, включает в себя главную функция 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. Модуль, Конец
//