Микроконтроллеры в домашних условиях
 

Модуль управления.

Общее описание

Схема устройства

Ресурсы контроллера

Сетевой интерфейс

Работа меню

Прошивка

Фото

Общее описание

Управление модулями, подключенными к сети, довольно удобно осуществлять при помощи программы на компьютере. Однако, в домашних условиях компьютер не всегда бывает включен. Да и включать его ради отправки одной команды, либо проверки одного параметра не очень удобно.

Разработка модуля специально для целей управления и контроля без использования компьютера стало моей задачей после обкатки двух первых сетевых модулей и управляющей программы.

Для отображения информации я выбрал семисегментные светодиодные индикаторы. Это сделано для лучшей видимости в темноте и с некоторого расстояния (до нескольких метров), так сказать, не вставая с дивана. Ну а если идти до конца, то и управлять этим модулем тоже необходимо с дивана. Ответ прост - инфракрасный пульт ДУ. Кроме того, желательно обойтись уже существующим пультом (например, от телевизора), чтобы не плодить их целую гроздь. Итак, задача поставлена, пора действовать.

Приведу основные характеристики рассматриваемого модуля управления :

Наверх

Схема устройства

Модуль управления

Рис. 1.

Устройство собрано на базе контроллера PIC16F876A.

Стабилизатор питающего напряжения выполнен на микросхеме КРЕН5А.

Для индикации использованы два четырехразрядных семисегментных светодиодных индикатора с общим анодом. Схема их включения стандартная.

Взаимодействие с сетью осуществляется при помощи драйвера MAX1483.

Приемних сигнала инфракрасного пульта TFMS5360 включен на вход внешних прерываний.

Две кнопки SBлев и SBпр используются для навигации по пунктам меню. Располагаются они соответственно на левой и правой грани корпуса устройства (отсюда и название). Назначение их следующее. SBлев служит для перехода на следующий пункт меню или подменю (функция "далее"), а также, в режиме подтверждения операции принимает подтверждаемое действие (функция "да"). SBпр используется для входа в выбранный пункт меню либо в режим подтверждения операции (функция "выбор"), а также, в режиме подтверждения операции отменяет подтверждаемое действие (функция "нет").

Одновременное нажатие обеих кнопок приводит к включению служебного меню, которое в своем составе неизменно (в отличие от основного, где информация о количестве и содержании пунктов хранится в EEPROM и может изменяться в процессе работы устройства). Служебное меню необходимо для настройки параметров самого устройства.

Входы кнопок совмещены с дополнительными устройствами.

Совместно с кнопкой SBпр включен датчик температуры DS1821, а с кнопкой SBлев - пьезодинамик для звукового оповещения. Так как кнопки используются редко, да и их функции продублированы ИК пультом, мы можем себе это позволить.

Монтажную плату устройства в формате Sprint-Layout 5.0 скачиваем здесь.

Наверх

Ресурсы контроллера

Любой более-менее сложный проект должен начинаться с распределения ресурсов выбранного микроконтроллера под необходимые задачи. Кстати, на этом этапе возможно принятие решения и о смене типа контроллера, если ресурсов не хватает.

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

Для частоты 20 МГц один командный цикл составляет 0,2 мксек.

Сторожевой таймер включаем на максимальный предделитель.

Таймер 0 без предделителя, используется в двух режимах: для отсчета временных интервалов при связи с термодатчиком, и для формирования частоты возбуждения звукосинтезирующего пьезодинамика.

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

Таким образом, приоритет звукосинтезатора необходим, а считывание температуры (если оно включено) может быть выполнено в следующем интервале.

Таймер 1 не использует предделителя, применяется для отсчета временных интервалов при приеме команд от ИК пульта.

Таймер 2 используется для работы с USART (переход на прием после передачи байта), предделитель 1:4, выходной делитель 1:1.

Скорость USART 9600 бит/сек.

Используются следующие прерывания: приемника USART (RCIF) - при приеме байта, таймера 2 (TMR2IF) - контроль окончания передачи байта, таймера 0 (T0IF) - частота пищалки, по входу RB0/INT (INTF) - прием команд ИК пульта.

