В данной статье будет рассмотрен нестандартный подход к созданию программы для микроконтроллера. Для примера построим проект «кодового замка»; программа для микроконтроллера будет написана в визуальной среде Horizont Configurator.
Упрощенная принципиальная схема проекта представлена следующим рисунком. На данном рисунке не отображены выводы питания, а также в качестве исполнительного механизма используется светодиод. В качестве управляющего выбран микроконтроллер ATmega8.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/f09/f72/69b/f09f7269b5532d1fa78c75cee0e6e21a.png)
Для реализации проекта необходимо задействовать 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](https://habrastorage.org/r/w1560/getpro/habr/post_images/d1d/8a2/d29/d1d8a2d29b9731a051178905c4d79e2a.png)
Для замера потенциала с «кнопочного поля 0-9» я использовал вывод микроконтроллера связанный с АЦП, это «PINCO». Для возможности замера напряжения на выводе «PINCO», на холст добавлены блоки «ADC_ATmega8A» и «ADC PinCO».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/946/d65/db7/946d65db72aa52d6dd7c739deffe4fdd.png)
Блок «ADC_ATmega8A» настраивает параметры встроенного в микроконтроллер аналого-цифрового преобразователя, в настройках указал значение опорного напряжения равное напряжению питания микроконтроллера. Таким образом я настроил АЦП для измерения напряжения в диапазоне 0-5 вольт. Для получения значения напряжения на выводе микроконтроллера «PINCO» я использовал блок «ADC PinCO». На выводе блока будет получен дискретный сигнал в диапазоне 0-1023 пропорциональный величине напряжения на выводе «PINCO», причем 0 вольт соответствует значение 0, а 5 вольтам значение 1023. Для приведения напряжения удобному для нас значению я использовал блок «деления» и «константу».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/97d/2d3/660/97d2d366065e65528d2958c9f594916d.png)
При делении входного диапазона 0-1023 на 90 мы получаем диапазон удобный для нас 0-11 диапазон 0-11. Причем нажатию «кнопки 0» будет соответствовать значение 0, 1- 1, ..,9- 9, а в свободном состоянии (ни одна кнопка не нажата) будет значение 11. Для фиксации события устойчивого состояния линии, использую блок «задержка» и блок «равенство».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/988/4f4/70e/9884f470efd85f7eabb7f8370de27a2c.png)
На выходе блока «задержка» мы получаем значение которое было на входе блока «задержка» в предыдущем рабочем цикле. При равенстве значений в предыдущем цикле и в текущем мы фиксируем устойчивое состояние линии, при этом на выходе блока «равенство» будет сигнал логической 1 (true), в противном случае 0 (false). Для отфильтровывания значения 11 «свободного состояния линии» используем блоки «меньше», константу 11 и блок логическое «И».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/bc9/1de/b41/bc91deb416bf7982b19c79ad6992291a.png)
На выводе блока «логическое И» будет присутствовать логическая единица если линия находится в устойчивом состоянии и значение после делителя меньше 11. Чтобы ограничить допустимую скорость ввода значений с «кнопочного поля 0-9», это повышает помехоустойчивость и ограничивает скорость «подбора кода», использую блок «задержка включения» и необходимый ему блок «счетчик миллисекунд».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/e6e/b64/0aa/e6eb640aa947cb377edf9e252efc137e.png)
Для окончательного формирования сигнала «ввода цифры» отследим нарастающий фронт и по данному сигналу сформируем одиночный импульс «ввода цифры». Для этого используем блок «RTRIG».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/7e9/76b/24f/7e976b24f9b0c0833c26ec2ea093bcd3.png)
С целью читаемости схемы и уменьшения дополнительных соединительных линий добавлю «переходы» соединительных линий. Первый переход «введенная цифра», второй «сигнал ввода цифры». Задействуем вывод управляющий светодиодом «цифра принята», в моей схеме это вывод микроконтроллера «PinB6».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/16e/66a/4a8/16e66a4a8d9924f9883fbfb493e9b62b.png)
Воспользуемся сигналами «введенная цифра» и «сигнал ввода цифры», а так же блоками для хранения дискретных чисел «память» и организуем логику хранения последних введенных чисел. В моем случае я использовал четыре блока «память», что будет определять секретность замка в четыре цифры.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/a41/98f/28b/a4198f28bbbe09877e913bd48a046462.png)
Логика работает следующим образом при поступлении «сигнала ввода символа» значение «введенная цифра» будет записано в блок «память 1», в свою очередь значение ранее содержащее в блоке «память 1» запишется в в блок «память 2» итд. В блоках «память 1»- «память 2» будут хранится последние введенные цифры. Причем в блоке «память 1» будет хранится последняя введенная цифра, в блоке «память 2»- предпоследняя, итд. Добавим «переходы» для значений вводимых символов.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/c84/504/422/c84504422d19fc9668eb38638f9fa6ea.png)
Для хранения кода замка будем использовать энергонезависимую EEPROM память микроконтроллера. Каждую цифру кода будем хранить в отдельной ячейки EEPROM. В нашем случае нам потребуется 4 ячейки памяти. Выберем адреса ячеек EEPROM для хранения кода, для своего проекта я выбрал ячейки 10, 11, 12, 13.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/ac8/0ba/55e/ac80ba55ec7da91b598692919cf5ad92.png)
Чтобы считать значение хранящиеся в ячейках EEPROM будем использовать блок «чтение байта EEPROM».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/13f/901/c7a/13f901c7a5d2de1af49f0be0b497e2d0.png)
В итоге у нас имеются цифры введенные с «кнопочного поля 0-9» и цифры полученные из ячеек EEPROM, остается сделать сравнение цифр и сформировать сигнал управления исполнительным механизмам замка. Для данной задачи я использовал блок «равенство» и блок «логическое И».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/edd/062/f01/edd062f0131ce8da2a858871b6cefcb5.png)
На данном этапе логика кодового замка полностью функционирует, единственное остается «научить» микроконтроллер самостоятельно сохранять нужный пользователю код замка в память EEPROM. Для данной задачи я использую внешний сигнал «сохранить код» и по данному сигналу сформирую импульс записи EEPROM, для этого я воспользуюсь блоками логический вход «PinD6» и блоком «RTRIG», а так же для удобства создам соответствующий переход.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/897/c6e/76b/897c6e76bfb707810aafc254892e5d3c.png)
Построим логику записи данных в EEPROM, все сигналы и данные уже сформированы ранее, непосредственно для записи данных в EEPROM будем использовать блок «запись байта в EEPROM».
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/949/82b/b88/94982bb88bd9a46e3bc6fdfee3edb2c5.png)
Логика работы кодового замка описана, общий вид проекта выглядит следующим образом.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/79a/4f0/cc0/79a4f0cc0983a171dfe06f96c630eb32.png)
Собираем проект:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/372/d48/800/372d488000c7a135a2a5c2716af4252b.png)
После сборки проекта мы получили исполняемый *.hex файл размером 1450 байт, делаем вывод что нам можно использовать микроконтроллер с размером flash памяти 2 кбайта.
Тестирование проекта:
Упрощенная принципиальная схема проекта представлена следующим рисунком. На данном рисунке не отображены выводы питания, а также в качестве исполнительного механизма используется светодиод. В качестве управляющего выбран микроконтроллер ATmega8.
![image](https://habrastorage.org/getpro/habr/post_images/f09/f72/69b/f09f7269b5532d1fa78c75cee0e6e21a.png)
Для реализации проекта необходимо задействовать 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](https://habrastorage.org/getpro/habr/post_images/d1d/8a2/d29/d1d8a2d29b9731a051178905c4d79e2a.png)
Для замера потенциала с «кнопочного поля 0-9» я использовал вывод микроконтроллера связанный с АЦП, это «PINCO». Для возможности замера напряжения на выводе «PINCO», на холст добавлены блоки «ADC_ATmega8A» и «ADC PinCO».
![image](https://habrastorage.org/getpro/habr/post_images/946/d65/db7/946d65db72aa52d6dd7c739deffe4fdd.png)
Блок «ADC_ATmega8A» настраивает параметры встроенного в микроконтроллер аналого-цифрового преобразователя, в настройках указал значение опорного напряжения равное напряжению питания микроконтроллера. Таким образом я настроил АЦП для измерения напряжения в диапазоне 0-5 вольт. Для получения значения напряжения на выводе микроконтроллера «PINCO» я использовал блок «ADC PinCO». На выводе блока будет получен дискретный сигнал в диапазоне 0-1023 пропорциональный величине напряжения на выводе «PINCO», причем 0 вольт соответствует значение 0, а 5 вольтам значение 1023. Для приведения напряжения удобному для нас значению я использовал блок «деления» и «константу».
![image](https://habrastorage.org/getpro/habr/post_images/97d/2d3/660/97d2d366065e65528d2958c9f594916d.png)
При делении входного диапазона 0-1023 на 90 мы получаем диапазон удобный для нас 0-11 диапазон 0-11. Причем нажатию «кнопки 0» будет соответствовать значение 0, 1- 1, ..,9- 9, а в свободном состоянии (ни одна кнопка не нажата) будет значение 11. Для фиксации события устойчивого состояния линии, использую блок «задержка» и блок «равенство».
![image](https://habrastorage.org/getpro/habr/post_images/988/4f4/70e/9884f470efd85f7eabb7f8370de27a2c.png)
На выходе блока «задержка» мы получаем значение которое было на входе блока «задержка» в предыдущем рабочем цикле. При равенстве значений в предыдущем цикле и в текущем мы фиксируем устойчивое состояние линии, при этом на выходе блока «равенство» будет сигнал логической 1 (true), в противном случае 0 (false). Для отфильтровывания значения 11 «свободного состояния линии» используем блоки «меньше», константу 11 и блок логическое «И».
![image](https://habrastorage.org/getpro/habr/post_images/bc9/1de/b41/bc91deb416bf7982b19c79ad6992291a.png)
На выводе блока «логическое И» будет присутствовать логическая единица если линия находится в устойчивом состоянии и значение после делителя меньше 11. Чтобы ограничить допустимую скорость ввода значений с «кнопочного поля 0-9», это повышает помехоустойчивость и ограничивает скорость «подбора кода», использую блок «задержка включения» и необходимый ему блок «счетчик миллисекунд».
![image](https://habrastorage.org/getpro/habr/post_images/e6e/b64/0aa/e6eb640aa947cb377edf9e252efc137e.png)
Для окончательного формирования сигнала «ввода цифры» отследим нарастающий фронт и по данному сигналу сформируем одиночный импульс «ввода цифры». Для этого используем блок «RTRIG».
![image](https://habrastorage.org/getpro/habr/post_images/7e9/76b/24f/7e976b24f9b0c0833c26ec2ea093bcd3.png)
С целью читаемости схемы и уменьшения дополнительных соединительных линий добавлю «переходы» соединительных линий. Первый переход «введенная цифра», второй «сигнал ввода цифры». Задействуем вывод управляющий светодиодом «цифра принята», в моей схеме это вывод микроконтроллера «PinB6».
![image](https://habrastorage.org/getpro/habr/post_images/16e/66a/4a8/16e66a4a8d9924f9883fbfb493e9b62b.png)
Воспользуемся сигналами «введенная цифра» и «сигнал ввода цифры», а так же блоками для хранения дискретных чисел «память» и организуем логику хранения последних введенных чисел. В моем случае я использовал четыре блока «память», что будет определять секретность замка в четыре цифры.
![image](https://habrastorage.org/getpro/habr/post_images/a41/98f/28b/a4198f28bbbe09877e913bd48a046462.png)
Логика работает следующим образом при поступлении «сигнала ввода символа» значение «введенная цифра» будет записано в блок «память 1», в свою очередь значение ранее содержащее в блоке «память 1» запишется в в блок «память 2» итд. В блоках «память 1»- «память 2» будут хранится последние введенные цифры. Причем в блоке «память 1» будет хранится последняя введенная цифра, в блоке «память 2»- предпоследняя, итд. Добавим «переходы» для значений вводимых символов.
![image](https://habrastorage.org/getpro/habr/post_images/c84/504/422/c84504422d19fc9668eb38638f9fa6ea.png)
Для хранения кода замка будем использовать энергонезависимую EEPROM память микроконтроллера. Каждую цифру кода будем хранить в отдельной ячейки EEPROM. В нашем случае нам потребуется 4 ячейки памяти. Выберем адреса ячеек EEPROM для хранения кода, для своего проекта я выбрал ячейки 10, 11, 12, 13.
![image](https://habrastorage.org/getpro/habr/post_images/ac8/0ba/55e/ac80ba55ec7da91b598692919cf5ad92.png)
Чтобы считать значение хранящиеся в ячейках EEPROM будем использовать блок «чтение байта EEPROM».
![image](https://habrastorage.org/getpro/habr/post_images/13f/901/c7a/13f901c7a5d2de1af49f0be0b497e2d0.png)
В итоге у нас имеются цифры введенные с «кнопочного поля 0-9» и цифры полученные из ячеек EEPROM, остается сделать сравнение цифр и сформировать сигнал управления исполнительным механизмам замка. Для данной задачи я использовал блок «равенство» и блок «логическое И».
![image](https://habrastorage.org/getpro/habr/post_images/edd/062/f01/edd062f0131ce8da2a858871b6cefcb5.png)
На данном этапе логика кодового замка полностью функционирует, единственное остается «научить» микроконтроллер самостоятельно сохранять нужный пользователю код замка в память EEPROM. Для данной задачи я использую внешний сигнал «сохранить код» и по данному сигналу сформирую импульс записи EEPROM, для этого я воспользуюсь блоками логический вход «PinD6» и блоком «RTRIG», а так же для удобства создам соответствующий переход.
![image](https://habrastorage.org/getpro/habr/post_images/897/c6e/76b/897c6e76bfb707810aafc254892e5d3c.png)
Построим логику записи данных в EEPROM, все сигналы и данные уже сформированы ранее, непосредственно для записи данных в EEPROM будем использовать блок «запись байта в EEPROM».
![image](https://habrastorage.org/getpro/habr/post_images/949/82b/b88/94982bb88bd9a46e3bc6fdfee3edb2c5.png)
Логика работы кодового замка описана, общий вид проекта выглядит следующим образом.
![image](https://habrastorage.org/getpro/habr/post_images/79a/4f0/cc0/79a4f0cc0983a171dfe06f96c630eb32.png)
Собираем проект:
![image](https://habrastorage.org/getpro/habr/post_images/372/d48/800/372d488000c7a135a2a5c2716af4252b.png)
После сборки проекта мы получили исполняемый *.hex файл размером 1450 байт, делаем вывод что нам можно использовать микроконтроллер с размером flash памяти 2 кбайта.
Тестирование проекта: