Почему программа на UNO останавливается?

Добрый день! В завалах накопилась кучка 7-сегментных модулей max7219. Часть из них (помню) страдали выпадением или низкой светимостью отдельных элементов. Написал скетчик для выбраковки покалеченных.

//АРДУИНО УНО
//Подключаем библиотеку индикаторов 
#include "LedControl.h" 
//создаём объекты класса LedControl (din,clk,cs,X)\, четвертая цифра "X" - количество модулей
LedControl lc = LedControl(4,2,3,1);  
boolean dot=true;
unsigned long max7219; 

void setup() 
{
// Инициация пинов индикации на выход
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT); 
  pinMode(4, OUTPUT); 
 
// Инициация состояния индикатора     
  lc.shutdown(0, false); //Выводим из спящего режима
  lc.setIntensity(0,2);  //Яркость дисплея. Всего возможных режимов яркости от 0 до 15
  lc.clearDisplay(0);    //Очистить дисплей
}

void loop() 
{
  if (millis()-max7219>333)
  {
    for (int ind=0;ind<=8;ind++)
    {
      lc.setDigit(0, ind, 8, dot);
    } 
    if (dot==true) {dot=false;}
    else {dot=true;}
    max7219=millis();
  }
  
}

После загрузки программа отрабатывает вполне адекватно: на всех разрядах “восьмерки”, десятичная точка мигает. Однако через некоторое время (подсчитал количество миганий, их 77) программа замирает. Что я сделал не так?

Заранее спасибо!

это шо такое?

и это

    if (dot==true) {dot=false;}
    else {dot=true;}

можно так

dot=!dot;

Миша, всё у тебя нормально. Причина не программная. Может контроллер умирает, или коротит что-то на столе.

Ну дык просто прописываю последовательно во всех разрядах “восьмерки”. Что не так?

Безусловно. Но написал “в лоб” как ламер.

Вопрос был не в изяществе скетча, а почему программа сначала работает, а потом затыкается ни с того ни с сего.

и скока этих “разрядов” у тебя?

Влад, привет! Думал про коротыш, но заменены:

  1. Плата (две УНЫ и одна МЕГА)
  2. Кабели (3 штуки)
  3. Порты (4 штуки)

Толку ноль: стопорится и всё тут, зараза…

Дык ЛедКонтрол все порубит ненужное, уж точно не погубит память :wink:

Так восемь же…

а считаешь до скольки?

от 0 до <=8 - выходит 9 чисел :wink: 0,1,2,3,4,5,6,7,8 :rofl:
но повторю, что это должно быть похрену библиотеке… ну исправь, коль не лень

Не, ну во я пень-то! Перепишу вечерком - проверю. Хотя, думаю, библе это профиг. Спасибо!

Друзья, таймаут на проверку.

да, похрен :+1:

void LedControl::setDigit(int addr, int digit, byte value, boolean dp) {
    int offset;
    byte v;

    if(addr<0 || addr>=maxDevices)
        return;
    if(digit<0 || digit>7 || value>15)
        return;
    offset=addr*8;
    v=pgm_read_byte_near(charTable + value); 
    if(dp)
        v|=B10000000;
    status[offset+digit]=v;
    spiTransfer(addr, digit+1,v);
}

ну тада я хз

а я знаю, у него max7219 в начале не проинициализирована… какое длинное слово получилось…
а еще ind = 8 не существует))) есть только 0-7

гениально! :grin:

не ну а что ?))) вооо! все заработает! но это не точно…

#include "LedControl.h"

// DIN, CLK, CS, количество модулей
LedControl lc = LedControl(4, 2, 3, 1);

boolean dot = true;
unsigned long previousMillis = 0;

void setup() {
  // Пины и так станут выходами после lc.begin() внутри библиотеки,
  // но можно оставить для ясности.
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);

  lc.shutdown(0, false);   // Выход из режима сна
  lc.setIntensity(0, 2);   // Яркость 0..15
  lc.clearDisplay(0);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= 333) {
    previousMillis = currentMillis;

    // Правильный цикл — только 0..7
    for (int ind = 0; ind < 8; ind++) {
      lc.setDigit(0, ind, 8, dot);
    }

    dot = !dot;  // инвертируем точку
  }
}

Осспадя, как я стар…

как был ты неучем…
тебя не смущает, что пока ты на индикатор выводишь, миллис тоже тикает.

xDriver давайте решать проблемы постепенно, если не заработает, будем править еще)))

А сколько у Вас разрядов? Девять? Точно? Не знаю, как Ваша библиотека к таком отнесётся.

Чё думать-то, смотреть надо! Давайте ссылку на библиотеку, посмотрим.

Если вот эта, то да, она дуракоустойчива. Там есть проверка:

    if(digit<0 || digit>7 || value>15)
	    return;