Использование различных видов памяти будет освещено при описании прошивки.

Наверх

Сетевой интерфейс

Для правильного функционирования в сети модуль, прежде всего, должен реагировать на команды.

Последовательность байтов <45h>, <45h>, <адрес ведомого>, <41h> модуль воспринимает как команду на передачу статуса. Формат передачи статуса в общем виде выглядит так: <8h>, <55h>, <состояние измерения температуры >, <температура >, <знак температуры >, <уровень яркости >, <номер частоты пищалки >, <байт ошибок >, <CRC >.

Здесь 8h - общее количество байтов в последующей посылке. 55h - идентификатор типа модуля. Состояние измерения температуры - байт, информирующий, включено или нет измерение температуры, значения: 31h - измерение включено, 30h - измерение выключено. Температура - значение температуры, измеренной датчиком, при выключенном измерении передается число FFh. Знак температуры - принимает значения: 01h - температура отрицательная, FFh - температура неотрицательная, EEh - ошибка датчика температуры. Уровень яркости - значение установленного уровня яркости индикаторов: диапазон от 01h до 05h. Номер частоты пищалки - значение установленно номера частоты: диапазон от 03h до 08h. Байт ошибок содержит флаги ошибок: бит 1 - ошибка записи в EEPROM, бит 2 - ошибка CRC при приеме кода меню. Байт CRC подсчитывается со всеми байтами в посылке, начиная с типа модуля.

В общем случае команда, на которую откликается модуль, выглядит так: <45h>, <45h>, <адрес>, <команда>, <параметр>. Здесь поле <параметр> не носит обязательный характер и используется только для определенных команд. Формат команды справедлив для уже зарегистрированного в сети модуля с присвоением адреса. Процедура первоначальной регистрации аналогична описанной на странице "Сетевой интерфейс".

Перейдем к описанию команд: 41h - запрос на передачу статуса модуля, 53h - включить измерение температуры, 53h - выключить измерение температуры, 54h - установить уровень яркости (далее должен следовать параметр - число 01h до 05h), 55h - установить номер частоты пищалки (далее должен следовать параметр - число 03h до 08h), 46h - запрос на передачу содержимого EEPROM (при следующей команде на передачу статуса), 47h - запрос на передачу данных об ИК пульте из памяти программ (при следующей команде на передачу статуса), 49h - линия свободна для отправки команды, 50h - начать прием данных о пунктах меню в EEPROM, 42h - сброс собственного сетевого адреса на 01h.

Формат передачи содержимого EEPROM аналогичен передаче содержимого памяти данных (передается при получении команды на передачу статуса после принятия в предыдущем цикле команды соответственно 46h или 47h): <FFh>, <содержимое ячейки с адресом FFh>, <содержимое ячейки с адресом FEh>, <содержимое ячейки с адресом FDh>, ... <содержимое ячейки с адресом 0h>, <CRC>. Здесь первый байт обозначает общее количество передаваемых байт без CRC. Следует отметить, что содержимое EEPROM передается полностью (общий объем 256 байт), из памяти программ передается диапазон ячеек со старшим адресом (1800h - 18FFh) - именно в этом диапазоне и находятся данные о параметрах сигналов ИК пульта.

Сразу после приема команды 50h модуль начинает принимать байты данных о пунктах меню и сохранять их в EEPROM (начиная с адреса 10h). Формат данных следующий: <общее количество байтов без CRC>, <последовательность байтов собственно данных>, <CRC>. При этом в EEPROM записываются только данные без общего количества и CRC.

Рассмотрим работу модуля при отправке команды.

Если имеется команда для отправки в сеть, то модуль в ответ на команду запроса передачи статуса (41h) передает не байты состояния, а два байта 57h и 57h, информируя ведущего о необходимости отправки команды.

Ведущий, получив два байта запроса (а он проверяет получаемые данные на предмет наличия этих двух байтов в ответе), формирует стандартную команду для модуля с адресом, в ответе которого обнаружены байты запроса на передачу, о возможности начать передачу команды (в общем случае команда выглядит так: <45h>, <45h>, <адрес модуля>, <49h>).

