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

habr.png

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

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

Максимальное количество аргументов в одной строке 5.
Регистр значения не имеет, парсинг команд происходит после преобразования строки в нижний регистр (исключение: значение аргумента в кавычках).
Все команды выполняются только после подачи команды Setup (исключение, команда Help, которая выводит список всех доступных команд).

Все команды описаны в приложенном архиве, так же в нем первая версия прошивки в формате hex.

shDRO.zip (.hex + описание команд)

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

Спасибо!

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

PS1. Просьба тем, кто живет в Казани.
Если у вас есть:
— цифровые штангенциркули, работающие по протоколам: 24BIT, BCD7;
— цифровые линейки iGaging (протокол 21BIT);
то не могли бы вы предоставить их мне на пару-тройку дней, чтобы написать и отладить протоколы под них?
Обещаю сохранить их в целости и сохранности!
Но это уже в личку.
Заранее спасибо.

© Habrahabr.ru