В данной статье будет рассмотрен нестандартный подход к созданию программы для микроконтроллера. Для примера построим проект «кодового замка»; программа для микроконтроллера будет написана в визуальной среде Horizont Configurator.

Упрощенная принципиальная схема проекта представлена следующим рисунком. На данном рисунке не отображены выводы питания, а также в качестве исполнительного механизма используется светодиод. В качестве управляющего выбран микроконтроллер ATmega8.

image


Для реализации проекта необходимо задействовать 4 вывода микроконтроллера, а именно ввод данных с «кнопочного поля 0-9», ввод данных с кнопки «сохранить код», вывод для управления исполнительным устройством «замок», вывод подтверждения ввода цифры «цифра».

Для ввода кода используется наборное поле 0-9, выполненное в виде делителя напряжения с переменным коэффициентом деления. Коэффициенты подобраны следующим образом, при нажатии 0 на выходе формируется напряжение 0 вольт, 1- 0.5, 2 — 1.0, 3- 1.5, 4- 2.0, 5- 2.5, ..,9- 4.5, а в свободном состоянии 5 вольт.

image


Для замера потенциала с «кнопочного поля 0-9» я использовал вывод микроконтроллера связанный с АЦП, это «PINCO». Для возможности замера напряжения на выводе «PINCO», на холст добавлены блоки «ADC_ATmega8A» и «ADC PinCO».

image


Блок «ADC_ATmega8A» настраивает параметры встроенного в микроконтроллер аналого-цифрового преобразователя, в настройках указал значение опорного напряжения равное напряжению питания микроконтроллера. Таким образом я настроил АЦП для измерения напряжения в диапазоне 0-5 вольт. Для получения значения напряжения на выводе микроконтроллера «PINCO» я использовал блок «ADC PinCO». На выводе блока будет получен дискретный сигнал в диапазоне 0-1023 пропорциональный величине напряжения на выводе «PINCO», причем 0 вольт соответствует значение 0, а 5 вольтам значение 1023. Для приведения напряжения удобному для нас значению я использовал блок «деления» и «константу».

image


При делении входного диапазона 0-1023 на 90 мы получаем диапазон удобный для нас 0-11 диапазон 0-11. Причем нажатию «кнопки 0» будет соответствовать значение 0, 1- 1, ..,9- 9, а в свободном состоянии (ни одна кнопка не нажата) будет значение 11. Для фиксации события устойчивого состояния линии, использую блок «задержка» и блок «равенство».

image


На выходе блока «задержка» мы получаем значение которое было на входе блока «задержка» в предыдущем рабочем цикле. При равенстве значений в предыдущем цикле и в текущем мы фиксируем устойчивое состояние линии, при этом на выходе блока «равенство» будет сигнал логической 1 (true), в противном случае 0 (false). Для отфильтровывания значения 11 «свободного состояния линии» используем блоки «меньше», константу 11 и блок логическое «И».

image


На выводе блока «логическое И» будет присутствовать логическая единица если линия находится в устойчивом состоянии и значение после делителя меньше 11. Чтобы ограничить допустимую скорость ввода значений с «кнопочного поля 0-9», это повышает помехоустойчивость и ограничивает скорость «подбора кода», использую блок «задержка включения» и необходимый ему блок «счетчик миллисекунд».

image


Для окончательного формирования сигнала «ввода цифры» отследим нарастающий фронт и по данному сигналу сформируем одиночный импульс «ввода цифры». Для этого используем блок «RTRIG».

image


С целью читаемости схемы и уменьшения дополнительных соединительных линий добавлю «переходы» соединительных линий. Первый переход «введенная цифра», второй «сигнал ввода цифры». Задействуем вывод управляющий светодиодом «цифра принята», в моей схеме это вывод микроконтроллера «PinB6».

image


Воспользуемся сигналами «введенная цифра» и «сигнал ввода цифры», а так же блоками для хранения дискретных чисел «память» и организуем логику хранения последних введенных чисел. В моем случае я использовал четыре блока «память», что будет определять секретность замка в четыре цифры.