Получив вышеобозначенную команду, описываемый модуль начинает отправку команды в сеть. Формат команды в общем случае следующий: <45h>, <45h>, <адрес модуля получателя >, <команда>, <параметр (при наличии)>.

Все время, пока активный ведомый передает байты команды, ведущий находится в режиме ожидания, контролируя наличие передаваемых байтов. После того как передача окончилась, ведущий, с контролем отсутствия передачи больше определенного промежутка времени, начинает опрос следующих по порядку адресов модулей (если таковые имеются).

Наверх

Работа меню

Для описания того, как отображаются пункты меню на дисплее, а также, их взаимодействия, необходимо воспользоваться примером, т. е. реальной жизненной ситуацией. Буду описывать те пункты меню, которые работают у меня (на них я отлаживал устройство).

Отображение меню

Рис. 2.

Всего в меню три пункта. Первый пункт отображает температуру на улице. Второй пункт - состояние вентилятора вытяжки. Третий пункт показывает температуру, измеренную датчиком, установленном в самом модуле.

Переключение между пунктами осуществляется нажатием левой кнопки (надпись "Далее"). Кроме того, левой кнопкой подтверждается отправка команды (надпись "Да"). Активность одной из перечисленных функций для левой кнопки подтверждается наличием точки в крайнем левом разряде. При этом, если точка стоит в левом верхнем разряде, то активна функция "Далее", если точка в левом нижнем разряде - активна функция "Да".

Как видно из рисунка 2, пункт контроля вытяжки имеет подпункты.

Переход в подменю осуществляется нажатием правой кнопки, имеющей функцию "Выбор" (точка в правом верхнем разряде). Подменю имеет три пункта: отключение, включение вытяжки и выход из подменю. Навигация по пунктам осуществляется кнопкой "Далее". При нажатии кнопки "Выбор" в пункте включения или отключения вытяжки модуль перейдет в режим подтверждения команды - точки в левом и правом разрядах перейдут с верхней строки в нижнюю, информируя об активности функций соответственно "Да" и "Нет".

При нажатии любой из этих кнопок происходит выход из режима подтверждения в пункт подменю, из которого он был вызван. При этом, если выход произведен нажатием кнопки "Нет", то никаких дополнительных действий не произойдет. Если же выход выполнен нажатием кнопки "Да", то происходит формирование соответствующей команды соответствующему модулю, которая будет отправлена в следующем цикле опроса.

Если нажать кнопку "Выбор" в последнем пункте подменю, то произойдет возврат в вызвавший пункт основного меню.

Точки в двух внутренних разрядах верхней и нижней строки используются для приблизительного информирования о том, в каком пункте меню или подменю мы находимся в данный момент.

Здесь возможны следующие ситуации. Точки верхней строки говорят о том, чот мы находимся в основном меню. Точки же в нижней строке информируют о нахождении в подменю (при этом верхняя строка наименования во всем подменю и в соответствующем пункте меню одинаковы).

Так как количество точек две (левая и правая), можно ориентироваться, где именно, в начале или в конце меню (подменю) мы находимся. При этом, если светится одна левая точка, то мы находимся в первом пункте меню (подменю), если же одна правая - в последнем. Когда светятся обе точки, это говорит о том, что мы находимся в промежуточном (не первом и не последнем) пункте меню (подменю).

Следует отметить, что пункт меню, показывающий температуру собственного датчика, является не настраиваемым. Поэтому пункт, который находится перед ним, будет отображаться, как последний.

Выше приведено описание меню, наименования и функции которого пользователь может настроить с помощью управляющей программы на компьютере и сохранить специальной командой в модуле.

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

Переход в это меню осуществляется одновременным нажатием правой и левой кнопок.

Отображение служебного меню

Рис. 3.

Логика работы и отображения та же, что и для основного меню.

Пункт настройки яркости дисплея осуществляет ступенчатое изменение значения яркости от 1 до 5. По достижении верхнего значения диапазона переходит на нижнее значение.

