Распределение адресного пространства, определение переменных, определение регистров

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

Начиная с адреса h0010, выделяем ячейки для хранения настроек сценариев. Пока что сделаем 16 сценариев. В этих ячейках могут храниться настройки яркости димеров для каждого канала, настройки разрешения - запрета на включение розеток при работе каждого сценария и так далее. Выделим под каждый сценарий по 20 байтов. Таким образом, займем в EEPROM адресное пространство h0010h014F.

Далее определимся что, поскольку система управляется с кнопочных панелей, то может возникнуть четыре типа событий – кратковременное нажатие кнопки; повторное нажатие кнопки; длительное (более 3 сек.) удержание кнопки; отпускание кнопки. Поскольку хочется сделать нечто универсальное, создадим четыре таблицы для каждого типа событий. В строках будем сохранять настройки для каждой кнопочной панели, а в столбцах номера выполняемых сценариев для каждой кнопки панели. Таким образом, получим четыре вот такие таблицы:

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

Кроме того, один и тот же сценарий можно включить или выключить с другой панели, с другой кнопки, предварительно запрограммировав её.

Под эти таблицы выделяем адресное пространство h0150h028F.

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

Устройства в сети могут быть самые различные, а значит, у длинна посылки при обмене то же будет различной. Для того, чтобы как то определять количество байтов ожидаемых от устройства, необходимо либо создавать во Flash таблицу соответствия (тип устройства – количество байтов посылки), либо выделить в EEPROM по одной ячейке на устройство для хранения количества байтов посылки. Я решил выбрать второй вариант. То есть для каждого устройства выделяем по 2 байта для хранения адреса устройства (именно адреса, а не типа устройства), и для хранения количества ожидаемых байтов посылки при обмене. Кроме того, поскольку однотипных устройств в сети может быть несколько, выделяем два байта счетчика устройств для каждого типа.

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

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

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

Распределение адресного пространства EEPROM.

Далее, поскольку наш контроллер работает с сетью, необходимо создать буфер для обмена данными с устройствами. Для упрощения программы и ускорения работы сделаем два буфера, один для отправки данных, второй для приема. Размер обоих буферов может быть небольшим, порядка 12 – 16 байтов на каждый. Кроме того, необходимо для каждого буфера выделить счетчик обрабатываемого байта – точку чтения, точку записи. Создаем эти буферы в области RAM.

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

Остальные переменные в области RAM будут описаны в соответствующих разделах. Описывать все сразу не буду, поскольку проект «живой», и изменяется довольно часто

Распределение адресов определено в файле vectors.inc.

Теперь, давайте определим основные переменные, с которыми будет работать программа. Прежде всего, это частота, на которой работает микроконтроллер – XTAL, и собственный адрес ведущего контроллера –AddrDevice, пусть он будет h01 (оставим на всякий случай возможность обработки широкоформатного запроса с адресом h00). Далее определим имена портов ввода-вывода. Бит 2 порта D управляет драйвером шины RS-485, а на порт А повесим светодиоды. Необходимо определить команды, которые поддерживают устройства в сети:

команда запроса данных от устройств – RD h3C (эквивалент символа «<» в коде ASCII);

команда записи данных на устройства – WD h3Е (эквивалент символа «>» в коде ASCII);

команда игнорирования изменения данных в устройстве – IGN hFF;

команда верного приема данных от ведущего контроллера – h21 (эквивалент символа «!» в коде ASCII);

команда приема некорректных данных, или данных с ошибкой от ведущего контроллера – h3F(эквивалент символа «?» в коде ASCII).

Пока этого достаточно.

Ну и напоследок, определим регистры общего назначения, с которыми будем работать.

Нам понадобятся два рабочих регистра – temp1 и temp2, регистр данных – data (он используется при чтении-записи данных в EEPROM), регистр вычисленной контрольной суммы – crc8. Для установки флагов состояния определим флаговый регистр – flag_reg. В нем сразу же определим флаг возникновения ошибки – ErrF и флаг альтернативного режима работы системы – AltF. При работе с сетью нам понадобится счетчик передаваемых/принимаемых байтов, определим это регистр как countbyte.

Определение переменных и имен регистров находится в файле в файле define.inc.