2ТС: А ничего, что 16 МГц Атмеги не делятся нацело ни на 5 МГц (200 нс), ни на 1.67 МГц (600 нс)?
И еще: как при входе в прерывание, так и при выходе из него интенсивно используется стек. Поэтому максимальная частота вызова прерываний составляет порядка 110 кГц, что почти в 50 раз меньше, чем Вам нужно.
В общем, при таком подходе шансы на удачу равны нулю.
Не, парни… Ассемблер это совсем не мой конёк Я с ним общался только в 1988 году, когда диплом для Бурана писал и тогда мы с ним распрощались.
Обидно и досадно, что не выходит красиво написать, но куда деваться… Приведенный выше говнокод показывает, что в принципе Atmega328 справится с этой ленточкой. Да это будет говнокод с костылями, но для моей местячковой задачи проканает. 1000 светодиодов обработать займет что-то в районе 31.5 ms, - могу себе позволить потерпеть такие блокирующие куски кода.
Да и вряд ли кому-то еще будет интересен этот чип. Не каждый такой вот Плюшкин, чтоб откапывать пару тысяч мамонтов у себя в кладовке Разве что чисто теоретически и на перспективу добить этот код, чтоб потом где-то использовать, как болванку.
Мой код самой процедуры на ассемблере трогать не надо. Просто передавайте в неё массив данных из расчета 4,5 байта на диод. Тайминги очень похожи. Главное правильно формировать цвет точек в 36 битах…
Повторяйте последовательность FF F0 00 00 0F FF 00 00 00 и после вывода будет ясно какой цвет идет первым …
Что одним цветом? Кто одним цветом? Перед тем, как запускать что-то совсем цветное, надо хотя бы все 3 канала вкл/выкл в полную дурь. Не надо вводить в заблуждение аудиторию!
Если это делать на ESP32 контроллере, то там как раз есть то, что тебе нужно: RMT. Там как раз можно задать, что такое 0 (например, 0 это HIGH 250ms, LOW 250ms, промодулировано 30кгц еще сверху, например), что такое 1 а затем послать эту цепочку битов. Можно вручную задать все уровни. Можно побайтно.
Я писал такой код для ESP32. Там этот RMT используется для IR Remote протокола, ну или чтобы генермировать сигнал, в котором меняется скважность или частота. Точность там, если память не изменяет, 12.5нс.
Минутка рекламы. в ESPShell конкретно твой пример будет выглядеть так:
Используется, например, в IR протоколе от NEC да и много где еще. Есть библиотеки для Ардуины (не смотрел в них), есть контроллеры с аппаратной поддержкой этого чуда.
В “нормальных” контроллерах есть много способов как генерить сигнал ws2812. Подойдет практически любой последовательный протокол с настраиваемой частотой.
Для STM32 есть библиотека на основе интерфейса SPI. Для китайцев W80x - через I2S. Ещё мне попадалась реализация ws2812 через UART… не помню где.
Хотя… на любом быстром контроллере адресной лентой можно управлять просто ногодрыгом, причем прям на С/С++, без всякого ассемблера.
Вообще, полезно покопаться на гитхабе в исходниках Фастлед. Там столько разных вариантов. Не знаю, почему @Hamper не пошел этим путем.
Согласен. Я бы вас попросил написать эту ассемблерную вставку, но у меня нет ни одного модуля-светодиода на этом чипе
…И на али тоже нет в продаже этой экзотики, как не искал. Поэтому интерес останется неудовлетворённым.
Да, я бы и для ТС написал бы, если бы он внятно сформулировал ТЗ (без закидонов типа 1000 светодиодов на 328-ой атмеге), прислал бы мне ленту или плату с пятью-десятью распаянными светодиодами и согласился бы внести некую сумму, например, сюда, но так вопрос, по-моему, не стоит.