Мерцание семисегментных индикаторов при включении питания

Я бы и первое не рекомендовал!

2 лайка

Смена пина решила проблему. Всем спасибо. Евгений - Вам особенное за порку насчет болтающихся в воздухе выводов.

Только по одной вздорной причине. На модуле “ножи” как раз под соседние гнезда Ардуино - GND и №13.

ну вот. Естественно столь подробно я “дурака” просил написать :wink: Джуна своего, чатЖПТ зовут… Все таки ЗП у него есть - USD20 в месяц ;), но премию выписать или выходной дать штоле? Проверил за ним, он естественно накосячил в знакогенераторе, но потом поправил, после 3.14здюлей!
Я просил его написать подробно, “для доктора”. Прочел - вроде он всё хорошо сделал.

Прости, что не сам писал, мне бежать в школу к 16-00. Я уже (N+1)-год иврит учу!

Спойлер
// ----------------- ПОДКЛЮЧЕНИЕ MAX7219 К MEGA2560 -----------------
const uint8_t PIN_DIN = 23;  // MAX7219 DIN
const uint8_t PIN_CLK = 27;  // MAX7219 CLK
const uint8_t PIN_CS  = 25;  // MAX7219 CS (LOAD)

// ----------------- РЕГИСТРЫ MAX7219 -----------------
const uint8_t REG_NOOP         = 0x00;
const uint8_t REG_DIGIT0       = 0x01;  // до REG_DIGIT0 + 7
const uint8_t REG_DECODE_MODE  = 0x09;
const uint8_t REG_INTENSITY    = 0x0A;
const uint8_t REG_SCAN_LIMIT   = 0x0B;
const uint8_t REG_SHUTDOWN     = 0x0C;
const uint8_t REG_DISPLAY_TEST = 0x0F;

// ----------------- "ЗНАКОГЕНЕРАТОР" (ТАБЛИЦА ЦИФР) -----------------
// Биты: bit0 = G, bit1 = F, bit2 = E, bit3 = D,
//       bit4 = C, bit5 = B, bit6 = A, bit7 = DP
// Т.е.  0 1 2 3 4 5 6 7 == G F E D C B A P

const uint8_t DIGIT_FONT[10] = {
  0b01111110, // 0  = A B C D E F
  0b00110000, // 1  = B C
  0b01101101, // 2  = A B D E G
  0b01111001, // 3  = A B C D G
  0b00110011, // 4  = B C F G
  0b01011011, // 5  = A C D F G
  0b01011111, // 6  = A C D E F G
  0b01110000, // 7  = A B C
  0b01111111, // 8  = A B C D E F G
  0b01111011  // 9  = A B C D F G
};


// ----------------- НИЗКОУРОВНЕВЫЙ "SOFT SPI" -----------------

void max7219ShiftOut(uint8_t value) {
  for (int8_t bit = 7; bit >= 0; bit--) {
    digitalWrite(PIN_CLK, LOW);
    digitalWrite(PIN_DIN, (value & (1 << bit)) ? HIGH : LOW);
    digitalWrite(PIN_CLK, HIGH);
  }
}

void max7219WriteRegister(uint8_t reg, uint8_t data) {
  digitalWrite(PIN_CS, LOW);
  max7219ShiftOut(reg);
  max7219ShiftOut(data);
  digitalWrite(PIN_CS, HIGH);
}

// ----------------- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ ВРАЧА :) -----------------

// Установить "сырые" сегменты в разряде (position: 0..7)
void max7219SetRawDigit(uint8_t position, uint8_t segments) {
  if (position > 7) return;
  max7219WriteRegister(REG_DIGIT0 + position, segments);
}

// Показать одну цифру 0–9 в указанном разряде
void max7219SetDigit(uint8_t position, uint8_t value) {
  if (value <= 9) {
    max7219SetRawDigit(position, DIGIT_FONT[value]);
  } else {
    // Для всего, что не цифра — гасим разряд
    max7219SetRawDigit(position, 0x00);
  }
}

