Re: Простейший DCC декодер на Arduino
Добавлено: Вт мар 08, 2016 11:50 am
Василий писал(а):Для меня пошел и купил - это открыл браузер и накликал чего надо
Все о моделях железных дорог!
https://scaletrainsclub.com/board/
https://scaletrainsclub.com/board/viewtopic.php?f=30&t=11949
Василий писал(а):Для меня пошел и купил - это открыл браузер и накликал чего надо
Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.Василий писал(а):Есть одна тонкость, по прерываняим обрабатывается только прием DCC пакетов. После приема они скидываются в маленький буфер. Парсинг этих пакетов нужно вызывать из основного цикла. Соответственно в основном цикле не должно быть блокирующих действий. Иначе пакеты не будут обрабатываться.
Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо ).Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Есть подозрения, что с SPI придется тоже мудрить для передачи на большое расстояние. Плюс там есть сигнал CE (chip enable), под который нужен отдельный провод для каждого подключенного устройства, если подключать несколько устройств на одну шину.Engineer_Keen писал(а):Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.Василий писал(а):Есть одна тонкость, по прерываняим обрабатывается только прием DCC пакетов. После приема они скидываются в маленький буфер. Парсинг этих пакетов нужно вызывать из основного цикла. Соответственно в основном цикле не должно быть блокирующих действий. Иначе пакеты не будут обрабатываться.Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо ).Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Не очень понял идею. Сейчас так.Engineer_Keen писал(а): Я бы все огранизовал по флагам. Получили пакет - взвели флаг, сработал таймер например раз в 32мс (удобно организовать такой для изменения скорости по стандарту DCC) - взвели другой, а в основном цикле ничего не делать, только проверять флаги. Так ничего не блокируется и пакеты не потеряются, по идее.
SPI естественно интереснее. Что касается звуков, то сейчас уже кручу одноголосую платку, типа той что показал shalex. Работает и умеет асинхронно выводить звуки. Что касается вывод звука прямо через ардуину, мне кажется что Про Мини может не хватить быстродействия, ведь многоголосый вывод это не только сам вывод, это еще и миксирование и нормализация звуков если брать по минимуму.Engineer_Keen писал(а):Только не I2C, а SPI, т.к. он быстрее и память больших объемов как раз по нему работает, можно если хватит вычислительной мощности даже SD карту использовать (это в идеале - скопировал на карту файл с CV.txt, звуковой схемой и самими звуками, вставил карту и ничего программировать не надо ).Федюнь писал(а):Планируется ли в дальнейшем реализовать звуковую схему? Например через I2C.
Частично так, но: в обработчике прерывания обрабатывается ТОЛЬКО один пакет в пределах от преамбулы до стоп-бита, т.е. измеряется длинна импульса и в буфере сохраняется соответствующий бит пакета, как только принимается признак последнего байта команды ("1" после очередного принятого байта) в статусном регистре взводится регистр принятия пакета.Василий писал(а):Сейчас так.
Есть подпрограмма повешенная на прерывание по изменению состояния пина на который поступает DCC сигнал. В подпрограмме обрабатывается прием пакетов DCC. То есть определяется преамбула, получаются байты и полученный пакет проверяется на ошибки и на соответствие адреса (пока только короткого). Дальше пакет запихивается в буфер FILO на 10 пакетов.
Вот вот, в это все всегда и упирается...Василий писал(а): Но... Я только в начале пути Планов громадье, а времени, как и всегда очень мало.
Очень неплохой результат, но в прерывание я бы это все равно не пихал, длинновато, потом мешать будет, если еще фишки прикручивать (тот же звук или программная ШИМ двигателя).Василий писал(а):Среднее время обработки принятого пакета составляет сейчас ~24-25мкс. Так что вполне можно запихивать прямо в обработчик прерывания.
8МГц. Ардуина вроде как самая тухлая.Engineer_Keen писал(а):Очень неплохой результат, но в прерывание я бы это все равно не пихал, длинновато, потом мешать будет, если еще фишки прикручивать (тот же звук или программная ШИМ двигателя).
А какая тактовая кстати?