Библиотека TLC5940.cpp - как реализовать функцию
- Войдите на сайт для отправки комментариев
Пт, 22/12/2017 - 14:28
Всем доброго дня!
Столкнулся с проблемой: в библиотеке TLC5940 содержатся определения:
/** Some of the extened library will need to be called after a successful update. */ volatile void (*tlc_onUpdateFinished)(void); ... ... ... /** Interrupt called after an XLAT pulse to prevent more XLAT pulses. */ static inline void Tlc5940_interrupt(void) { disable_XLAT_pulses(); clear_XLAT_interrupt(); tlc_needXLAT = 0; if (tlc_onUpdateFinished) { sei(); tlc_onUpdateFinished(); } }
Я не силён в Си (программирую в Delphi), поэтому для меня проблема - как эту самую функцию tlc_onUpdateFinished() оформить, чтобы в неё можно было что-то вписать?
Просто описываете процедуру без параметров с любым именем (в примере я использовал имя kaka), а до того, как начнёте использовать TLC, нужно исполнить присваивание tlc_onUpdateFinished = <то самое имя>;
Вот пример:
Спасибо, Евгений!
Буду пробовать. По ходу ещё вопрос: я эту функцию хочу использовать для синхронизации сканирования светодиодной матрицы с ШИМом от TLC (строки на сдвиговом регистре, столбцы - на TLC). Матрица маленькая, но светодиоды мигают конкретно. Причём характер мигания зависит от частоты смены кадров. Вплоть до полного "выпадения" некоторых элементов матрицы. Возможно, что я копаю не в ту сторону, а решение есть другое?
Ну, я цеплял и строки и столбцы на одну и ту же TLC'шку - никаких проблем не было и синхронизировать ничего не надо.
Вернее, там было две TLC'шки, т.к. матрица была 8х8 RGB (всё равно, что 8х24) и одной не хватало.
Позволю себе влезть в вашу беседу, но мне очень нравится эта мелкосхема и я тут как-то в детстве баловался вот этой библиотекой:
https://sites.google.com/site/artcfox/demystifying-the-tlc5940
У меня, к сожалению, этих микросхем не густо. Поэтому и сдвиговый регистр на строки. А функция tlc_onUpdateFinished() тоже ничем не помогла.
Понять бы, отчего мигает... Схема работает стандартно - регистр включает одну строку, TLC загружается данными для этой строки, небольшая задержка (пробовал и без оной) - и следующая строка, пока весь кадр не отрисуется. И так далее. Так вот, от величины задержки между переключениями строк и зависит мигание.
Библиотеку demystifyfuing я попробую, но вряд ли она решит проблему - косяк либо в схеме, либо в алгоритме.
Евгений, а нельзя бы ссылку на вашу схему и скетч, если они есть в интернете? Для сравнения - может свою ошибку обнаружу. Подобных схем много, "скомпилировал" их под себя (без принципиальных изменений - только в основном элементная база) , но что-то не срослось, хотя всё, казалось бы, очевидно...
Так на этом же форуме всё есть. И схема, и печатка, и библиотека (самогонная, заточенная под получившееся железо) и несколько скетчей-примеров. Только там на схеме конденсаторы по 1uF - на практике не хватило - заменил на 10uF
Спасибо за хорошие ответы, буду разбираться. Ваша конструкция у меня тоже, оказывается, есть и я её учитывал при создании своей. Но ваш скетч не прорабатывал. Буду смотреть - возможно ответы там. Спасибо.
Юрий, если Вы хотите, чтобы столбцы были на отдельных пинах, то Вам надо лезть в библиотеку. Без её модификации ничего не выйдет. Там ведь полный цикл идёт по GSCLK - по умолчанию 4092 такта. Потомв BLANK ненадолго выставляется в HIGH, загружаются новые данные, а потом снова те же 4092 такта. Так вот Вам надо со своим переключением влезть точно момент пока BLANK в HIGH. Проще всего для этого внести правки в библиотеку.
Да, в результате 4092-х экспериментов, проведенных как со скетчем, так и с библиотекой, я понял примерно то же самое:(((. В вашем проекте всё чётко привязано к циклу ШИМ, поэтому синхронизировано по определению. А в библиотеке TLC5940 этого нет. Сама библиотека меня устраивает тем, что позволяет использовать BitBang вместо SPI (на SPI у меня висит модуль записи-чтения SD-карточек - на ней (карточке), я и записываю "видеоряд" матрицы). Конечно, если я немного отдохну от умственного перенапряжения :), то придумаю, как сделать модификацию библиотеки (по наивности я уже пытался в скетче считывать BLANK с ножки через digitalRead :)). К сожалению, у меня проблемы с Си и программированием контроллеров. Ну что-ж, век живи, век учись. Хотя век уже такой, что учиться не слишком-то и хочется. Я ведь в молодости работал ещё с аналоговыми ЭВМ, на которых программа набиралась с помощью перемычек (прям, как на нынешних макетках). Слышали о таких "компьютерах"? Думаю, вряд-ли... Мне результат важен, а не пути его его решения. У меня небольшой самодеятельный театр с глубоко отрицательным бюджетом. А то, что я делаю - световое оформление для некоторых сцен. Всё сами, своими ручками...
Ну, да ладно, это по-стариковски...
Спасибо за советы, они мне хорошо помогают. Для данного конткретного изделия я могу обойтись и более простыми алгоритмами (соответственно и рисунками), в которых не нужно развёртки (горит то, что на пересечении строк-столбцов). Уже проверено и отлажено. Но в планах - панно, скажем 64 х 32 LED RGB, позволяющее воспроизвести полноценное изображение. Вот для него-то и придётся всё перелопатить.