// Показать целое число (0..99999999), младший разряд — DIGIT0
void max7219ShowNumber(uint32_t number) {
  for (uint8_t pos = 0; pos < 8; pos++) {
    uint8_t digit = number % 10;
    number /= 10;

    if (number == 0 && digit == 0 && pos > 0) {
      // ведущие нули гасим
      max7219SetRawDigit(pos, 0x00);
    } else {
      max7219SetDigit(pos, digit);
    }

    if (number == 0 && pos >= 7) break;
  }
}

// ----------------- ИНИЦИАЛИЗАЦИЯ MAX7219 -----------------
// Твой порядок, адаптированный в код:
// shutdown = 0
// scan     = 7
// decode   = 0
// яркость
// test     = 0
// shutdown = 1

void max7219Init() {
  // 1. Выключаем (shutdown = 0)
  max7219WriteRegister(REG_SHUTDOWN, 0x00);

  // 2. Включаем все 8 разрядов (0..7)
  max7219WriteRegister(REG_SCAN_LIMIT, 0x07);

  // 3. Режим декодирования: 0 = используем свой "знакогенератор"
  max7219WriteRegister(REG_DECODE_MODE, 0x00);

  // 4. Яркость (0x00..0x0F) — средняя
  max7219WriteRegister(REG_INTENSITY, 0x08);

  // 5. Отключаем тестовый режим
  max7219WriteRegister(REG_DISPLAY_TEST, 0x00);

  // 6. Включаем нормальную работу (shutdown = 1)
  max7219WriteRegister(REG_SHUTDOWN, 0x01);

  // 7. Очищаем все разряды
  for (uint8_t digit = 0; digit < 8; digit++) {
    max7219SetRawDigit(digit, 0x00);
  }
}

// ----------------- ПРИМЕР ИСПОЛЬЗОВАНИЯ -----------------

void setup() {
  pinMode(PIN_DIN, OUTPUT);
  pinMode(PIN_CLK, OUTPUT);
  pinMode(PIN_CS,  OUTPUT);

  digitalWrite(PIN_CS, HIGH);
  digitalWrite(PIN_CLK, LOW);

  max7219Init();

  // Для собеседника/врача: просто "1234" на индикаторе
  max7219ShowNumber(1234);
}

void loop() {
  static int i;// Можно оставить пустым — нам важна инициализация и пример вывода
  max7219ShowNumber(i++);
  delay(1000);
}

повторю - проверил, на Меге 2560. У меня тут есть, с собой мешок всякого еще из страны исхода приволок… через таможню :wink: :wink: :wink:

Под катом промпты, если кому интересно:

Спойлер
шалом! нужен быстро тестовый пример на софт SPI для 7 сегментного индикатора на MAX7219 подключенного так:
#define pin_din 23
#define pin_clk 27
#define pin_cs 25
без доп библиотек. Мне главное выделит инициализацию, я её хочу показать собеседнику.
вот моя:
shutdoun 0
scan 7
decode 0
яркость
тест 0
shutdoun 1
-------
сделай код читаемым с хорошими именами, мой собеседник дилетант
=========================
я остановил, забыл написать, что это мега2560 в среде ардуино, если ты не догадался
=========================
нет, ну все таки добавь знакогенератор! Ну человек - врач, он с сырыми сегментами не поймет ничего! ;)
=========================
знакогенератор ошибочный!!!!!!! ну как так??????    01234567 == GFEDCBAP     Блин!


Влад, спасибо большое. Все это записал, буду анализировать. Но чуть позже. Навалилась работа, чтоб ей медузу в….

нашел свои MAX7912 ))
решил просто питание на них подать, прицепил тока два проводка, включаю, не мерцают ничего! я прям расстроился, но потыкав десяток раз вкл/выкл получил восьмерки во всех разрядах.
эх думаю, надо к ардуине цеплять, подцепил еще три проводка, и дай думаю питание подам, и о чудо стабильно светятся, причем трогая DIN и CLK можно получить разные “эффекты”.
почесал репу, покумекал собственно как битики туда могут запрыгивать? а тока по сигналу CLK
на CS и DIO тоже “антенки висят”, но без клока вы ничего туда не запихнете, даже если есть разрешение по CS.
заземлил CLK и все! эффект ушел!
теория @ЕвгенийП сработала, но еще раз, достаточно “приземлить” только CLK, тыкал раз 50, все нормально.


