MODULE_INFO¶
- group Сведения о модуле и постоянные параметры
Паспорт модуля, версия, базовые константы и постоянные параметры системы.
Defines
-
VER_H¶
Этот файл нужно инклюдить в main.c в USER CODE 0, после platform.h.
Номер версии старший.
-
VER_L¶
Номер версии младший.
-
FIGA¶
Guard-символ диагностических и служебных ответов.
Контроллер сенсоров для проекта ANAX.
GPIO (8 портов) - сбор данных по SDI-12 UART_SEN_… - сбор данных по Modbus (2 порта) UART_MIK_… - обмен через MikroE (2 порта) UART_LCD - запасной порт (на разъёме для LCD) Virtual COM port - диагностическая информация (для активации надо нажать любую клавишу, послав любой байт в устройство через этот порт) - пока в подвисшем состоянии
Формат вывода для всех сенсоров (и тензодатчиков тоже): «:теплица-квадрат таймстамп портадрID адрДАННЫЕcrlf» (похож на общепринятый Intel Hex)
used IER: 1 2 3 4 5 6 (7-USB,если_будет) 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 used IER1: 1 2 8 used «Error»: 01 Работа над текстом:
Проверить в кубике конфигурацию I2S - он должен быть выключен! Посмотреть в main.c PLLI2S_ENABLE, возможно, это ошибка кубика (там в инициализации systick это). +2. Проверить константу 72 в делителе частоты для таймера - не должна ли быть 71? и тогда перегенерить кубик. - перегенерил.
Сделать размер страницы flash тоже в platform.h, как и адрес. Страницы могут быть разной длины у разных кристаллов.
Проверить, поставить в нужные режимы и подтянуть (входы обязательно!) все sdi, ourI2C и прочие gpio (PC3, PC6, PC8, …). Проверить, что все sdi, включая dir, первоначально в in-pulldown. +5. Проверить CRC MODBUS. По стандарту должен быть сначала младший байт, потом старший. У нас наоборот, но всё работает. Почему?! - потому что bytes already swapped
Сделать к функциям комментарии, позволяющие автогенерить документацию (описания функций, граф связи между ними и т.д.). +7. Константы для print_time() переставить в platform.h, ибо оно платформозависимо. Константы-адреса чтения-записи EEPROM часов - тоже.
Доделать возврат DS1307, чтобы функция print_time() стала вариантной, но по вызову одинаковой. Продумать отказ от EEPROM часов для общности с PCA2129. +9. Константу 104 хорошо бы в define. - пожалуй, нет: она ж кубиком генерится.
И разобраться, почему ChatGPT 5.2 утверждает, что при значении в регистре таймера 103 период будет 105.25 мкс (или сколько там). - потому что кто-то поленился доку почитать) +10. Номер датчика давления воздуха (78) тоже хорошо бы в define.
Ещё доделывать:
Добавить в цикл опроса строки с текущим заполнением буфера накопления данных (в байтах) и флаг о том, стёрлись ли оттуда старые строки (сколько строк, сколько циклов) перед текущим запросом :GET (после предыдущего). Это можно перед информацией с датчиков, а можно после [end].
Сделать паузу после обнаружения шторма, чтобы он оканчивался автоматически. Например, после трёх подряд ошибочных команд - замолкаем на 5 секунд, поедая буфер, и чистим его.
Продумать ситуацию: дамп включили, поговорили одновременно с нескольких портов, их флаги взвелись, дамп выключили - выключается лишь флаг этого конкретного порта, остальные выключаются только после очередной команды (а до неё весь диалог сыпется). Надо выключать все флаги? а на запрос отвечать это не помешает?
Датчки sdi не отвечают на юзерские команды в режиме STOP. Забыто: надо говорить сначала on. Сделать: чтобы без on работало.
Отрефакторить sdi. Избавиться от разной пёстрой логики (одна функция в прямом протоколе, другая в инверсном).
Добавить выкашивание неработающих сенсоров, опрос и добавление новых в паузах.
Прикрутить microSD и FAT16/32, записывать лог в файл(-ы).
Хорошо бы всё же сделать, чтобы дамп не выходил куда попало, а направлялся в порт, где его попросили. Но, блин, геморройно это…
Разобраться, почему и как можно выводить (WritePin) через пин, включённый на приём (типа как в AVR - манипуляция подтяжкой?).
Разобраться, насколько дольше (если дольше) работает запись во флеш по 2 байта или по 1, а не по 4. Если окажется непринципиально - писать короткими порциями и убрать выравнивание default_time.
Сделать boot-loader.
Сделать двузначную индикацию IER.
Сделать (перенести сюда) индикацию байта по битам.
Вернуть функционал USB; сделать устойчивость к пропаданию порта во время работы.
Порт для связи со слейвом (CBS между собой) сделать тоже через define (как изначально планировалось). Это будет сложно, сейчас в interface_dialog очень плотная завязка на MIK_1.
Планы на следующую реализацию:
Сделать сигнал о пропадании питания с прерыванием, чтобы успеть закрыть файлы на SD и записать текущую информацию во flash. Это на случай работы без аккумулятора. Соответственно, добавить в схему правильно рассчитанный конденсатор.
Все системные сообщения начинаются с данного символа, чтобы внешние системы не воспринимали их как полезные команды и не порождали шторм ответов.
-
struct def_time¶
- #include <user_code_0.h>
Структура постоянных параметров системы и времени по умолчанию.
Экземпляр структуры используется как оперативная копия настроек, хранимых во Flash, и содержит период опроса, номер теплицы, номер квадрата и BCD-представление времени.
-
VER_H¶