Аналогично работает пункт настройки номера частоты пищалки, только границы другие: нижняя - 3, верхняя - 8.

Пункт включения / выключения измерения температуры, также, работает с подтверждением команды.

Самый сложный - пункт настройки работы с ИК пультом. Так как пульт предполагается любой, следовательно необходимо запомнить параметры сигнала при нажатии одной из кнопок (всего должно быть записано значение для двух кнопок - по аналогии с правой и левой).

Всего предусмотрено четыре подпункта: "ired scan" - для первоначального сканирования сигнала пульта, "ired cl" - для сброса информации о сигналах пульта при необходимости настройки других кнопок, либо смене пульта, "butl set" - сохранение сигнала для левой кнопки (при нажатии кнопки пульта, сохраненной в этом подпункте будет работать логика нажатия на левую кнопку модуля), "butr set" - сохранение сигнала для правой кнопки.

Работа с подпунктом "ired cl" аналогична работе с подтверждением команды.

Рассмотрим пример работы с подпунктом сканирования пульта.

При нахождении в подпункте "ired scan" необходимо нажать и удерживать правую кнопку модуля. При этом на дисплее высветится "scan push", информируя о необходимости нажатия кнопки пульта. Если в это время отпустить правую кнопку модуля, то никакая информация сохранена не будет. Во время высвечивания "scan push" нажимаем любую кнпку пульта (направив его на модуль), желательно, чтобы это была одна из кнопок, планируемых для дальнейшего управления. После появления надписи "scan done" кнопку пульта и правую кнопку модуля можно отпустить - информация сохранена.

Аналогичная процедура и при сохранении непосредственно правой и левой кнопок пульта (точнее, тех кнопок пульта, которые будут работать в качестве дублеров правой и левой кнопок модуля).

Последний пункт служебного меню служит для возврата в главное меню.

Следует отметить, что если мы находились в каком-либо пункте или подпункте главного или служебного меню и долгое время не производили никаких действий, то модуль перейдет к отображению первого пункта главного меню.

В таблице представлен формат хранения данных о главном меню в EEPROM.

Адрес
Данные
Примечание
10h
02h
Общее количество пунктов меню
11h
FFh
Разделитель
12h
01h
Номер пункта меню
13h
02h
Адрес привязанного модуля
14h
78h
0-й байт названия пункта меню "t"
15h
1Ch
1-й байт названия пункта меню "u"
16h
5Ch
2-й байт названия пункта меню "o"
17h
78h
3-й байт названия пункта меню "t"
18h
01h
Номер байта в ответе модуля
19h
EEh
Действие с байтом ответа - отображение со знаком
1Ah
0Fh
Отсутствие подменю
1Bh
FFh
Разделитель
1Ch
02h
Номер пункта меню
1Dh
02h
Адрес привязанного модуля
1Eh
54h
0-й байт названия пункта меню "n"
1Fh
77h
1-й байт названия пункта меню "A"
20h
71h
2-й байт названия пункта меню "F"
21h
0h
3-й байт названия пункта меню
22h
03h
Номер байта в ответе модуля
23h
ECh
Действие с байтом ответа - отображение при значении байта
24h
02h
Кол-во состояний для отображения
25h
30h
Значение байта (нагрузка выкл.)
26h
52h
Команда на выключение
27h
71h
4-й байт состояния "F"
28h
71h
5-й байт состояния "F"
29h
5Ch
6-й байт состояния "o"
2Ah
0h
7-й байт состояния
2Bh
31h
Значение байта (нагрузка вкл.)
2Ch
53h
Команда на включение
2Dh
54h
4-й байт состояния "n"
2Eh
5Ch
5-й байт состояния "o"
2Fh
0h
6-й байт состояния
30h
0h
7-й байт состояния
31h
FFh
Окончание меню
32h
FFh
33h
FFh

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

Приведенную последовательность данных можно заложить в устройство на этапе прошивки, либо формируя соответствующую команду через управляющую программу на компьютере.

Наверх

Прошивка

Файлы проекта в среде MPLab IDE можно скачать здесь.

