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

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

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

Схема ведущего модуля

Прошивка ведущего модуля

Схема ведомого модуля

Прошивка ведомого модуля

Фото

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

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

За основу взят довольно распространенный протокол RS-485. Преимущества его в необходимости всего двух проводов (витая пара) для передачи данных на расстояние более километра. Также, в пользу этого протокола будет наличие микросхем драйверов с нагрузочной способностью более 200 приемников (я использую MAX1483). Конечно, при этом сетевой интерфейс усложняется, ведь приходится организовывать передачу данных в полу-дуплексном режиме, т. е. в один и тот же момент времени передает только одно устройство, все остальные - принимают. Но за аппаратную простоту надо же чем-то платить.

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

Топология сети

Рис. 1

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

Для корректной работы сети необходима четкая организация в адресном пространстве. Это достигается присвоением каждому ведомому модулю своего адреса, на который он должен реагировать при опросе. Присвоение адресов осуществляет ведущий модуль (при выключенной управляющей программе на компьютере), начиная с 02h и далее в порядке возрастания. Адрес 01h необходимо устанавливать в модуле перед прошивкой для идентификации ведущим модулем еще не зарегистрированного участника сети.

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

Например, при зарегистрированных двух адресах и при отсутствии ответа опрашиваемых модулей (обрыв сети) ведущий выдает в сеть следующую комбинацию чисел: <01h>, <45h>, <45h>, <02h>, <41h>, <45h>, <45h>, <03h>, <41h>, <45h>, <45h>, <14h>, <5Ah>, <5Ah>, <5Ah>.

Здесь после выдачи числа <01h> модуль ожидает (в течении 4 мсек) ответа ведомого с незарегистрированным адресом 01h. По окончании ожидания в сеть отправляется два числа <45h>, <45h>, информирующие об окончании опроса данного модуля, затем адрес зарегистрированного модуля <02h> и команда запрос на передачу статуса <41h>, после чего ожидается ответ модуля (в течении 4 мсек) с данным адресом. Так как ответа не последовало, то передается два числа <45h>, <45h> (окончание запроса). Далее аналогично адрес <03h>, команда <41h>, ожидание ответа и окончание - <45h>, <45h>. После опроса всех зарегистрированных адресов выдается число <14h> - это интервал опроса, служит информацией для управляющей программы на компьютере. Передачей трех чисел <5Ah>, <5Ah>, <5Ah> управляющая программа (если запущена) информируется об окончании цикла опроса. Кстати, в этот момент ведущий модуль (рис. 1) переводит драйвер RS-485, подключенный через преобразователь RS-232 к компьютеру, на передачу, а собственный драйвер - на прием. В это время управляющая программа может отправить команду в сеть. Команда может предназначаться ведущему модулю (команда на изменение интервала опроса, команда синхронизации), либо любому ведомому модулю. Формат команд будет описан отдельно.

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

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

Если вновь происходит запуск управляющей программы, она фиксирует пять полных циклов опроса (с окончанием на <5Ah>, <5Ah>, <5Ah>) и только после этого начинает отправлять команды синхронизации. Получив первую команду синхронизации, ведущий модуль считает себя управляемым от компьютера и работает описанным выше порядком.

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

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

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

Контрольная сумма CRC по сути является контрольным байтом циклически избыточного кода, и вычисляется для всех байтов в ответе ведомого. Не мудрствуя лукаво, алгоритм подсчета я взял из даташита на ключи I-Button, особо не вдаваясь в математические подробности. Посчитал надежность фиксации ошибки приемлемой для данной сети.

Особо следует остановиться на моменте регистрации нового модуля в сети.

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

Выше обозначенная последовательность нужна для того, чтобы не возникало конфликтов, так как все вновь прошитые ведомые модули должны отвечать на один и тот же адрес - 01h.

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

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

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

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

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

А теперь остановимся на описании ведущего модуля и одного пассивного ведомого.

Наверх

Схема ведущего модуля

Рис. 2

Приведенное на рис. 2 устройство представляет собой ведущий модуль управления сетью и включает следующие функциональные узлы: контроллер PIC16F628A, драйвер сети RS-485 (микросхема MAX1483) для обмена с ведущим, драйвер сети RS-485 для обмена с компьютером, управляемый контроллером, а также преобразователь RS-232 (микросхема MAX232), подключаемый посредством кабеля к разъему com порта компьютера.

