Универсальное DRO на базе Arduino Nano — shDRO. Часть 2 +13


И снова здравствуйте!

Продолжаю описывать свою разработку 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 + описание команд)

Продолжение следует.

Спасибо!

P.S.: Команды, связанные с конфигурированием устройств и каналов, можно подавать на «голую» ардуинку без обвязки.

P.S.1. Просьба тем, кто живет в Казани.

Если у вас есть:

  • цифровые штангенциркули, работающие по протоколам: 24BIT, BCD7;
  • цифровые линейки iGaging (протокол 21BIT);

то не могли бы вы предоставить их мне на пару-тройку дней, чтобы написать и отладить протоколы под них?

Обещаю сохранить их в целости и сохранности!

Но это уже в личку. Заранее спасибо.




К сожалению, не доступен сервер mySQL