Исходный код с описанием алгоритмов работы приведен ниже.

Микроконтроллер PIC16F876A использует внешний кварцевый резонатор 20 МГц. Сторожевой таймер включен на максимальный предделитель.

Следует отметить, что память программ данного контроллера состоит из четырех страниц, и при переходе с одной страницы на другую и обратно необходимо вручную управлять соответствующими битами настройки PCLATH, 3 и PCLATH, 4.

В основном цикле программы (метка CYCLE) происходит подсчет количества выполнений (счетчики LED_COUNT_L и LED_COUNT_H), и, в зависимости от этого зажигается (либо гасится - для регулировки яркости) соответствующий разряд индикации.

Яркость (длительность) горения каждого разряда индикации определяется путем сравнения значения регистра LED_COUNT_H и регистра LED_BRIGHT - после превышения LED_COUNT_H значения в LED_BRIGHT все разряды гасятся (но инкрементирование LED_COUNT_H продолжается). По достижении LED_COUNT_H значения 10 происходит смена отображаемого разряда (метка DIGIT_CHANGE). Здесь в подпрограмме CHECK_SET_DIGIT выводится на индикацию соответствующий разряд, после чего отсчет циклов (времени отображения) возобновляется.

Биты регистра ACTIVE_DIGIT определяют, какой разряд активен в данный момент (в каждый момент времени установлен только один бит регистра).

После показа всех восьми разрядов индикации происходит включение отображение с нулевого разряда (выполняется часть программы с метки CHANGE_FRAME).

В случае включенного измерения температуры при помощи счетчиков TEMP_COMV_COUNT_L и TEMP_COMV_COUNT_H производится подсчет количества смен кадра (метка CHANGE_FRAME) и установка флага TEMP_COMV_FLAG, 0 для начала связи с термодатчиком.

При каждом инкременте счетчика LED_COUNT_H (примерно 1 раз в 51 мксек) происходит поочередный вызов следующих подпрограмм: TEMPERATURE - при установленном флаге TEMP_COMV_FLAG, 0 производится связь с термодатчиком; MENU_SURFING - при фиксации нажатия правой или левой (или обеих) кнопок выбирается, какой пункт меню (главного или служебного) отображать; BUT_CHECK_L - фиксируется нажатие левой кнопки модуля с исключением дребезга контактов; BUT_CHECK_R - фиксируется нажатие правой кнопки модуля с исключением дребезга контактов; SET_DISPLAY - отображает соответствующий (выбранный в подпрограмме MENU_SURFING) пункт меню; SAVE_TO_EEPROM - происходит сохранение байта (байтов) данных в EEPROM при установленном соответствующем флаге (флагах). Также здесь выполняются подпрограммы I_RED_CHECK (проверка кода при работе с ИК пультом), CHECK_WORK_MENU (для работы в режиме сохранения кода ИК пульта), CHECK_MISS_DATA (проверка отсутствия данных в сети, необходимых для отображения).

В более редко выполняемой части программы (смена кадра - метка CHANGE_FRAME) выполняется процедура выхода в 1-й пункт главного меню при длительном отсутствии активности - CHECK_N_RETURN.

Прежде чем перейти к описанию работы с меню необходимо пояснить следующее. Как сказано выше, данные о конфигурации главного меню хранятся в EEPROM. Для работы с данными при первоначальном запуске модуля они считываются и сохраняются в 1 банк памяти данных, начиная с адреса A1h (так быстрее к ним обращаться при работе, так как USART построен на прерываниях и время его обработки должно быть, по возможности, малым). Пример сохранения в памяти данных приведен в таблице ниже (используется описанная выше последовательность данных, хранящихся в EEPROM).

Адрес
Данные
Примечание
A1h
01h
Номер пункта меню
A2h
02h
Адрес связанного модуля
A3h
01h
Номер байта в ответе
A4h
EEh
Действие с байтом ответа
A5h
0h
Значение байта
A6h
EEh
Ошибка данных
A7h
02h
Номер пункта меню
A8h
02h
Адрес связанного модуля
A9h
03h
Номер байта в ответе
AAh
ECh
Действие с байтом ответа
ABh
0h
Значение байта
ACh
EEh
Ошибка данных