Питание схемы осуществляется через стабилизатор на КРЕН5А.

Сеть (витая пара) подключается к точкам A и B. При этом, как указано в даташите на MAX1483, ответвления от основной магистрали к отдельным модулям должны быть как можно короче, а в модулях, расположенных на концах магистрали, между проводами A и B должны включаться резисторы 120 Ом для гашения отражений от концов линии во избежание искажения импульсов данных.

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

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

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

Наверх

Прошивка ведущего модуля

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

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

Устройство выполнено на базе микроконтроллера PIC16F628A с внутренним тактовым генератором 4 МГц. Сторожевой таймер отключен.

Частота обмена приемопередатчика USART фиксирована (для упрощения работы, да объем передаваемых данных невелик) и составляет 9600 бод.

Основной цикл программы построен на таймере 1 с использованием прерывания.

Подпрограмма TIME_UP (обработчик переполнения таймера 1) выполняется примерно раз в 50 мсек. На этом построено вычисление интервала опроса. Значения, кратные 10 (10, 20, и т. д. до 100) используются как множитель для получения соответствующего интервала (0,5 сек, 1 сек, и т. д. до 5 сек). Именно эти значения используются при передаче информации об установленном интервале по сети (в вышеприведенном примере транзакции - значение 14h перед тремя числами 5Ah признака окончания опроса модулей в интервале).

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

При помощи счетчика TMR1_COUNT происходит подсчет количества срабатываний таймера (обработчик TIME_UP). Здесь же содержимое TMR1_COUNT сравнивается с установленным значением интервала, описанного выше (регистр INTERVAL), и при совпадении устанавливается флаг EQ_FLAG, 0, который служит в главном цикле (метка main в конце листинга) для определения момента вызова подпрограммы обмена данными в одном интервале - TRANSACT.

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

Также, в обработчике TIME_UP после каждой установки флага EQ_FLAG, 0 проверяется состояние флага FLAG_BUSY_USART, 0, который установлен на все время обмена между модулями в сети. То есть, если время обмена данными в сети по какой-то причине превышает интервал опроса, то происходит автоматическое увеличение интервала опроса на 0,5 сек (добавление 10 к значению в регистре INTERVAL).

Счетчик PC_COUNT используется для следующих целей. При каждом приеме какого-либо байта от компьютера (в подпрограмме TRANS_PC) он сбрасывается. В случае отсутствия команд от компьютера в течение времени, превышающем значение интервала опроса, счетчик инкрементируется, сбрасывая при этом флаг EQ_FLAG, 0. После пяти таких инкрементов флаг EQ_FLAG, 0 перестает сбрасываться. Таким образом, счетчик PC_COUNT служит показателем активности компьютера в сети, и после пяти интервалов опроса отсутствия его активности разрешает автономный опрос сети без команд синхронизации (с интервалом, устанавливаемым способом подсчета срабатываний таймера 1).

Перейдем к основной программе. Здесь, как уже было сказано, при установленном флаге EQ_FLAG, 0 вызывается подпрограмма TRANSACT обмена данными с модулями. Кроме того, вызывается (при каждом проходе) подпрограмма SAVE_TO_EEPROM, в которой при установлении соответствующего флага происходит сохранение значения регистра INTERVAL. В случае приема байта от компьютера вызывается подпрограмма его обработки TRANS_PC. Таким образом, время работы модуля в интервале опроса состоит из, собственно, самого опроса (процедура TRANSACT) и времени ожидания команд от компьютера (то, что осталось от интервала).

Остановимся на подпрограмме обмена TRANSACT. На все время обмена с модулями: драйвер компьютера переключается на прием (вывод PORTA, 3); устанавливается флаг FLAG_BUSY_USART, 0 (как описано выше, проверяется в прерывании по таймеру 1); зажигается светодиод контроля обмена HL2.

В цикле CYCLE2 происходит вызов подпрограммы связи с одним модулем TRANS_MOD. Адреса для связи задаются в регистре MOD_ADR, начиная с 01h и заканчивая LAST_ADR (адрес последнего зарегистрированного модуля), предварительно считанным из EEPROM по адресу 01h.

