Простейший DCC декодер на Arduino

Вопросы и ответы связанные с цифровым управлением, аналоговой автоматикой и их элементами
Аватара пользователя
LABA
Сообщения: 1616
Зарегистрирован: Пт мар 20, 2009 9:25 pm
Откуда: Питер
Благодарил (а): 32 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение LABA »

Василий писал(а):Для меня пошел и купил - это открыл браузер и накликал чего надо :)
[Оффтопик]
Ну, если не горит, то тогда конечно, сам так поступаю. Братья с Востока помогают значительно экономить.:-)

Аватара пользователя
Engineer_Keen
Сообщения: 313
Зарегистрирован: Ср фев 24, 2010 11:15 am
Имя: Василий
Откуда: Москва
Поблагодарили: 5 раз

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Engineer_Keen »

Василий писал(а):Есть одна тонкость, по прерываняим обрабатывается только прием DCC пакетов. После приема они скидываются в маленький буфер. Парсинг этих пакетов нужно вызывать из основного цикла. Соответственно в основном цикле не должно быть блокирующих действий. Иначе пакеты не будут обрабатываться.
Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.
Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо :idea: ).

shalex
Сообщения: 286
Зарегистрирован: Сб июн 06, 2015 3:26 pm
Благодарил (а): 26 раз
Поблагодарили: 10 раз

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение shalex »

Engineer_Keen писал(а):
Василий писал(а):Есть одна тонкость, по прерываняим обрабатывается только прием DCC пакетов. После приема они скидываются в маленький буфер. Парсинг этих пакетов нужно вызывать из основного цикла. Соответственно в основном цикле не должно быть блокирующих действий. Иначе пакеты не будут обрабатываться.
Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.
Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо :idea: ).
Есть подозрения, что с SPI придется тоже мудрить для передачи на большое расстояние. Плюс там есть сигнал CE (chip enable), под который нужен отдельный провод для каждого подключенного устройства, если подключать несколько устройств на одну шину.
[Оффтопик]
Как вариант, для простейшего аудио использовать такой модуль. Правда он "одноголосый", т.е. в один момент времени воспроизводит только один файл. Зато есть надежда, что качество звука будет лучше, чем если формировать звук самой ардуиной ))))
Изображение

Аватара пользователя
Василий
Модератор
Сообщения: 9415
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 337 раз
Поблагодарили: 438 раз
Контактная информация:

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Василий »

Engineer_Keen писал(а): Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.
Не очень понял идею. Сейчас так.
Есть подпрограмма повешенная на прерывание по изменению состояния пина на который поступает DCC сигнал. В подпрограмме обрабатывается прием пакетов DCC. То есть определяется преамбула, получаются байты и полученный пакет проверяется на ошибки и на соответствие адреса (пока только короткого). Дальше пакет запихивается в буфер FILO на 10 пакетов.

А в основном цикле ардуины, эти пакеты выдергиваются из буфера и уже обрабатываются дальше. То есть выставляются те или иные состояния Fn, скорости или направления.

Сделано это так потому, что я во-первых побоялся появления неконсистентности данных, которая возможна если запихнуть всю обработку в прерывание, а во-вторых я не уверен, что эта обработка не будет тормозить прием битов DCC, т.е. что она будет успевать за цикл изменения сигнала DCC.
Engineer_Keen писал(а):
Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо :idea: ).
SPI естественно интереснее. Что касается звуков, то сейчас уже кручу одноголосую платку, типа той что показал shalex. Работает и умеет асинхронно выводить звуки. Что касается вывод звука прямо через ардуину, мне кажется что Про Мини может не хватить быстродействия, ведь многоголосый вывод это не только сам вывод, это еще и миксирование и нормализация звуков если брать по минимуму.

Но... Я только в начале пути :) Планов громадье, а времени, как и всегда очень мало.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

Аватара пользователя
Engineer_Keen
Сообщения: 313
Зарегистрирован: Ср фев 24, 2010 11:15 am
Имя: Василий
Откуда: Москва
Поблагодарили: 5 раз

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Engineer_Keen »

Василий писал(а):Сейчас так.
Есть подпрограмма повешенная на прерывание по изменению состояния пина на который поступает DCC сигнал. В подпрограмме обрабатывается прием пакетов DCC. То есть определяется преамбула, получаются байты и полученный пакет проверяется на ошибки и на соответствие адреса (пока только короткого). Дальше пакет запихивается в буфер FILO на 10 пакетов.
Частично так, но: в обработчике прерывания обрабатывается ТОЛЬКО один пакет в пределах от преамбулы до стоп-бита, т.е. измеряется длинна импульса и в буфере сохраняется соответствующий бит пакета, как только принимается признак последнего байта команды ("1" после очередного принятого байта) в статусном регистре взводится регистр принятия пакета.

В основном цикле этот бит проверяется постоянно, как и другие биты статуса. Как только он станет=1, происходит переход на обработчик пакета, там он сбрасывается и сразу проверяется контрольная сумма и адрес, а потом, если они в порядке идет дальнейший анализ команды и ее выполнение (скорость, Fn).
Конечно правильнее бы использовать буфер хотя бы на две команды (записывать в одну, пока анализируется другая) или сбрасывать бит статуса после окончания выполнения команды, а в обработчике прерывания запрещать изменение буфера при взведенном бите статуса чтобы гарантированно не ломать буфер во время анализа команды, НО: команда (пакет) всегда успевает выполнится за период принятия одного бита DCC, не говоря уже о время принятия преамбулы (размером с 10-15 периодов "1"), т.е. команда просто не успеет испортиться до ее выполнения. Ну и как известно в самом стандарте рекомендовано постоянно повторять пакеты. Просто прием одного бита - это 120мкс (для "1"), а за это время AVR на 8Мгц успеет выполнять аж 960 команд! Не думаю что даже такая штука как компилятор ардуино сможет "испортить" это преимущество в скорости.

Точно по этой же схеме работают и остальные части программы:
- таймер для работы звуковой подсистемы - в прерывании таймера только взведение бита признака того что нужно считать в буфер данные, в подпрограмме обработчика звуков чтение и вывод очередного байта данных;
- таймер изменения скорости, прерывание раз в 32мс, взведение бита признака что прошло 32мс, в подпрограмме обработчика 32мс уже анализ скорости и направления ее изменения;

Для работы со звуком скорости и ресурсов AVR должно хватить. У меня хватило, даже на 2 канала, даже на программном SPI. Единственное что я не смог нормально реализовать, это как раз микширование, у меня 2 канала тупо складывались, а надо складывать логарифмы с учетом относительной громкости.
Василий писал(а): Но... Я только в начале пути :) Планов громадье, а времени, как и всегда очень мало.
Вот вот, в это все всегда и упирается...

Аватара пользователя
Василий
Модератор
Сообщения: 9415
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 337 раз
Поблагодарили: 438 раз
Контактная информация:

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Василий »

Провел эксперимент. Среднее время обработки принятого пакета составляет сейчас ~24-25мкс. Так что вполне можно запихивать прямо в обработчик прерывания.

Попозже перепишу вызовы иначе. Сейчас обработчик это метод класса.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

Аватара пользователя
Василий
Модератор
Сообщения: 9415
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 337 раз
Поблагодарили: 438 раз
Контактная информация:

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Василий »

Я надеюсь все заинтересованные понимаю, что то что я тут выкладываю суть есть сырые версии? :):):)

Сейчас такой косяк нашел, что самому смешно :)
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

Федюнь
Сообщения: 1430
Зарегистрирован: Вс фев 19, 2012 7:18 am
Имя: Фарид
Откуда: Узбекистан Ташкент
Контактная информация:

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Федюнь »

Ну даже и серые.Все ждут окончательной версии, и ни кто не торопит.))))

Аватара пользователя
Engineer_Keen
Сообщения: 313
Зарегистрирован: Ср фев 24, 2010 11:15 am
Имя: Василий
Откуда: Москва
Поблагодарили: 5 раз

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Engineer_Keen »

Василий писал(а):Среднее время обработки принятого пакета составляет сейчас ~24-25мкс. Так что вполне можно запихивать прямо в обработчик прерывания.
Очень неплохой результат, но в прерывание я бы это все равно не пихал, длинновато, потом мешать будет, если еще фишки прикручивать (тот же звук или программная ШИМ двигателя).
А какая тактовая кстати?

Аватара пользователя
Василий
Модератор
Сообщения: 9415
Зарегистрирован: Чт мар 06, 2008 9:03 am
Имя: Василий Васильчиков
Откуда: Северо-западное Болото
Благодарил (а): 337 раз
Поблагодарили: 438 раз
Контактная информация:

Re: Простейший DCC декодер на Arduino

Непрочитанное сообщение Василий »

Engineer_Keen писал(а):Очень неплохой результат, но в прерывание я бы это все равно не пихал, длинновато, потом мешать будет, если еще фишки прикручивать (тот же звук или программная ШИМ двигателя).
А какая тактовая кстати?
8МГц. Ардуина вроде как самая тухлая.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!

Ответить

Вернуться в «Цифровое управление, Аналоговая автоматика и их элементы»