Проблема с объединением max7219 и tlc5940
- Войдите на сайт для отправки комментариев
Ср, 06/04/2016 - 13:10
#include "Tlc5940.h"; #include "LedControl.h" // need the library LedControl lc=LedControl(2,6,5,1); // #define DELAY 45 unsigned long timer; int row = 0; byte st = 0; int col = 0; void setup() { // the zero refers to the MAX7219 number, it is zero for 1 chip lc.shutdown(0,false);// turn off power saving, enables display lc.setIntensity(0,2);// sets brightness (0~15 possible values) lc.clearDisplay(0);// clear screen //Инициализируем драйвер Tlc.init(); } void loop() { if (millis()-timer > DELAY) { timer = millis(); lc.setLed(0,1, row-2, st); // turns on/off LED at col, row lc.setLed(0,3, row, st); // turns on/off LED at col, row lc.setLed(0,5, row-1, st); // turns on/off LED at col, row lc.setLed(0,col, 0, st); // turns on/off LED at col, row lc.setLed(0,col, 1, st); // turns on/off LED at col, row lc.setLed(0,col-1, 2, st); // turns on/off LED at col, row lc.setLed(0,col-2, 3, st); // turns on/off LED at col, row lc.setLed(0,col, 4, st); // turns on/off LED at col, row lc.setLed(0,col-1, 5, st); // turns on/off LED at col, row /* lc.setLed(0,2, row-2, st); // turns on/off LED at col, row lc.setLed(0,0, row-2, st); // turns on/off LED at col, row */ if ((++row > 6)&&(++col>6)) {row=0;col=0; st^=1;} } int direction = 1; //Обратите внимание, на использование переменной NUM_TLCS. //Если умножить её на 16, то мы получим число выводов //На всех драйверах подключённых цепочкой //Таким образом, OUT0 второго драйвера будет 16 каналом //OUT0 третьего будет 32 каналом и т.д. for (int channel = 0; channel < NUM_TLCS*16; channel += direction) { //Гасим выводы: Tlc.clear(); //Устанавливаем яркость в зависимости от направления волны if (channel == 0) { direction = 1; } else { Tlc.set(channel - 1, 1000); } Tlc.set(channel, 4095); if (channel != NUM_TLCS * 16 - 1) { Tlc.set(channel + 1, 1000); } else { direction = -1; } //Применяем изменения Tlc.update(); int OldTime=millis(); while((millis()-OldTime)<100); } }
По отдельности всё работает, объединяю код и работает только tlc5940. Нашёл, что может быть проблема в библиотеке tlc5940 - не позволяют подключать к arduino одновременно с драйвером другие модули, использующие интерфейс SPI. Заменил интерфейс драйвера на «bitbang», ничего не изменилось.
Не знаю, что у Вас за библиотека LedControl, если вот эта, то она и не пользуется SPI - у неё SPI программный. Так, что можно включать нормальный SPI обратно.
А вот за пины точно могли передраться. tlc5940 инициализирует чёртову уйму пинов (которыми Вы реально не пользуетесь).
Изучите внимательно файлы tlc_config и файлы в директории pinouts. Найдите какой из нужных Вам пинов она гадит и в конфиг задефайните к чертям этот пин и всё остальное, чем не пользуетесь.
Попробовал - не помогло.
Плохо пробовали.
Чтобы убедиться, что дело именно в пинах (или наоборот, убедиться. что не в них), поставьте строку 16 в самое начало setup(), а строку 3 разбейте на описание (его оставьте на месте) и создание объекта - его поставьте после строки 16 (на её новом месте). Т.е. сделайте, чтобы LedControl инициализировалась после tlc, а не до, как сейчас. Если дело в пинах, то при такой перестановке LedControl заработает, но, возможно сломается tlc.
Ну, что, Кирилл, попробовали переставить? Мне интересно стало.
Знаете, хочу ещё добавить. Я смотрел библиотеку LedControl (не знаю ту же версию, что у Вас или нет). Вроде, она таймерами не пользуется. Но, если пользуется (или если Вы планируете добавлять в код другие библиотеки, которые пользуются), то имейте в виду, что библиотека TLC'шки занимает оба свободных в Uno-подобных ардуинах таймера. Т.е., ничего, что требует таймера с ней работать не будет.
Как с этим бороться зависит от того, для чего Вы реально используете TLC'шку. Если такая проблема возникнет и потребуется освободить хотя бы один таймер, обращайтесь.
Нет, еще не пробовал. С работы приду сегодня, посмотрю. LedControl сейчас поставил по ссылке, что вы скидывали. Tlc будет использоваться для мигания светодиодами, больше не планировал её ни для чего. На эту же ардуину в дальнейшем может подцеплю lcd1602, модуль реального времени и несколько термодатчиков.
Если что, учту. Спасибо.
С постоянной яркостью? Или хотите варьировать яркость ШИМом?
Если с постоянной яркостью, то вот здесь есть пример кода как работать с TLC5940 вовсе без всякой библиотеки и при этом не занимать ни одного таймера. Пример всего 59 строк - всегда этот приём использую, очень рекомендую.
Если же хотите использовать ШИМ для изменения яроксти и при этом Вам достаточно частоты ШИМ в 62Гц, то можно использовать TLC5940 задействуя один таймер и watch-dog таймер вместо двух таймеров.
Попробовал разделить таким образом, но видимо делаю что-то не так, ругается: 'class LedControl' has no member named 'init' .
Переставил Tlc.init() в начало setup - светодиоды на max просто горят с максимальной яркостью.
Светодиоды будут гореть с постоянной яркостью. Грубо говоря, половина горит какое-то время, потом гаснут и загораются другие, горят, гаснут, загорается первая половина и т.д. Думал уже, может проще мультивибратор собрать для этой цели. Ну или бегущий огонь, как в коде написан, тоже подойдёт для моих целей.
Попробовал Ваш код, без использования библиотеки - заработало.
Ну, тогда, проблема как бы решена. Но, может, для образовательных целей стоит добить ту проблему.
Кстати, гляньте на размер скетча и глобальных переменных без библиотеки, сравните с размером с библиотекой и порадуйтесь.
Попробовал разделить таким образом, но видимо делаю что-то не так, ругается: 'class LedControl' has no member named 'init' .
Так у него нет инита. Разделять надо не так (в смсле идейно - так, но техника тут иная).
В строке 3 оставляете
LedControl * lc;
а в setup после инициализации TLC'шки пишете
lc = new LedControl(12,6,5,1);
И наконец, везде, где используете lc (строки 12-14, 24-32 и т.д. - везде), вместо нотации "lc." используете нотацию "lc->", т.е. просто заменяете точку на ->
Понял Вас, вечером посмотрю что получится. Самому интересно, хотя бы убедится, что дело в пинах. Да, решена, спасибо Вам большое. Заметил только, что светодиоды на мах стали загораться значительно медленнее, но это не критично.
Сделал как Вы писали: ничего не изменилось, tlc работает, max -нет.
Понатно, значит дело не в пинах, а в чём-то ещё. Надо их подробнее смотреть.