остается открытым утверждение

Влад дай комментарий, все таки не хочется думать

2 лайка

моему заказчику не помогло. что я еще могу сказать? у него есть электронщики свои. Но я дополнительно скину ему по CLK вопрос. Очень маловерояно, но вдруг?
Хотя причину я расписал - CS поднят и ничего не может защелкнуться.
Но повторю, что услышал твой вопрос и переадресую его обязательно, пусть попробует стяжку на землю, если вдруг не делал.

дополнительно - на Меге и у меня не моргает, а на “боевом” стенде - мограет. Но подожду ответ.

он и как все остальные, в воздухе, и чего там он нахватает, одному … известно.

ok, ждем.

мне лень в даташит лезть, по CS она переписывает, что приняла по DIN и CLK, или пока CS не LOW ей фиалетово и она игнорирует DIN и CLK?
просто если первое, не понятно как каскадность организовывать.

хотя… понятно, подобие адресных диодов, но зажигается все по CS, так?

Они – сдвиговые регистры. Пихаешь туда сколько надо, а по восходящему фронту LOAD последние 16 бит в каждой микросхеме защёлкиваются.

Datasheet

LOAD – Load-Data Input. The last 16 bits of serial data are latched on LOAD’s rising edge.

Судя по тому, как у ТС и раньше всё подряд мигало, rising edge’и там могут на ровном месте где угодно и откуда угодно нарисоваться (может у него там рядом микроволновка или двигло с искрящими щётками, кто ж его знает?), потому притянуть всё – лишним никогда не будет, что я ему и советовал.

С таким “аналитическим умом” - вам надо работать в бюро прогнозов!!! Фраза из К/Ф Москва слезам не верит.

Интеллектом явно не изуродован - из этого-же К/Ф.

На пердуинской меге аж целых ПЯТЬ таймеров, по 2 или три выхода с каждого таймера, да хоть обШИМься!!! Нет, надо повесить насос на 13 пин!

SPI аппаратный или I2C аппаратный и хоть десять любых дисплеев понавтыкай, цветных или ч/б , или оба. Зачем эти колхозные индикаторы?

Кнопки тоже по I2C прекрасно работают.

Ну, в лаптях - значит в лаптях. )))

остается открытым утверждение

Значит поциэнт был недообследован!

На первой странице датаЩЩЩей написано черным по англицки - вхен чип старт из бланкет!!!

Ну, коль на то пошло, есть специализированные микросхемы – “драйверы лицевой панели”, где по одной линии SPI можно управлять сразу чёртовой уймой светодиодов с общим чем угодно и читать десятки кнопок, не парясь о дребезге (например, MC2102, TM1668, TM1637, TM1650, TM1628, TM1629 и др.). Но ТС использует 7219, это его выбор, не вижу поводов для наезда на него.

Скорее всего это готовый проект с форума самогонщиков, этих проектов там тьма, от бомжевских и до лайкшери! Опять же, человек скорее всего обладает минимальными знаниями построения современной электроники и строением процессорных архитектур. Вы, конечно, молодцы, что так лихо помогаете ему, но(!!!) даже 12-ти летняя школота как-то сама с такими проблемами разбирается! А тут взрослый человек и такое…

Дак он не человек, а докторишка - гуманитарий.

Да, нет, науки (знания) бывают естественными и неестественными. Медицина - естественная наука.

Дет, у меня “дружбан” есть, я с ним работаю удаленно иногда, он то-ли биолог, то-ли химик, но он прекрасно “шарит” и в промэлектронике (каны, шманы, профибасы и прочее) и в механике (моторы, насосы, редуктора и прочее) !!!

Никаких готовых проектов брато не было. Естественно, читал там много чего, внямчиво обмозговывал, кой-какие идеи подцепил, но идеи, а не их решение. Свой “проект“ задумывал и делал сам. Так, как мне хочется и удобно. Кстати, он не первый, за который тут меня пинали (совершенно справедливо). Но, если что и тырил, то только здесь, а не там:). Школота может и разбирается сама, а вот мне, старому пердуну, это уже сложнее: мозги плесневеют потихоньку :). Но за лихую помощь всем помогателям жуткое мерси еще раз (без иронии)!