Внезапный сбой в работе модулей max7219

Другая либа - это хорошо, но почему же все-таки исходный код глючит?

На моё скромное ИМХО, проблема скорее аппаратная.

Я бы другую UNO подкинул

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

Я “подкинул” в Протеусе, всё норм.

В протеусе и короткое замыкание «норм»…

Специально не проверял, позже проверю. Но выход за адрес памяти всегда показывал.
Там скетч то - “10 циферок по SPI передать”))

Это вся библиотека?

Нет конечно. Но разве вся библиотека должна обязательно загружаться и использоваться?

Не вся, только взаимосвязанные части.

Вот и я о том. В любом случае, я лишь высказываю

Так и я «истину в единой инстанции» не утверждал.

В общем, у меня есть нано (чем не уно? :smiley: ). В “быстром доступе” (что я использую для чего-то быстро проверить) у меня только на 168 чипе. По флэш влезает.

Скетч использует 3758 байт (26%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 288 байт (28%) динамической памяти, оставляя 736 байт для локальных переменных. Максимум: 1024 байт.

Загружаю вот такой код туда (добавил вывод в сериал и помигать диодом на 13 пине):

Сам код
//UNO
//Подключение библиотеки max7219
#include "LedControl.h"  // Бибилотека то хоть та? Брал тут: https://github.com/brodykenrick/MAX72xx_SPI_Arduino

#define LED 13

//создаём объект класса LedControl (din,clk,cs,X) X - количество модулей. Провода: din-оранжевый, clk-зеленый, cs-желтый, vcc-коричневый, gnd-красный 
LedControl lc_test = LedControl(11, 9, 10, 3);

uint32_t old;

void setup() {
  pinMode (9, OUTPUT); 
  pinMode (10, OUTPUT); 
  pinMode (11, OUTPUT); 

  //Инициализация max7219
  lc_test.shutdown(0, false); //Выводим из спящего режима
  lc_test.setIntensity(0, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(0);    //Очистить дисплей
  lc_test.shutdown(1, false); //Выводим из спящего режима
  lc_test.setIntensity(1, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(1);    //Очистить дисплей
  lc_test.shutdown(2, false); //Выводим из спящего режима
  lc_test.setIntensity(2, 4); //Яркость дисплея на 4. Всего возможных режимов яркости от 0 до 15
  lc_test.clearDisplay(2);    //Очистить дисплей

  //===========
  Serial.begin(9600);
  old = millis();
  pinMode (LED, OUTPUT); 
  digitalWrite(LED, HIGH);
}
void loop() {

  if (millis() - old >= 1000) {
    old = millis();
    digitalWrite(LED, !digitalRead(LED));
    Serial.print("Seconds:");
    Serial.println((millis() % 1000));
  }
  
  lc_test.setDigit(0, 7, 0, true);
  delay(500);
  lc_test.setDigit(0, 6, 1, true);
  delay(500);
  lc_test.setDigit(0, 5, 2, true);
  delay(500);
  lc_test.setDigit(0, 4, 3, true);
  delay(500);
  lc_test.setDigit(0, 3, 4, true);
  delay(500);
  lc_test.setDigit(0, 2, 5, true);
  delay(500);
  lc_test.setDigit(0, 1, 6, true);
  delay(500);
  lc_test.setDigit(0, 0, 7, true);
  delay(500);
  lc_test.clearDisplay(0);    //Очистить дисплей

  lc_test.setDigit(1, 7, 8, true);
  delay(500);
  lc_test.setDigit(1, 6, 9, true);
  delay(500);
  lc_test.setDigit(1, 5, 0, true);
  delay(500);
  lc_test.setDigit(1, 4, 1, true);
  delay(500);
  lc_test.setDigit(1, 3, 2, true);
  delay(500);
  lc_test.setDigit(1, 2, 3, true);
  delay(500);
  lc_test.setDigit(1, 1, 4, true);
  delay(500);
  lc_test.setDigit(1, 0, 5, true);
  delay(500);
  lc_test.clearDisplay(1);    //Очистить дисплей

  lc_test.setDigit(2, 7, 6, true);
  delay(500);
  lc_test.setDigit(2, 6, 7, true);
  delay(500);
  lc_test.setDigit(2, 5, 8, true);
  delay(500);
  lc_test.setDigit(2, 4, 9, true);
  delay(500);
  lc_test.setDigit(2, 3, 0, true);
  delay(500);
  lc_test.setDigit(2, 2, 1, true);
  delay(500);
  lc_test.setDigit(2, 1, 2, true);
  delay(500);
  lc_test.setDigit(2, 0, 3, true);
  delay(500);
  lc_test.clearDisplay(2);    //Очистить дисплей
}

Это “тупо” скажите вы, и будете правы. Особенно с миллис среди делеев. Но он работает.
Посмотри что будет дальше…

Напомню - в 168 чипе 16кб флэшь и 1 кб ОЗУ.

Пока так:

Seconds:65
Seconds:105
Seconds:147
Seconds:187
Seconds:228
Seconds:269
Seconds:310

Оставляю на время…

Результат мне не понятен, но он имеется и не в пользу протеуса…
Обратите внимание на строки 23 и 24, а так же 48 и 49.

Seconds:65
Seconds:105
Seconds:147
Seconds:187
Seconds:228
Seconds:269
Seconds:310
Seconds:351
Seconds:392
Seconds:432
Seconds:473
Seconds:514
Seconds:555
Seconds:596
Seconds:636
Seconds:677
Seconds:719
Seconds:759
Seconds:800
Seconds:840
Seconds:881
Seconds:923
Seconds:963
Seconds:4
Seconds:44
Seconds:85
Seconds:127
Seconds:167
Seconds:208
Seconds:249
Seconds:289
Seconds:331
Seconds:371
Seconds:412
Seconds:453
Seconds:494
Seconds:535
Seconds:576
Seconds:616
Seconds:657
Seconds:698
Seconds:739
Seconds:780
Seconds:820
Seconds:861
Seconds:903
Seconds:943
Seconds:984
Seconds:24
Seconds:65
Seconds:107

Похоже в мк произошел “сброс”. Почему?

Конфигурация, так сказать:

Почему похоже - так и есть

1 лайк

Не знаю только - библиотека то та или нет?
Ну int везде (где и не надо) присутствует :smiley:

Не для спора, а для “истины”))
Однако, не совсем корректный пример, т.к.

  1. Памяти в два раза меньше
  2. У ТС сериала нет, а он сам “жрёт” не мало

Но я же привел данные «входные»:

Если отсюда, то та

  1. Однако ее хватает за глаза
  2. Ну не настолько же ))

А вот и описанный автором «косяк», который я не сразу заметил…
Видно, что по сериалу прошло больше 2000 секунд вроде как. А это ПОЛЧАСА. На самом деле всё работало минут 5-8, не более… :slight_smile: