Универсальное DRO на базе Arduino Nano — shDRO. Часть 2
И снова здравствуйте!
Продолжаю описывать свою разработку shDRO.
В данной части я опишу алгоритм опроса устройств и формат команд консоли.
Первая часть.
Прошивка.
Так как количество каналов/портов, к которым можно подключать устройства считывания 12, и каждый канал теоретически может быть настроен на прерывание, то используются два обработчика прерывания типа PCINT (для портов D и C). Из этого следует одно ограничение по подключению: все выводы устройства, которые настроены на вход, должны быть подключены к каналам одной группы. Если же канал настроен на выход, то для текущего устройства, неважно, к какой группе он принадлежит. Группы: группа1 (каналы 0–5), группа2 (каналы 6–11).
Для обработчиков прерываний задействованы два кольцевых буфера, по 256 байт.
Код обработчика прерывания такой:
buf[pos] = DATA_N;
pos++;
Где DATA_N это один из портов: PIND, PINC.
Обработка данных происходит следующим образом:
- наступает прерывание, в буфер записывается новое значение порта;
- периодически буфер опрашивается, и из него читаются те данные, которые появились после последнего опроса (позиция буфера последнего опроса сохраняется в структуре устройства);
- в процессе чтения новых данных, сравниваются уровни прерывания, заданные для каналов, с текущими данными порта. Если уровень прерывания не совпадает, то данные игнорируются.
- происходит проверка, что приняты все данные для обработки (например, для протокола BIN6 нужно принять 24 бита);
- происходит обработка данных в «читабельный» вид и обработанные данные выводятся на экран;
- затем процесс повторяется;
Для реализации вышеописанной логики работы, в прошивке реализованы следующие логические модули:
- Device: модуль содержит всю информацию об одном подключенном устройстве. Для каждого подключенного устройства, создается такой модуль;
- Protocol: модуль содержит информацию о протоколе и как обрабатывать поступающие на порты сигналы в соответствии с данным протоколом обмена;
- Function: модуль содержит информацию о том, как преобразовывать данные, полученные от модуля Protocol. Например, есть модуль Protocol, который поддерживает квадратурный сигнал, но устройства, которые выдают квадратурный сигнал, могут быть разными: это может быть оптическая линейка, или датчик количества оборотов. Т.е. в одном случае данные нужно преобразовать в мм или дюймы, а в другом об/мин. Данный модуль как раз выполняет это;
- Led: модуль который отображает информацию на индикаторах. shDRO содержит 4 индикатора, и для каждого устройства задается нужный индикатор отображения;
В итоге, чтобы подключить устройство, в консоли нужно:
- сконфигурировать нужные каналы;
- добавить device;
- для device задать protocol, function и led;
- добавить/привязать нужные каналы к device;
Консоль.
На данный момент, я проверял работу консоли в мониторе порта ArduinoIDE и в Terminal v. 1.9b. Для терминалов типа Putty нужно реализовать режим эха (не реализовано).
Формат команды:
<команда> аргумент1> <значение_аргумента1> аргументN> <значение_аргументаN>
Максимальное количество аргументов в одной строке 5.
Регистр значения не имеет, парсинг команд происходит после преобразования строки в нижний регистр (исключение: значение аргумента в кавычках).
Все команды выполняются только после подачи команды Setup (исключение, команда Help, которая выводит список всех доступных команд).
Все команды описаны в приложенном архиве, так же в нем первая версия прошивки в формате hex.
shDRO.zip (.hex + описание команд)
Продолжение следует.
Спасибо!
PS. Команды, связанные с конфигурированием устройств и каналов, можно подавать на «голую» ардуинку без обвязки.
PS1. Просьба тем, кто живет в Казани.
Если у вас есть:
— цифровые штангенциркули, работающие по протоколам: 24BIT, BCD7;
— цифровые линейки iGaging (протокол 21BIT);
то не могли бы вы предоставить их мне на пару-тройку дней, чтобы написать и отладить протоколы под них?
Обещаю сохранить их в целости и сохранности!
Но это уже в личку.
Заранее спасибо.