image


Логика работает следующим образом при поступлении «сигнала ввода символа» значение «введенная цифра» будет записано в блок «память 1», в свою очередь значение ранее содержащее в блоке «память 1» запишется в в блок «память 2» итд. В блоках «память 1»- «память 2» будут хранится последние введенные цифры. Причем в блоке «память 1» будет хранится последняя введенная цифра, в блоке «память 2»- предпоследняя, итд. Добавим «переходы» для значений вводимых символов.

image


Для хранения кода замка будем использовать энергонезависимую EEPROM память микроконтроллера. Каждую цифру кода будем хранить в отдельной ячейки EEPROM. В нашем случае нам потребуется 4 ячейки памяти. Выберем адреса ячеек EEPROM для хранения кода, для своего проекта я выбрал ячейки 10, 11, 12, 13.

image


Чтобы считать значение хранящиеся в ячейках EEPROM будем использовать блок «чтение байта EEPROM».

image


В итоге у нас имеются цифры введенные с «кнопочного поля 0-9» и цифры полученные из ячеек EEPROM, остается сделать сравнение цифр и сформировать сигнал управления исполнительным механизмам замка. Для данной задачи я использовал блок «равенство» и блок «логическое И».

image


На данном этапе логика кодового замка полностью функционирует, единственное остается «научить» микроконтроллер самостоятельно сохранять нужный пользователю код замка в память EEPROM. Для данной задачи я использую внешний сигнал «сохранить код» и по данному сигналу сформирую импульс записи EEPROM, для этого я воспользуюсь блоками логический вход «PinD6» и блоком «RTRIG», а так же для удобства создам соответствующий переход.

image


Построим логику записи данных в EEPROM, все сигналы и данные уже сформированы ранее, непосредственно для записи данных в EEPROM будем использовать блок «запись байта в EEPROM».

image


Логика работы кодового замка описана, общий вид проекта выглядит следующим образом.

image


Собираем проект:

image


После сборки проекта мы получили исполняемый *.hex файл размером 1450 байт, делаем вывод что нам можно использовать микроконтроллер с размером flash памяти 2 кбайта.

Тестирование проекта:

Поделиться с друзьями
-->

