Воспроизведение бинарного файла
- Войдите на сайт для отправки комментариев
Привет, народ!
Христос воскрес!
Как-то была нужда отправить на цифровой выход пачку импульсов в микросекундном диапазоне (единицы, десятки микросекунд). Пачка небольшая, собрал в коде с использованием прямого доступа к портам. Всё получилось, немного здесь помогли.
Теперь нужно отправить на цифровой вывод пачку импульсов значительно длиннее.
Есть бинарник с записанными последовательностями, его можно на SD записать. В бинарнике всё просто, лог. 1 - это допустим 03 (или 01), а лог. 0 - это 02 (или 00). Может есть какие-то библиотеки, с которыми можно этот файл воспроизвести на цифровом выводе ардуино?
Пробовал погуглить по этой теме, не мог сообразить как правильно обозвать то, что мне нужно.
Бинарник такого вида. Данные снимались анализатором на 12 МГц, на каждый байт (или бит) время примерно 83.3ns.
Самый короткий импульс получается где-то 2666ns, это 32 выборки по 83.3ns. Нет возможности снять данные с частотой дискретизации в 16 МГц, возможно тогда было бы проще для ардуино. Может я ошибаюсь. Подскажите как можно это организовать или где поискать.
Не понятно. Вот эти 03 - эти длительность, которую нужно множить на 83,3 нс? И это хочется воспроизвести?
03 это логическая единица в данном случае, а 02 - это логический ноль.
Это не длительность. Я выше отметил, что каждый байт (03 или 02) именно в этом файле
это одна выборка логического анализатора длительностью 83.3ns. 32 выборки - это примерно 2666ns.
Это самый короткий импульс, который там есть.
То, что выше это примерно вся пачка. Ниже это развернутая часть одного участка.
Левый импульс на нижнем скрине это минимальный, равный примерно 2666ns.
В первом посте скрин с редактора, в котором представлена часть файла.
Лог. 1 - это 03, лог. 0 - 02. Сверху вниз байтов 02 есть 32. Это нулевой импульс (или пауза)
длительностью 2666ns. Вся пачка (верхний скрин 4 поста) занимает примерно 112ms.
Вот его нужно воспроизвести. Как бы проиграть с SD.
Для начала перевести все 03 и 02 в бит по нужному пину и 0.
А потом определится с длительностью. 83нс на ардуине 16мгц не воспроизвести никак, ибо сигнал должен быть кратен 62нс. И ничего близкого к 62нс тоже не вывести, хорошо если раз в 10 медленнее выйдет. Хотите длину лог единицы 83нс - берите стм32
А можно так сделать? Считать количество битов, умножать на 83.3, а потом делить на 62.5?
160/83.3=13328ns
13328/62.5=~213 тактов
А можно так сделать? Считать количество битов, умножать на 83.3, а потом делить на 62.5?
я не против, делайте
Весь вопрос вовсе не в вычислении интервала, а в том как вы его на пин выведете...
Если есть возможность увеличить шаг (скорее всего она есть), то станет намного проще.
Например если мин длительность импульса = 2666 нс, проверьте, можно ли использовать это значение как шаг интервала.
Если можно, то для 112 мс и шаге 2666 нс получится 42011 интервалов, и если в один байт записывать 8 значений, то потребуется 5251 байт. А это уже может поместиться в память программ, в случае если данные надо записать один раз и больше не менять.
andrey3824 - в качестве примера отправки советую посмотреть библиотеку IRRemote, там задача очень схожая - отправить на пин цепочку нулей и единиц с заданными таймингами
Спасибо, посмотрю.
Я бы посоветовал не страдать и не пытаться воспроизводить из файла очевидный как день тактовый сигнал.
Я бы посоветовал не страдать и не пытаться воспроизводить из файла очевидный как день тактовый сигнал.
Что в нем очевидного?
На тактовый совсем не похоже, что-то вы путаете..
вы что мастерите-то?
Может вместо идеи воспроизведения записанной последовательности проще будет сгенерить сигнал заново программно?
вы что мастерите-то?
Может вместо идеи воспроизведения записанной последовательности проще будет сгенерить сигнал заново программно?
Думаю, что это не так просто.
Для программной генерации практически нет данных.
Это данные с M21S
Скрин с 14 поста не оттуда.
А если кварц поменять?
А если кварц поменять?
Была такая мысль.
Если кварц поменять с 16 на 12, связь с USB потеряется?
У меня UNO, по USB стоит 16U2.
Снял данные на 8МГц. На каждый байт 125ns, два такта.
Примерно посчитал, 930КБ. Даже в мегу не влезет, как правильно залить тоже не накопал.
Меньшую частоту дискретизации уже нельзя ставить.
Вариант, на SD записать, а оттуда читать.
По SD нужные примеры не нашел.
По IRRemote сложновато для меня, попробую в библиотеках полазить.
Меньшую частоту дискретизации уже нельзя ставить.
как вы это проверили?
Может быть вы правы, а я не прав, но мне кажется, что если минимальная длительность импульса 2666, то и требуемая частота дискретизации ПРИ ВЫВОДЕ примерно такая же.
Если заморочится, можно байты параллельно кидать на вторую ардуину уже 12мгц а с неё на сдвиговый регистр используя CKOUT
andrey3824, да это неслыханное расточительcтво хранить такие длинные цепочки повторяющихся данных. Достаточно записывать кол-во единиц и кол-во нолей. От этого бинарника небось сотня байт останется. Под STM есть дата-кэпчуры, -программа как магнитофон может захватить поток данных, сохранить, и потом воспроизвести. Тут вообще ничего изобретать не надо.
Снял данные на 8МГц. На каждый байт 125ns, два такта.
22 раза байт 0х03 - можно заменить одним битом "1", итого файл станет в 22*8 = 176 раз меньше, то есть вместо 930к будет всего примерно 5300 байт... даже в Нано влезет
Меньшую частоту дискретизации уже нельзя ставить.
как вы это проверили?
Может быть вы правы, а я не прав, но мне кажется, что если минимальная длительность импульса 2666, то и требуемая частота дискретизации ПРИ ВЫВОДЕ примерно такая же.
Пробовал, ряд ломается.
andrey3824, да это неслыханное расточительcтво хранить такие длинные цепочки повторяющихся данных. Достаточно записывать кол-во единиц и кол-во нолей. От этого бинарника небось сотня байт останется. Под STM есть дата-кэпчуры, -программа как магнитофон может захватить поток данных, сохранить, и потом воспроизвести. Тут вообще ничего изобретать не надо.
Я на сайте ардуино, STM здесь не трогаю.
Возможно, нужно в ту сторону и двигаться.
Если заморочится, можно байты параллельно кидать на вторую ардуину уже 12мгц а с неё на сдвиговый регистр используя CKOUT
Железо внешнее не додумался прикрутить, нужно рассмотреть.
Спасибо.
Снял данные на 8МГц. На каждый байт 125ns, два такта.
22 раза байт 0х03 - можно заменить одним битом "1", итого файл станет в 22*8 = 176 раз меньше, то есть вместо 930к будет всего примерно 5300 байт... даже в Нано влезет
Это в первую очередь в голову пришло.
Я понимаю, что во много сократит, но как сделать, я сам не допилю.
Мож примеры какие есть?..
Возможно, в каком-нибудь редакторе такое есть.
Пробовал, ряд ломается.
значит надо подобрать такой делитель, чтоб не ломался.
Но в любом случае кодировать ОДИН ИМПУЛЬС 22-мя одинаковыми байтами - это бред. В конце концов можно же писать первый байт и число повторов - и уже будет в 10 раз меньше. чем сейчас.
Я понимаю, что во много сократит, но как сделать, я сам не допилю.
Мож примеры какие есть?..
а вы попробуйте сами "пример" написать.... будут вопросы - поможем
Меньшую частоту дискретизации уже нельзя ставить.
как вы это проверили?
Может быть вы правы, а я не прав, но мне кажется, что если минимальная длительность импульса 2666, то и требуемая частота дискретизации ПРИ ВЫВОДЕ примерно такая же.
Пробовал, ряд ломается.
Если правильно понимаю (по какому-то закону) частота дискретизации должна быть выше в 2 раза.
Это чтобы вообще импульс зарегистрировать. Чтобы записать импульс "правильной" длительности,
частота дискретизации должна быть выше.
Чтобы записать импульс "правильной" длительности, частота дискретизации должна быть выше.
в любом протоколе есть допуск на длины импульсов, в рамках этого допуска эти длины можно считывать и воспроизводить не абсолютно точно, на работоспособность это не влияет
а вы попробуйте сами "пример" написать.... будут вопросы - поможем
Пошел копать, спасибо отозвавшимся.
Чтобы записать импульс "правильной" длительности, частота дискретизации должна быть выше.
в любом протоколе есть допуск на длины импульсов, в рамках этого допуска эти длины можно считывать и воспроизводить не абсолютно точно, на работоспособность это не влияет
Понимаю, но специально не проверял.
andrey3824, так все-таки что за протокол вы пытаетесь перехватить и воспроизвести? О нем хоть что-то известно?
Это запросы на плату майнера M21S. Я выше написал.
Куча предустановок в каждый чип. После чего чипы по-порядку отвечают.
Если послать самый последний запрос, который идёт после заметной паузы,
то приходит ответ от всех чипов. Ответы абсолютно одинаковые.
Но когда сначала на плату идет та большая пачка с какими-то предустановками,
то ответы уже разные. Кроме того, ответить при этом могут не все чипы или ответы могут отличаться
от "нормальных".
Кое-что я передал с ардуины, это работает. То есть тайминги подходят.
Один человек мне объяснял, что нужно в линуксе это всё разобрать и станет понятнее.
Но это еще один темный лес. А у меня задача просто передать нули и единицы из файла во внешний мир.
Данные ответа пока также буду анализатором считывать. Программка для ответов уже есть.
ну понятно :)
Для майнеров ценник * 10
ну понятно :)
Для майнеров ценник * 10
Я не майнер)).
Это запросы на плату майнера M21S.
Ну а цель то какая?
Это запросы на плату майнера M21S.
Ну а цель то какая?
видимо ремонт ASICов )))
Тестер видит плату полноценной.
Просто тестер не всё умеет.
Цель - вычислить чип, который не отвечает на задание с предустановками.
Это запросы на плату майнера M21S.
Ну а цель то какая?
видимо ремонт ASICов )))
Да))
Кто-нибудь возьмётся закодить подходящую железку?
Не бесплатно, конечно.
Кто-нибудь возьмётся закодить подходящую железку?
Не бесплатно, конечно.
на СТМ могу, но...
Для майнеров ценник * 10
:)))))))))))))
Это в долларах?))
Это в долларах?))
Андрей, задача в чем? только воспроизводить сигнал из вашего файла? Или захватывать тоже надо?
Для начала мне нужно только воспроизвести.
Подготовить файл я сам смогу, записав тем же анализатором.