Как видно из таблицы, данные о каждом пункте меню скомпонованы по 6 байтов. Последний шестой байт информирует о наличии, либо отсутствии данных из сети, и первоначально при инициализации программы данные имеют именно такой вид. Далее при работе с сетью шестой байт может принимать следующие значения: FFh - значение контролируемого байта положительно, 01h - значение контролируемого байта отрицательно, AAh - данные актуальны.

Исходя из описанного представления данных и общего количества ячеек в банке 1 можно сделать вывод, что устройство способно вместить до 10 пунктов меню. Собственно говоря, этого достаточно для управления небольшим количеством устройств. Наконец, всегда можно сделать и два, и три таких модуля, чтобы вместить все необходимое количество управляемых и контролируемых объектов.

Блок-схема алгоритма подпрограммы SET_MOD_DATA, осуществляющей первоначальное заполнение памяти данных представлена на рис. 4

Блок-схема алгоритма установки начальных данных о модулях

Рис. 4

Как уже было сказано, фиксация нажатия кнопок фиксируется в соответствующих подпрограммах. В случае фиксации такого нажатия в подпрограмме MENU_SURFING происходит определенное действие с пунктами меню (изменение состояния флагов и, при необходимости, формирование команды управления в сеть).

Часть такого действия, относящаяся к главному меню (так как содержание его пунктов заранее неизвестно) представлена на рис. 5.

Блок-схема алгоритма обработки нажатия кнопок

Рис. 5

Обработка нажатия кнопок при нахождении в служебном меню на блок-схеме не представлена, так как алгоритм смены пунктов очевиден из представленного на рис. 3 алгоритма.

Кроме прочего в подпрограмме MENU_SURFING при смене отображения пунктов меню устанавливается флаг FLAG_CHANGE_MENU, 0, необходимый для отработки подпрограммой SET_DISPLAY действий по смене информации на дисплее.

Итак, подпрограмма SET_DISPLAY в случае установленного флага FLAG_CHANGE_MENU, 0 производит выбор и установку соответствующих данных для отображения на дисплее. Алгоритм работы подпрограммы, начиная с метки FLAG_CHANGE_MENU, 0, приведен на рис. 6

Блок-схема алгоритма отображения главного меню

Рис. 6

Здесь, также, приведен алгоритм только для главного меню, так как его состав заранее неизвестен.

В состав приведенной подпрограммы входят несколько подпрограмм.

Алгоритм подпрограммы поиска адреса пункта меню SEARCH_MENU_ADR приведен ниже.

Блок-схема алгоритма поиска адреса пункта меню

Рис. 7

Алгоритм подпрограммы проверки и установки точек на дисплее CHECK_SET_POINTS приведен на рис. 8.

Блок-схема алгоритма проверки и установки точек

Рис. 8

Алгоритм подпрограммы отображения со знаком A1 представлен на рис. 9.

Блок-схема алгоритма отображения со знаком

Рис. 9

Алгоритм подпрограммы отображения при определенном значении байта A2 расположен на рис. 10.

Блок-схема алгоритма отображения при значении байта

Рис. 10

Подпрограммы A1 и A2 содержат подпрограмму поиска данных для пунктов меню SEARCH_MENU_DATA. Ее алгоритм приведен на рис 11.

Блок-схема алгоритма поиска данных для меню

Рис. 11

В случае появления еще каких-либо условий отображения, то в подпрограмму SET_DISPLAY добавятся подпрограммы наряду с существующими A1 и A2.

Работа модуля с сетью предполагает прием и передачу байтов сообщений. Работа с USART организована посредством прерываний. При приеме байта генерируется прерывание от приемника. Во время передачи включен таймер 2, при переполнении которого проверяется состояния бита TRMT.

Блок-схема алгоритма прерываний USART

Рис. 12

В обработчиках прерываний вызывается главная подпрограмма обработки данных.

Блок-схема алгоритма обработки USART главная подпрограмма

Рис. 13

