Проблема с объединением max7219 и tlc5940

Kirill999
Offline
Зарегистрирован: 11.01.2016
#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», ничего не изменилось.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kirill999 пишет:
Нашёл, что может быть проблема в библиотеке tlc5940 - не позволяют подключать к arduino одновременно с драйвером другие модули, использующие интерфейс SPI. Заменил интерфейс драйвера на «bitbang», ничего не изменилось.

Не знаю, что у Вас за библиотека LedControl, если вот эта, то она и не пользуется SPI - у неё SPI программный. Так, что можно включать нормальный SPI обратно.

А вот за пины точно могли передраться. tlc5940 инициализирует чёртову уйму пинов (которыми Вы реально не пользуетесь).

Изучите внимательно файлы tlc_config и файлы в директории pinouts. Найдите какой из нужных Вам пинов она гадит и в конфиг задефайните к чертям этот пин и всё остальное, чем не пользуетесь.

 

Kirill999
Offline
Зарегистрирован: 11.01.2016

Попробовал - не помогло.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Плохо пробовали.

Чтобы убедиться, что дело именно в пинах (или наоборот, убедиться. что не в них), поставьте строку 16 в самое начало setup(), а строку 3 разбейте на описание (его оставьте на месте) и создание объекта - его поставьте после строки 16 (на её новом месте). Т.е. сделайте, чтобы LedControl инициализировалась после tlc, а не до, как сейчас. Если дело в пинах, то при такой перестановке LedControl заработает, но, возможно сломается tlc.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, что, Кирилл, попробовали переставить? Мне интересно стало.

Знаете, хочу ещё добавить. Я смотрел библиотеку LedControl (не знаю ту же версию, что у Вас или нет). Вроде, она таймерами не пользуется. Но, если пользуется (или если Вы планируете добавлять в код другие библиотеки, которые пользуются), то имейте в виду, что библиотека TLC'шки занимает оба свободных в Uno-подобных ардуинах таймера. Т.е., ничего, что требует таймера с ней работать не будет.

Как с этим бороться зависит от того, для чего Вы реально используете TLC'шку. Если такая проблема возникнет и потребуется освободить хотя бы один таймер, обращайтесь.

Kirill999
Offline
Зарегистрирован: 11.01.2016

Нет, еще не пробовал. С работы приду сегодня, посмотрю. LedControl сейчас поставил по ссылке, что вы скидывали. Tlc будет использоваться для мигания светодиодами, больше не планировал её ни для чего. На эту же ардуину в дальнейшем может подцеплю lcd1602, модуль реального времени и несколько термодатчиков.
Если что, учту. Спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kirill999 пишет:
Tlc будет использоваться для мигания светодиодами, больше не планировал её ни для чего.

С постоянной яркостью? Или хотите варьировать яркость ШИМом?

Если с постоянной яркостью, то вот здесь есть пример кода как работать с TLC5940 вовсе без всякой библиотеки и при этом не занимать ни одного таймера. Пример всего 59 строк - всегда этот приём использую, очень рекомендую.

Если же хотите использовать ШИМ для изменения яроксти и при этом Вам достаточно частоты ШИМ в 62Гц, то можно использовать TLC5940 задействуя один таймер и watch-dog таймер вместо двух таймеров. 

Kirill999
Offline
Зарегистрирован: 11.01.2016
LedControl lc(12,6,5,1);
lc.init();

Попробовал разделить таким образом, но видимо делаю что-то не так, ругается: 'class LedControl' has no member named 'init' .

Переставил  Tlc.init() в начало setup - светодиоды на max просто горят с максимальной яркостью.

Светодиоды будут гореть с постоянной яркостью. Грубо говоря, половина горит какое-то время, потом гаснут и загораются другие, горят, гаснут, загорается первая половина и т.д. Думал уже, может проще мультивибратор собрать для этой цели. Ну или бегущий огонь, как в коде написан, тоже подойдёт для моих целей.

Попробовал Ваш код, без использования библиотеки - заработало. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kirill999 пишет:
Попробовал Ваш код, без использования библиотеки - заработало.

Ну, тогда, проблема как бы решена. Но, может, для образовательных целей стоит добить ту проблему.

Кстати, гляньте на размер скетча и глобальных переменных без библиотеки, сравните с размером с библиотекой и порадуйтесь.

Kirill999 пишет:

LedControl lc(12,6,5,1);
lc.init();

Попробовал разделить таким образом, но видимо делаю что-то не так, ругается: '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->",  т.е. просто заменяете  точку на ->

Kirill999
Offline
Зарегистрирован: 11.01.2016

Понял Вас, вечером посмотрю что получится. Самому интересно, хотя бы убедится, что дело в пинах. Да, решена, спасибо Вам большое. Заметил только, что светодиоды на мах стали загораться значительно медленнее, но это не критично.

Kirill999
Offline
Зарегистрирован: 11.01.2016

Сделал как Вы писали: ничего не изменилось, tlc работает, max -нет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понатно, значит дело не в пинах, а в чём-то ещё. Надо их подробнее смотреть.