После опроса всех модулей в подпрограмме TRANSACT проверяется флаг FL_SEND_EE, 0 (флаг отправки содержимого EEPROM - устанавливается при получении соответствующей команды от ПК). При его сброшенном состоянии переходим к метке STEP1, где осуществляется отправка значения регистра INTERVAL, затем трех байтов 5Ah (признак окончания обмена в цикле).

В случае установленного флага FL_SEND_EE, 0 в цикле CYCLE_EE_1 производится отправка в сеть байтов EEPROM (128 байтов). Признаком начала отправки содержимого EEPROM является передача двух байтов B0h, признаком окончания - двух байтов C0h. Счетчиком количества циклов является регистр EE_ADR_TO_SEND.

В подпрограмме связи с одним модулем TRANS_MOD для передачи и приема слова используются соответственно подпрограммы TRANSMIT_WORD и RECEIVE_WORD. При этом контроль окончания передачи байта определяется флагом TXSTA, TRMT в процедуре TRANSMIT_WORD. В подпрограмме RECEIVE_WORD на таймере 0 организовано ожидание приема байта в течение 4 мсек путем контроля флага PIR1, RCIF. Если в течение 4 мсек приема байта не произошло, то устанавливается флаг ошибки TR_ERR_FLAG, 1, который используется для принятия решения, можно ли читать данные из буфера приема. Такая конструкция позволяет избежать зацикливания программы при отсутствии приема байта.

Итак, в подпрограмме TRANS_MOD сначала отправляется адрес текущего модуля (регистр MOD_ADR), после чего проверяется, не равен ли адрес 01h. Если равен, то проигрывается программный код с ожиданием ответа незарегистрированного модуля. В случае ответа такого модуля посылается команда на регистрацию нового адреса (53h) и новый адрес (инкрементированный LAST_ADR). При получении нового адреса от ведомого в качестве подтверждения регистрации новый LAST_ADR сохраняется в EEPROM, после чего передаются два байта 45h признака окончания транзакции с одним модулем. При неполучении ответа ведомого с новым адресом LAST_ADR не сохраняется.

Если адрес MOD_ADR отличен от 01h, то происходит стандартный обмен (метка CONTIN_TRANS). Передается запрос на передачу статуса 41h, после чего ожидается ответ.

В случае ответа модуля с данным адресом первый принятый байт проверяется на равенство 57h (признак запроса активного ведомого на передачу команды). Если равенства нет, то происходит прием всех остальных байтов ответа ведомого до первого превышения времени ожидания (флаг TR_ERR_FLAG, 1), после чего цикл прерывается и подпрограмма TRANS_MOD заканчивается с передачей 45h, 45h.

В случае же последовательного приема двух байтов 57h передается команда 49h (после передачи 45h, 45h и адреса) на отправку команды активным ведомым. После этого ведущий самоустаняется в цикле WAIT_END_OF_COMMAND до окончания передачи всех байтов команды, а затем по превышению времени ожидания байта выходит в конец подпрограммы. Таким образом, обмен командами между ведомыми модулями в основном цикле опроса организован без прерывания основного потока опроса, и после передачи команды ведущий производит опрос следующих модулей по порядку следования адресов.

Перейдем к подпрограмме TRANS_PC. Напомню, что она начинает выполняться в случае приема первого байта от компьютера в период, свободный от опроса ведомых сети.

Команда от компьютера состоит из двух байтов идентификации 24h и байтов самой команды. Команда может иметь следующий формат: <24h>, <24h>, <AAh> - команда синхронизации; <24h>, <24h>, <01h>, <значение интервала> - команда на установку интервала опроса; <24h>, <24h>, <7Dh> - команда на передачу содержимого EEPROM; <24h>, <24h>, <42h> - команда на сброс данных о регистрации адресов ведомых модулей (по адресу 01h в EEPROM записывается 01h). Кроме вышеперечисленных команд для ведущего модуля компьютер может отправлять команды ведомым модулям, которые в общем случае выглядят так: <45h>, <45h>, <адрес модуля>, <команда модулю>, <вспомогательная команда модулю (если есть)>.

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

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