Комментарии (20)


  1. dammer
    06.07.2016 11:34

    Интересный обзор, но с точки зрения наглядности и удобства управления логикой мне больше нравится ДРАКОН.
    На видео решение похожей задачи


  1. lingvo
    06.07.2016 16:23

    А что в этом подходе нестандартного?


    1. diller61
      06.07.2016 16:38
      +1

      это же очевидно: программирование мышью


      1. alk0v
        07.07.2016 13:07

        Реинкарнация Algorithm Builder?


    1. lihouzov
      06.07.2016 16:39

      Это попытка переносы промышленного языка FBD на микроконтроллеры.


      1. lingvo
        06.07.2016 23:35

        Да, это нестандартно, но на сегодняшний момент уже устарело. Сейчас действительно интересно не столько графическое программирование, сколько моделирование этого всего на десктопе — еще до этапа компиляции кода. То есть вы должны иметь возможность промоделировать ваш замок со всех сторон на десктопе со всех сторон, и отладить его, прежде чем загружать код в контроллер. Так можно гораздо быстрее найти и исправить ошибки. Типичным представителем этого подхода есть Matlab/Simulink.


        1. lihouzov
          07.07.2016 06:22

          Была идея использовать для эмуляции утилиту avrsim но к сожалению список поддерживаемых для эмуляции устройств достаточно мал. Сейчас есть идея создать блок «debug», кидаешь ее на форму и программа подключится к устройству и будет возможность внутрисхемной отладки.


          1. lingvo
            07.07.2016 11:27

            Внутрисхемная отладка — это хорошо, но не всегда возможно.
            Во первых нужен отдельный порт и соединение с хостом, во вторых, когда оно работает в реал-тайме не всегда возможно отследить или задать нужные сигналы в нужное время. Моделирование гораздо проще в этом плане.


          1. ElectricFromUfa
            07.07.2016 12:05

            Ну зачем же так сложно. Да и к чему эта привязка к конкретной архитектуре микроконтроллера и подключение к устройству вообще. Пользователи же захотят не имея контроллера отладить несложную схему.
            У вас же некий FBD-интерпретатор в микроконтроллере? Вы когда-нибудь захотите его перенести на другое железо.
            На мой взгляд, достаточно научить вашу среду исполнять в режиме эмуляции тот же FBD-микрокод, который разбирает сейчас микроконтроллер. Ну и дать возможность при симуляции менять входные воздействия.
            Я бы ещё попытался поднять работу с периферией микроконтроллера на уровень выше, чтобы максимально отвязать их от конкретного микроконтроллера, а в среде накидывать только логику поведения.


            1. lingvo
              08.07.2016 10:47

              И это уже давно изобретено, разработано и продается. Называется Soft-PLC. Адруина, конечно, слишком слабовата для этого, но даже Распберри уже вполне справляется.
              SoftPLC — это некий рантайм — операционка реального времени + интерпретатор, который выполняется на заданной платформе и обеспечивает не только выполнение нужного кода в реальном времени, а и его загрузку, выполнение по шагам, отладку, просмотр всех переменных во время работы, работу с периферией через стандартные интерфейсы, коммуникации типа Modbus RTU и т.д.

              Типичный пример — Codesys. Рантаймы есть для множества платформ. Моделирование в свою очередь обеспечивается в самой среде программирования. Есть еще TwinCAT. Из опенсоурсного есть Beremiz -его, помоему даже на ту же ардуину и портировали.


  1. VDG
    06.07.2016 17:40

    Подтягивающий резистор на PD6 избыточен, так как есть внутренний.


    1. lihouzov
      06.07.2016 17:50

      Да, совершенно верно избыточный, его можно убрать а в свойстве блока PinD6 выбрать «подтяжка к VCC».


      1. alexparampampa
        06.07.2016 23:20

        а у вас исходники на proteus есть… если есть можете скинуть?



  1. IIvana
    07.07.2016 03:14

    Конечно нестандартно — использовать многоногую Мегу где сгодилась бы и 8-ногая Тинька… Ах да, это же из-за того, что этот визуальный чудо-редактор нам полтора килобайта кода нагенерил… Ну тогда можно развивать нестандартность дальше, и переписать проект на распберри пи, ардуине или вообще на десктопе — на скретче…


    1. lihouzov
      07.07.2016 06:24

      Полтора килобайта кода можно поместить и в 8-ногую тиньку, а по мне это очень даже неплохо поместить данную схему в полтора килобайта.


      1. diller61
        07.07.2016 09:56

        на самую распространенную 13 тиньку нет, там только килобайт
        а вообще полтора килобайта на такую задачу это расточительство.
        Делая сейчас проектик: измеритель частоты импульсов с медианным фильтром и управление двумя независимыми каналами ШИМ с примитивным ПИД-регулятором на одном — занимает у меня на данный момент ~800 байт. И это на C и я не супер спец по программированию МК, а на ассемблере можно было бы еще ужать.


        1. Carburn
          07.07.2016 16:53

          В деньгах экономия большая выходит?


          1. diller61
            07.07.2016 17:39

            тинька стоит 22 руб, мега8 35руб в розницу, sop и tqfp исполнение соответственно

            здесь больше вопрос целесообразности и задействования ресурсов
            размеры меньше, разводка платы под восьминогий корпус тоже проще и быстрее чем под 32-ногий (и дешевле как и пайка если говорить о промышленности)

            в конце концов(в порядке бреда уже) тини13 элементарно легче


  1. safari2012
    07.07.2016 15:37

    Зачем вообще было цифровые кнопки на одну ногу сажать, когда куча ног свободными осталась?