Простейший DCC декодер на Arduino
- LABA
- Сообщения: 1616
- Зарегистрирован: Пт мар 20, 2009 9:25 pm
- Откуда: Питер
- Благодарил (а): 32 раза
- Поблагодарили: 7 раз
- Контактная информация:
Re: Простейший DCC декодер на Arduino
Василий писал(а):Для меня пошел и купил - это открыл браузер и накликал чего надо
- Engineer_Keen
- Сообщения: 313
- Зарегистрирован: Ср фев 24, 2010 11:15 am
- Имя: Василий
- Откуда: Москва
- Поблагодарили: 5 раз
Re: Простейший DCC декодер на Arduino
Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.Василий писал(а):Есть одна тонкость, по прерываняим обрабатывается только прием DCC пакетов. После приема они скидываются в маленький буфер. Парсинг этих пакетов нужно вызывать из основного цикла. Соответственно в основном цикле не должно быть блокирующих действий. Иначе пакеты не будут обрабатываться.
Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо ).Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Простейший DCC декодер на Arduino
Есть подозрения, что с SPI придется тоже мудрить для передачи на большое расстояние. Плюс там есть сигнал CE (chip enable), под который нужен отдельный провод для каждого подключенного устройства, если подключать несколько устройств на одну шину.Engineer_Keen писал(а):Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.Василий писал(а):Есть одна тонкость, по прерываняим обрабатывается только прием DCC пакетов. После приема они скидываются в маленький буфер. Парсинг этих пакетов нужно вызывать из основного цикла. Соответственно в основном цикле не должно быть блокирующих действий. Иначе пакеты не будут обрабатываться.Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо ).Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
- Василий
- Модератор
- Сообщения: 9436
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 342 раза
- Поблагодарили: 455 раз
- Контактная информация:
Re: Простейший DCC декодер на Arduino
Не очень понял идею. Сейчас так.Engineer_Keen писал(а): Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.
Есть подпрограмма повешенная на прерывание по изменению состояния пина на который поступает DCC сигнал. В подпрограмме обрабатывается прием пакетов DCC. То есть определяется преамбула, получаются байты и полученный пакет проверяется на ошибки и на соответствие адреса (пока только короткого). Дальше пакет запихивается в буфер FILO на 10 пакетов.
А в основном цикле ардуины, эти пакеты выдергиваются из буфера и уже обрабатываются дальше. То есть выставляются те или иные состояния Fn, скорости или направления.
Сделано это так потому, что я во-первых побоялся появления неконсистентности данных, которая возможна если запихнуть всю обработку в прерывание, а во-вторых я не уверен, что эта обработка не будет тормозить прием битов DCC, т.е. что она будет успевать за цикл изменения сигнала DCC.
SPI естественно интереснее. Что касается звуков, то сейчас уже кручу одноголосую платку, типа той что показал shalex. Работает и умеет асинхронно выводить звуки. Что касается вывод звука прямо через ардуину, мне кажется что Про Мини может не хватить быстродействия, ведь многоголосый вывод это не только сам вывод, это еще и миксирование и нормализация звуков если брать по минимуму.Engineer_Keen писал(а):Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо ).Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Но... Я только в начале пути Планов громадье, а времени, как и всегда очень мало.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
- Engineer_Keen
- Сообщения: 313
- Зарегистрирован: Ср фев 24, 2010 11:15 am
- Имя: Василий
- Откуда: Москва
- Поблагодарили: 5 раз
Re: Простейший DCC декодер на Arduino
Частично так, но: в обработчике прерывания обрабатывается ТОЛЬКО один пакет в пределах от преамбулы до стоп-бита, т.е. измеряется длинна импульса и в буфере сохраняется соответствующий бит пакета, как только принимается признак последнего байта команды ("1" после очередного принятого байта) в статусном регистре взводится регистр принятия пакета.Василий писал(а):Сейчас так.
Есть подпрограмма повешенная на прерывание по изменению состояния пина на который поступает DCC сигнал. В подпрограмме обрабатывается прием пакетов DCC. То есть определяется преамбула, получаются байты и полученный пакет проверяется на ошибки и на соответствие адреса (пока только короткого). Дальше пакет запихивается в буфер FILO на 10 пакетов.
В основном цикле этот бит проверяется постоянно, как и другие биты статуса. Как только он станет=1, происходит переход на обработчик пакета, там он сбрасывается и сразу проверяется контрольная сумма и адрес, а потом, если они в порядке идет дальнейший анализ команды и ее выполнение (скорость, Fn).
Конечно правильнее бы использовать буфер хотя бы на две команды (записывать в одну, пока анализируется другая) или сбрасывать бит статуса после окончания выполнения команды, а в обработчике прерывания запрещать изменение буфера при взведенном бите статуса чтобы гарантированно не ломать буфер во время анализа команды, НО: команда (пакет) всегда успевает выполнится за период принятия одного бита DCC, не говоря уже о время принятия преамбулы (размером с 10-15 периодов "1"), т.е. команда просто не успеет испортиться до ее выполнения. Ну и как известно в самом стандарте рекомендовано постоянно повторять пакеты. Просто прием одного бита - это 120мкс (для "1"), а за это время AVR на 8Мгц успеет выполнять аж 960 команд! Не думаю что даже такая штука как компилятор ардуино сможет "испортить" это преимущество в скорости.
Точно по этой же схеме работают и остальные части программы:
- таймер для работы звуковой подсистемы - в прерывании таймера только взведение бита признака того что нужно считать в буфер данные, в подпрограмме обработчика звуков чтение и вывод очередного байта данных;
- таймер изменения скорости, прерывание раз в 32мс, взведение бита признака что прошло 32мс, в подпрограмме обработчика 32мс уже анализ скорости и направления ее изменения;
Для работы со звуком скорости и ресурсов AVR должно хватить. У меня хватило, даже на 2 канала, даже на программном SPI. Единственное что я не смог нормально реализовать, это как раз микширование, у меня 2 канала тупо складывались, а надо складывать логарифмы с учетом относительной громкости.
Вот вот, в это все всегда и упирается...Василий писал(а): Но... Я только в начале пути Планов громадье, а времени, как и всегда очень мало.
- Василий
- Модератор
- Сообщения: 9436
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 342 раза
- Поблагодарили: 455 раз
- Контактная информация:
Re: Простейший DCC декодер на Arduino
Провел эксперимент. Среднее время обработки принятого пакета составляет сейчас ~24-25мкс. Так что вполне можно запихивать прямо в обработчик прерывания.
Попозже перепишу вызовы иначе. Сейчас обработчик это метод класса.
Попозже перепишу вызовы иначе. Сейчас обработчик это метод класса.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
- Василий
- Модератор
- Сообщения: 9436
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 342 раза
- Поблагодарили: 455 раз
- Контактная информация:
Re: Простейший DCC декодер на Arduino
Я надеюсь все заинтересованные понимаю, что то что я тут выкладываю суть есть сырые версии? :):)
Сейчас такой косяк нашел, что самому смешно
Сейчас такой косяк нашел, что самому смешно
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
-
- Сообщения: 1430
- Зарегистрирован: Вс фев 19, 2012 7:18 am
- Имя: Фарид
- Откуда: Узбекистан Ташкент
- Поблагодарили: 1 раз
- Контактная информация:
Re: Простейший DCC декодер на Arduino
Ну даже и серые.Все ждут окончательной версии, и ни кто не торопит.))))
- Engineer_Keen
- Сообщения: 313
- Зарегистрирован: Ср фев 24, 2010 11:15 am
- Имя: Василий
- Откуда: Москва
- Поблагодарили: 5 раз
Re: Простейший DCC декодер на Arduino
Очень неплохой результат, но в прерывание я бы это все равно не пихал, длинновато, потом мешать будет, если еще фишки прикручивать (тот же звук или программная ШИМ двигателя).Василий писал(а):Среднее время обработки принятого пакета составляет сейчас ~24-25мкс. Так что вполне можно запихивать прямо в обработчик прерывания.
А какая тактовая кстати?
- Василий
- Модератор
- Сообщения: 9436
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 342 раза
- Поблагодарили: 455 раз
- Контактная информация:
Re: Простейший DCC декодер на Arduino
8МГц. Ардуина вроде как самая тухлая.Engineer_Keen писал(а):Очень неплохой результат, но в прерывание я бы это все равно не пихал, длинновато, потом мешать будет, если еще фишки прикручивать (тот же звук или программная ШИМ двигателя).
А какая тактовая кстати?
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!