Если последовательность байтов верная, то после приема последнего байта команды выполняются следующие действия. Команда синхронизации - устанавливается флаг транзакции FL_TR_FROM_PC, 0 для последующей инициализации обмена данными (установка флага EQ_FLAG в обработчике прерывания от таймера 1 и вызов процедуры TRANSACT из головной программы). Команда на установку интервала опроса - проверка в цикле INT_CH_CYCLE полученного значения нового интервала на равенство значению из ряда: 10, 20, ..., 100; и в случае совпадения сохранение в EEPROM (метка SAVE_INT). Команда на передачу содержимого EEPROM - установка флага FL_SEND_EE, 0 для передачи байтов из памяти во время следующей транзакции (порядок рассмотрен выше). Команда на сброс данных о регистрации адресов ведомых - заносим по адресу 01h в EEPROM число 01h, таким образом, в последующих циклах опроса зарегистрированных ранее модулей не будет, а возможна только регистрация новых. Эта возможность предусмотрена для ручного переназначения адресов ведомых модулей посредством управляющей программы, когда, например, модули в сети регистрировались хаотично, а нужно упорядочить их по типам или по физическому расположению.

 

прошивка 1 прошивка 2 прошивка 3 прошивка 4 прошивка 5 прошивка 6 прошивка 7 прошивка 8 прошивка 9 прошивка 10 прошивка 11 прошивка 12 прошивка 13 прошивка 14 прошивка 15

 

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

Наверх

Схема ведомого модуля

Модуль температуры - нагрузки

Рис. 2

Представленное на рис. 2 устройство - модуль измерения температуры, а также управления одной нагрузкой напряжением 220 В с сетевым интерфейсом ведомого по протоколу RS-485.

Собран на базе контроллера PIC16F628A с использованием внешнего кварцевого резонатора 20 МГц.

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

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

Микросхема MAX1483 - драйвер сети.

Измерение температуры осуществляется датчиком DS1821. Я расположил его на улице, подключив длинным проводом "витая пара".

Нагрузка 220 В управляется обычной связкой: оптопара MOC3041 - симистор BT138 по принципу "включено-выключено".

Последовательно включенный в схему управления светодиод HL индицирует включенное состояние.

Включение и отключение нагрузки производится при помощи кнопки SB.

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

Монтажная плата в формате Sprint-Layout 5.0 расположена здесь.

Наверх

Прошивка ведомого модуля

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

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

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

Скорость приемопередатчика USART 9600 бит/сек.

Работа USART организована с использованием прерываний. Прерывание по приему байта обрабатывается при установленном флаге PIR1, RCIF. Для организации передачи по полудуплексной схеме ориентарование на флаг PIR1, TXIF не подходит, так как он выставляется сразу после загрузки данных в регистр TSR, а переключение с передачи на прием нужно осуществить только после отправки байта из TSR. Флаг TXSTA, TRMT, также не подходит для этих целей, так как при этом не генерируется прерывание.

Выход простой - во время передачи использовать прерывания по таймеру 2 с проверкой в обработчике флага TXSTA, TRMT. Если он установился, переключаться на прием (либо запускать передачу следующего байта).

Вернемся к основной программе. Она крутится в цикле CYCLE. Периодически при переполнении таймера 1 с предделителем 1:8 происходит вызов подпрограммы TIME_UP (период около 100 мсек)

В подпрограмме TIME_UP сбрасывается WDT, инкрементируется счетчик срабатываний таймера 1 TMR1_COUNT, а также, вызываются две подпрограммы: BUTTON_CHECK и SAVE_TO_EEPROM.

Подпрограмма BUTTON_CHECK осуществляет обработку нажатия кнопки SB. Счетчики OFF_BUT_COUNT и ON_BUT_COUNT использованы для защиты от дребезга контактов. Правда, у вызова BUTTON_CHECK слишком большой период (100 мсек), поэтому пришлось ограничиться двумя инкрементами этих счетчиков, иначе возникало неудобство из-за необходимости долгого нажатия кнопки для его фиксации.

После фиксации нажатия и отпускания кнопки происходит смена содержимого регистра OUT1 (31h - включено, 30h - выключено), а также установка флага записи его в EEPROM.

В подпрограмму SAVE_TO_EEPROM вынесено сохранение регистров MOD_ADR (по адресу 00h) и OUT1 (по адресу 01h) в случае установки соответствующего флага. Также, из этой подпрограммы (при сохранении нового значения OUT1) вызывается процедура MODIFY_OUT1 для изменения состояния вывода порта, управляющего нагрузкой.