Из главной подпрограммы происходит переход к одной из следующих подпрограмм при выполнении соответствующих условий.

Блок-схема алгоритма обработки USART прием

Рис. 14

 

Блок-схема алгоритма обработки USART прием чужой адрес

Рис. 15

 

Блок-схема алгоритма обработки USART передача

Рис. 16

Прием сигналов от ИК пульта производится приемником, включенным на вход RBO.

Модуль расчитан (теоретически) на работу с любым пультом, поэтому кнопки пульта (две - аналог правой и левой кнопок модуля) должны быть предварительно зашиты в память модуля. Следует отметить, что в режиме работы со служебным меню прием сигналов пульта не работает (за исключением сканирования и сохранения кодов кнопок).

Итак, при приеме каждого переднего или заднего фронта импульса ИК (при этом я не конкретизирую именно импульс либо интервал для экономии ячеек памяти, хранящей коды) вызывается обработчик прерывания, приведенный ниже. Информацией для сохранения и идентификации сигнала является время импулса или интервала, измеряемое таймером 1.

В банке 2 памяти данных сохраняются как значения таймера 1, так и их порядковые номера. Значения таймера 1 выбираются и отделяются одно от другого с определенным коридором допуска +-6h, что необходимо ввиду небольших колебаний. После сканирования значения таймера 1 сохраняются в EEPROM.

При записи либо проверки на соответствие каждое принятое значение таймера 1 проверяется на равенство сохраненному (с определенным выше допуском), после чего номер совпавшего значения записывается в память данных.

Далее, если активен режим сохранения, то данные из памяти данных сохраняются в память программ, в диапазоне адресов 60h - AFh для левой кнопки, B0h - FFh для правой кнопки (старший байт адреса памяти программ - 18h). Если режимы сканирования и сохранения не активны, и активно главное меню, то происходит сравнение номеров значений таймера 1 из памяти данных и записанных в память программ. В случае совпадения значений устанавливается флаг нажатия одной из кнопок (правой или левой) с дальнейшей его обработкой.

Блок-схема алгоритма обработки прерываний ИК

Рис. 17

В обработчике прерываний данные накапливаются в памяти данных. После окончания приема кодовой посылки устанавливается соответствующий флаг. После этого при очередном вызове подпрограммы I_RED_CHECK в зависимости от установленного режима (определяется флагами)вызывается соответствующая часть кода.

Блок-схема алгоритма обработки сканирования ИК

Рис. 18

Режим сканирования пульта необходим для предварительного отсеивания рабочих значений таймера 1. Это сделано для более надежного фиксирования рабочих сигналов в условиях помех. В этом режиме в обработчике прерываний накапливаются данные следующего вида: значение таймера 1 (с учетом разброса параметров), и количество этих значений в посылке. При проверке сканированных значений сохраняются те из них, набравшие более определенного значения появлений в посылке. Таким образом, мы надежно фиксируем поступление сигнала от пульта ИК. Значения таймера 1 сохраняются в EEPROM.

Блок-схема алгоритма сохранения кодов ИК

Рис. 19

В режиме сохранения кодов для левой и правой кнопок (значения переменных и меток приведены в скобках) в прерывании значение таймера 1 поочередно сравнивается с выявленными при сканировании значениями. В случае совпадения номер совпавшего значения сохраняется в память данных. После заполнения определенным количеством байт выставляется флаг окончания приема. В подпрограмме сохранения все байты из памяти данных переносятся в память программ по соответствующим адресам.

Блок-схема алгоритма проверки принятых сигналов ИК

Рис. 20

В рабочем режиме при приеме сигнала ИК пульта в прерываниях, также, производится сравнение значений таймера 1 с сохраненными с учетом возможного разброса, и запись номеров значений в память данных и установка флага окончания приема. В подпрограмме проверки принятая последовательность номеров значений из памяти данных сравнивается с сохраненной в памяти программ. В случае совпадения кодов устанавливается флаг соответствующей кнопки и флаг изменения отображения меню. Благодаря последнему флагу нажатое состояние кнопки обрабатывается.

