Необходимо сформировать сигнал с переменной скважностью. Это для управления адресными диодами на чипе LPD1886, Библиотека FastLED теоретически должна ими управлять, но практически полная каша (((
Предположим мы хотим запулить цепочку байт 0xAAAAAAAAA - т.е. в бинарном виде это последовательно 1010101… и т.д.
Каждый бит в посылке это последовательно высокий и затем низкий уровень.
bit = 0 : High ~200 ns Low ~ 600 ns
bit =1 : High ~600 ns Low ~200 ns
Вот вроде бы ШИМ, но надо в каждом импульсе выставлять разную скважность (duty). Как??? Всю голову сломал…
Пробую сделать на Timer1. Если просто сформировать ШИМ без прерываний, то в тайминги укладываюсь. Все замечательно. По идее надо бы подключить прерывание и внутри него изменять динамически скважность. Вот только Arduino Nano сразу начинает виснуть (((( Пробовал разные комбинации, но как то не выходит. Если ширину импульса увеличить до нескольких ms , то получасется, но это слишком медленно и чип светодиода не воспринимает это как управляющую посылку.
Подскажите, как контроллировать скважность ШИМ в каждом импульсе?! Или может есть другие идеи?
Приведите хоть один довод, почему Вы считаете, что это имеет хоть какое-то отношение к широтно-импульсной модуляции.
Ну, например, что именно Вы считаете модулирующим сигналом, и что - модулируемым?
Ассемблерная вставка кажется из-за “жестких таймингов”. Мне помогали, люди понимающие на форуме есть.
…ШИМ, видимо ошибочное представление передачи кодированных данных.
МК виснет на такой конструкции и начинает дышать только если увеличить период ШИМа, но это уже совсем другие медленные тайминги , которые чип отказывается принимать ((( Повторюсь - комбинации прерываний делал разные!
Как уже сказали, нужный вам ШИМ невозможно реализовать на NANO через прерывания.
Если у вас есть логический анализатор, то методом осознанного тыка можно подобрать изменение алгоритма для FastLed. В последних версиях там не привычный синтаксис, но с анализатором наверно проще разобраться. Или изменить более легкие библиотеки - например Gyver microLED
Ну, а красным попробуйте зажечь.
Везде и все пишут никак без ассемблера, слишком быстро надо переключать. Попросите тут, может на ваших таймингах напишут вставку.
Да это из старых запасов достал )))) Не знаю, продается ли сейчас такое - не смотрел. У меня просто 2000+ таких чипов в модуль запаянных вместе с диодами.
Вам надо просто сделать базовую, низкоуровневую программу передачи массива на ленту. Она ничего другого не делает, только отфигачивает массив по этим таймингам. Когда у Вас будет такая программа, Вы уже можете вешать на заполнение этого массива любых девочек с блэкджеками, хоть полный фаслтлед.
Такая программа пишется несложно. Пишется (я писал на ассемблере) передача, при этом считается сколько тактов потрачено на накладные расходы, а остальные такты для тайминга добираются нопами. У меня есть такая программа для 8212. Тут также только тайминги другие и 36-бит.
И да, чуть не забыл.
Не разбирался, правда это или нет, но если бы мне нужно было бы, чтобы заработал, я бы заменил функцию showRGBInternal в файле clockless_trinket.h на вышеописанную свою и заработал бы, куда ему деваться.