В основной программе с использованием счетчика срабатываний таймера 1 TMR1_COUNT осуществляется отсчет времени между обменом данными с термодатчиком. Подпрограмма обмена TRANSACT вызывается каждые 25 секунд.

В этой процедуре последовательно вызываются две подпрограммы: чтения температуры - TEMP_READ, затем запуска преобразования температуры - CONV. На время обмена с датчиком прерывания запрещаются, чтобы не нарушать временных интервалов записи-чтения. В связи с этим возможно отсутствие ответа модуля по сети, если в это время произошел опрос ведущим. Однака, это событие наступает редко (не чаще 1 раза в 25 секунд) и им можно пренебречь.

Считанная температура сохраняется в регистре TEMP, а знак температуры - в регистре SUB_Z_FLAG (температура неотрицательная - в регистре FFh, температура отрицательная - в регистре 01h).

Как было сказано выше, обмен данными по USART организован с помощью прерываний. При приеме каждого байта выполняется обработчик RECEIV. При каждом преравании по таймену 2 (а он включается только на время отправки байта) выполняется обработчик TMR2_INT, в котором проверяется состояние флага TXSTA, TRMT. После его установки происходит еще одно срабатывание таймера, после чего байт считается переданным.

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

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

Теперь приведу описание формата обмена данными с описываемым модулем.

В общем случае команда, на которую откликается модуль, выглядит так: <45h>, <45h>, <адрес>, <команда>. При этом имеется в виду, что модуль уже зарегистрирован в сети. То есть, процедура, описанная выше, с ответом на адрес 01h, получением команды на установку нового адреса и отправкой нового адреса, успешно выполнена.

Команды для данного модуля могут иметь следующие значения: 41h - запрос на передачу статуса (команда передается при каждой транзакции с ведущим модулем); 53h - включить нагрузку (силовой выход); 52h - отключить нагрузку; 46h - запрос на передачу содержимого EEPROM при следующей команде 41h.

Как только получена команда на передачу статуса, модуль переходит на передачу и отправляет подряд 7 байтов (при этом ведущий ждет окончания отправки серии, независимо от того, сколько байтов в нее входит). Формат передачи статуса в общем случае следующий: <06h>, <54h>, <температура>, <знак температуры>, <состояние нагрузки>, <байт ошибок>, <CRC>.

Здесь 06h - общее количество байтов в последующей посылке. 54h - идентификатор типа модуля. Температура - значение температуры, измеренной датчиком. Знак температуры - принимает значения: 01h - температура отрицательная, FFh - температура неотрицательная, EEh - ошибка датчика температуры. Состояние нагрузки - имеет два состояния: 30h - нагрузка выключена, 31h - нагрузка включена. Байт ошибок содержит флаги (в случае ошибки флаг установлен): бит 0 - ошибка связи с датчиком температуры, бит 1 - ошибка записи в EEPROM. Байт CRC подсчитывается со всеми байтами в посылке, начиная с типа модуля.

Запрос на передачу EEPROM используется во вспомогательных целях. При приеме команды 46h устанавливается флаг FL_SEND_EE, 0. В следующем цикле опроса при приеме команды передачи статуса (41h) модуль отправляет содержимое ячеек EEPROM. Формат отправки следующий: <81h>, <содержимое ячейки с адресом 7Fh>, <содержимое ячейки с адресом 7Eh>, <содержимое ячейки с адресом 7Dh>, ... <содержимое ячейки с адресом 0h>, <байт ошибок>, <CRC>. Здесь 81h (129)- количество байтов с адреса 0h по 7Fh, плюс байт ошибок.

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

 

прошивка 1 прошивка 2 прошивка 3 прошивка 4 прошивка 5 прошивка 6 прошивка 7 прошивка 8 прошивка 9 прошивка 10 прошивка 11 прошивка 12 прошивка 13 прошивка 14 прошивка 15 прошивка 16 прошивка 17 прошивка 18 прошивка 19 прошивка 20 прошивка 21

 

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

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

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

Наверх

Фото

Фото 1

 

Фото 2

Выше приведены фотографии ведущего модуля в корпусе и без него.

Ниже расположены фотографии ведомого модуля измерения температуры (также, в корпусе и без).

Фото 3

Фото 4

Наверх

Наверх