Блок-схема алгоритма чтения данных ИК при инициализации

Рис. 21

Значения таймера 1 во время работы модуля находятся в банке 2 памяти данных в диапазоне адресов 110h - 11Ah для более быстрого доступа. При запуске программы эти данные переносятся туда из EEPROM с помощью участка программы, блок-схема которого приведена на рис. 21.

Следует отметить, что для устойчивого приема сигналов с пульта необходимо запрещать все прерывания (в том числе, от приемника USART), чтобы последовательность ИК сигналов не разваливалась. Это создает некоторую задержку на отправку команды другим модулям в сети при управлении от пульта. Но эта задержка не так велика и составляет один - два цикла опроса в сети, и на работоспособность системы не влияет.

 

 

прошивка 1 прошивка 2 прошивка 3 прошивка 4 прошивка 5 прошивка 6 прошивка 7 прошивка 8 прошивка 9 прошивка 10 прошивка 11 прошивка 12 прошивка 13 прошивка 14 прошивка 15 прошивка 16 прошивка 17 прошивка 18 прошивка 19 прошивка 20 прошивка 21 прошивка 22 прошивка 23 прошивка 24 прошивка 25 прошивка 26 прошивка 27 прошивка 28 прошивка 29 прошивка 30 прошивка 31 прошивка 32 прошивка 33 прошивка 34 прошивка 35 прошивка 36 прошивка 37 прошивка 38 прошивка 39 прошивка 40 прошивка 41 прошивка 42 прошивка 43 прошивка 44 прошивка 45 прошивка 46 прошивка 47 прошивка 48 прошивка 49 прошивка 50 прошивка 51 прошивка 52 прошивка 53 прошивка 54 прошивка 55 прошивка 56 прошивка 57 прошивка 58 прошивка 59 прошивка 60 прошивка 61 прошивка 62 прошивка 63 прошивка 64 прошивка 65 прошивка 66 прошивка 67 прошивка 68 прошивка 69 прошивка 70 прошивка 71 прошивка 72 прошивка 73 прошивка 74 прошивка 75 прошивка 76 прошивка 77 прошивка 78 прошивка 79 прошивка 80 прошивка 81 прошивка 82 прошивка 83 прошивка 84 прошивка 85 прошивка 86 прошивка 87 прошивка 88 прошивка 89 прошивка 90 прошивка 91 прошивка 92 прошивка 93 прошивка 94 прошивка 95 прошивка 96 прошивка 97 прошивка 98 прошивка 99 прошивка 100 прошивка 101 прошивка 102 прошивка 103 прошивка 104 прошивка 105 прошивка 106 прошивка 107 прошивка 108 прошивка 109 прошивка 110 прошивка 111 прошивка 112 прошивка 113 прошивка 114 прошивка 115 прошивка 116

 

Наверх

Фото

Здесь приведены фотографии отображения меню в различных режимах.

Основной вид (отображение температуры на улице).

Фото1

Показан вид сбоку (видно расположение кнопки - П-образный разрез корпуса).

Фото2

Состояние вытяжки.

Фото3

Температура, измеренная собственным датчиком.

Фото4

Подменю отключения вытяжки.

Фото5

Подтверждение отключения вытяжки.

Фото6

Пункт выхода из подменю вытяжки.

Фото7

Фото снизу (видны вентиляционные отверстия и две пары проводов - питание и сеть).

Фото8

Начинка.

Фото9

Далее следуют фотографии служебного меню.

Пункт настройки яркости.

Фото10

Настройка ИК пульта.

Фото11

Настройка пищалки.

Фото12

Настройка измерения температуры.

Фото13

Выход из служебного меню.

Фото14

Подпункт инкремента яркости.

Фото15

Подпункт сканирование сигнала ИК пульта.

Фото16

Подпункт сброса данных о параметрах сигнала ИК пульта.

Фото17

Подпункт сохранения ИК сигнала для левой кнопки.

Фото18

Подпункт сохранения ИК сигнала для правой кнопки.

Фото19

Подпункт включения измерения температуры.

Фото20

Наверх

Наверх