Нестандартний підхід до програмування мікроконтролера

У даній статті буде розглянуто нестандартний підхід до створення програми для мікроконтролера. Для прикладу побудуємо проект «кодового замка»; програма для мікроконтролера буде написана у візуальному середовищі 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 кбайта.

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.