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

Для реализации проекта необходимо задействовать 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 вольт.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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