В последней статье по ZiChip я обещал описать протокол общения между устройствами, но немного подумав, решил отложить этот вопрос на потом. Гораздо важнее, для начала, разобраться, как все-таки работает устройство ZiChip. Что происходит внутри? До этой статьи были лишь общие фразы, которые мало чего проясняли. Попробую более подробно рассказать, как все работает (тем более первое устройство ZiChip уже работает! и можно смело заявлять, что задуманная система работает как надо).
Начнем по порядку, рассмотрим «луковицу ZiChip» более подробно.
Основная идея функционирования устройства состоит в том, чтобы на заданные входные воздействия формировать заданные выходные реакции. Для описания механизма работы я оставил в луковице лишь одну цепочку «событие-действие». Таких цепочек может быть в устройстве несколько и Вы сами их будете формировать.
В качестве входного воздействия у нас TSOP – приемник команд от ИК-пульта. В качества выходного — красненький 🙂 светодиод (Red LED). TSOP подключен к ножке микроконтроллера и, соответственно, к порту ввода-вывода (в данном случае ввода) B6. Светодиод подключен к другой ножке МК и порту B4 (номера портов взяты «от фонаря» для примера).
Как Вы понимаете, кроме TSOP и светодиода, может быть любая другая периферия – кнопки, потенциометры, датчики, индикаторы, реле – все что угодно. Конечно, обработчик для каждого устройства будет свой.
Дальше происходит следующее:
— «Обработчик сигналов от TSOP» через входной порт B6 принимает посылки от ИК-пульта и по факту приема посылки изменяет содержимое точки доступа 4. Обработчик работает по прерываниям, вне зависимости от работы остальной части программы устройства.
— Дальше, элемент сценария «событие», по заданному условию (номер нажатой кнопки на пульте), активирует элемент «действие», который в свою очередь, изменяет по выбранному закону (например, увеличение) значение точки 2
— По значению точки 2 работающий в прерываниях «формирователь ШИМ-сигнала» через порт В4 управляет яркостью свечения светодиода.
Повторюсь с определениями:
Точки доступа
Точка доступа, как бы это громко не звучало, всего лишь переменная (в ZiChip размером 4 байта), но она играет ключевую роль в устройстве. Идея использования ячеек памяти для настройки периферии не нова — это те же регистры ввода-вывода в микроконтроллере или конфигурационные ячейки памяти в других протоколах, но в ZiChip главная цель точки доступа – осуществлять универсальный, стандартный механизм управления функциями устройства и выдавать результаты действия устройства способом понятным для других устройств. Для устройства нет различия, используется ли точка для ввода или вывода данных – устройство имеет один набор (массив) этих точек. Причем, часть точек привязана к периферии устройства, а часть остается свободной и может служить для формирования особых алгоритмов работы.
Обработчики, формирователи
Тут и писать особенно нечего. Обработчик, по сути, прерывание, которое вызывается по факту изменения входного значения от периферии, формирует значение для своей точки и прекращает работу. Для примера, значение для точки доступа клавиатуры будет просто номер клавиши, от датчика температуры – значение температуры в градусах и т.д.
Формирователь сигнала работает «в обратную сторону». Исходными данными для него служит точка доступа (вернее значение в ней) а выходной сигнал формируется на ножке МК (или нескольких ножках, если требуется управление более сложной периферией). Например, для ШИМ выхода значение точки доступа будет содержать значение скважности.
Если про точки доступа, обработчики и формирователи я уже писал раньше и ничего нового не сказал, то про микропрограммы и сценарий поведения до этого были лишь туманные намеки (все от того, что до настоящего времени я и сам толком не определился, как эта часть должна выглядеть). На данный момент уже есть определенное понимание и варианты реализации и в дальнейшем, я думаю, буду придерживаться этого способа формирования алгоритма поведения.
Хотя, если Вам, пользователям, захочется что-то изменить или добавить – буду прислушиваться к Вашим пожеланиям. Все изначально делалось так, чтобы впоследствии было легко менять или дополнять по надобности.
Сценарий поведения – это набор микропрограмм устройства.
Микропрограммы — это своего рода правила реакции (алгоритмы поведения) устройства на различные воздействия. Одна микропрограмма отвечает за одно воздействие и реакцию на него. Если в устройстве нужно обрабатывать несколько воздействия, то для каждого создается своя микропрограмма. Микропрограмма условно разделяется на 2 части. Первая часть отвечает за формирование команды к выполнению второй части, которая и выполняет заданные действия. Первую часть я назвал «Событие», вторую – «Действие».
По сути, Сценарий поведения является листингом программы высокого уровня, записанным в EEPROM устройства, микропрограммы – операторами в нем, а зона формирования логики (фиолетовая зона в луковице) – интерпретатором программы высокого уровня.
Сценарий, исходя из этой логики, условно может выглядеть следующим образом:
Микропрограмма1: IF (нажата кнопка пульта «1») THEN (увеличить яркость «Red LED»)
Микропрограмма2: IF (нажата кнопка пульта «2») THEN (уменьшить яркость «Red LED»)
Конец сценария.
Конструкция «IF (нажата кнопка пульта «1»)» будет являться Событием, а конструкция «THEN (увеличить яркость «Red LED»)» — Действием.
Поначалу я и планировал делать подобные текстовые записи при настройке устройства, но позже записи трансформировались в более понятный графический вид (хотя суть не поменялась).
Выше описанный сценарий в ZiChip Tuner выглядит следующим образом:
Пиктограммки с голубенькой стрелочкой являются Событиями, а с оранжевой – Действиями.
IF (нажата кнопка пульта «1») соответствует строчке —
THEN (увеличить яркость «Red LED») соответствует —
Каждый элемент сценария (как и операторы/подпрограммы в языках высокого уровня) имеет свои операнды (данные с которыми оперирует элемент). Для того чтобы эти операнды перевести из вида LED_Act (12, 46, 235, 1) — как-бы это выглядело в языках высокого уровня, в более «очеловеченный» вид, было введено поле «Настройка элемента сценария». На скриншотах ниже можно убедиться, что настройка События и Действия осуществляется более чем понятно.
Каждый элемент Сценария (и микропрограммы, соответственно) оперирует тремя видами данных (опять-таки, по аналогии с языками высокого уровня):
— константы, формирующие варианты исполнения элемента – хранятся в EEPROM;
— локальные переменные, необходимые для работы элемента – хранятся в SRAM;
— глобальные переменные, необходимые для формирования общей логики работы устройства, передачи данных от и для периферии – эту функцию выполняют точки доступа.
Вот, для примера, описание распределения памяти для элемента «Управление светодиодом»
Кроме типов элементов «Событие» и «Действие» еще будет добавлен тип «Точка». Этот тип будет реализовывать различные операции с точками, позволяя формировать более сложные логический цепочки в микропрограммах.
Для данной статьи – это все.
Для того, чтобы это система развивалась и дальше мне нужна Ваша помощь в виде обкатки устройства и отзывов, пожеланий, предложений по развитию/коррекции ZiChip. На форуме создан специальный раздел, посвященный ZiChip, где можно взять тестовые прошивки, Тюнер, написать свои отзывы. Приглашаю всех к участию в проекте!
Напоследок видео о том, как выглядит процесс настройки устройства:
Дополнительная информация есть на форуме
Скачать программы и прошивки можно на http://zichip.net/