Решил немного пояснить алгоритм.
Первый чип загружен библиотекой ДСС, следит за командами. Если приходит из заданного диапазона (0:0 ... 31:3), преобразует к виду 5 старших бит адрес, 3 младших данные (порт и команда), и пропихивает в последовательный порт. Если получено несколько одинаковых команд подряд, обрабатывается только первая.
Второй чип постоянно проверяет буфер, если обнаружена команда - проверяет, не выполняет ли он её уже, и ставит в очередь. Каждые 20 мс запускается обработчик, перебирающий все 128 портов, и если обнаруживается новая или недовыполненная команда, высчитывает и отправляет на нужный драйвер очередной шаг.
Если при включении питания дисплей не был подключен, то медленные операции вывода на ЛСД отключены и в режим настройки зайти нельзя. Если был подключен, то на экран выдаётся последняя принятая в работу команда, для отлавливания багов удобно. В любой момент можно перейти в режим настройки, изменить все доступные параметры для любого порта или нескольких подряд и сохранить в еепром, работа при этом прекращается. Программирование CVs не предусмотрено в принципе, т.к. с пульта оказалось гораздо удобнее.
Пока реализован алгоритм плавного переключения стрелок, он же (с небольшой доработкой) подойдёт для плавного зажигания/гашения огней. В дальнейшем планирую добавить имитацию различных световых эффектов, как-то сварка и т.п. Также подумываю о программировании переключения многоламповых светофоров одной командой, а не каждым светом по отдельности. Если не будет хватать ресурсов или быстродействия - разделю задачу на два узко заточенных чипа.
Мой макет имеет размер 1.22х2.44, поэтому подход централизованной обработки команд и раздачи по шине на места считаю более целесообразным, чем на одну шину ДСС вешать десятки декодеров и апгрейдить их все в случае необходимости. Да и по количеству проводов разницы большой нет - и так, и так их немерено