Почему мигает светодиод?

Коллеги, приветствую.
Давно пытаюсь запустить ардуинку в режиме сервера ModBusRTU и RS485. Все вроде как ОК работает, но есть проблема даже outp[4] = 1; приводит к миганию светодиода. Светодиоды подключены через сдвиговый регистр 74hc595. Если выкинуть функцию modbus_update(); то все ок. Подключение с ПК ModBusPool работает нормально. Железо работает получается норм, проблема видимо в коде, библиотеки ModBus пробовал разные, но результат одинаковый. В чем причина мигания светодиода?

#include <GyverShift.h>
#include <SimpleModbusSlave.h>

#define CLK_595 9
#define CS_595 11
#define DAT_595 12
GyverShift<OUTPUT, 1> outp(CS_595, DAT_595, CLK_595);

enum 
{     
  // The first register starts at address 0
  bt_1,     
  bt_2,
  bt_3,
  bt_4,
  bt_5,
  bt_6,
  bt_7,
  bt_8,
  bt_9,
  bt_10,
  bt_11,
  bt_12,
  bt_13,
  led_1,
  led_2,
  led_3,
  led_4,
  led_5,  
  HOLDING_REGS_SIZE // leave this one
  // total number of registers for function 3 and 16 share the same register array
};
unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array

void setup() {
    modbus_configure(&Serial, 19200, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);

  // modbus_update_comms(baud, byteFormat, id) is not needed but allows for easy update of the
  // port variables and slave id dynamically in any function.
  modbus_update_comms(19200, SERIAL_8N2, 1);
  //Serial.begin(19200);
}

void loop() {
    int sensorValue = analogRead(A0);

    // 1014 отключение
    // 923 отключить звук
    // 846 сброс
    // 780 тест
    // 724 остановка пуска
    modbus_update();
    if (sensorValue > 1000 && sensorValue < 1020) holdingRegs[bt_1] = 1;
    else holdingRegs[bt_1] = 2;
    if (sensorValue > 920 && sensorValue < 930) holdingRegs[bt_2] = 1;
    else holdingRegs[bt_2] = 2;
    if (sensorValue > 840 && sensorValue < 850) holdingRegs[bt_3] = 1;
    else holdingRegs[bt_3] = 2;
    if (sensorValue > 775 && sensorValue < 785) holdingRegs[bt_4] = 1;
    else holdingRegs[bt_4] = 2;
    if (sensorValue > 720 && sensorValue < 730) holdingRegs[bt_5] = 1;
    else holdingRegs[bt_5] = 2;
    
    if (holdingRegs[led_1] == 1) outp[1] = 1;
    else outp[1] = 0;
    if (holdingRegs[led_2] == 1) outp[2] = 1;
    else outp[2] = 0;
    if (holdingRegs[led_3] == 1) outp[3] = 1;
    else outp[3] = 0;
    
    outp[4] = 1;
    outp.update();
    
    delay(500);
}

Какого такого светодиода? В программе нет светодиодов!

а Serial?

Это да. Ведь никто же не говорит куда/к чему подключен светодиод.)

Да не! Говорят. Вот только сдвиговый регистр это такая стрёмная вещь что к нему надо аккуратно подходить. А Гайвер что там намутил не понятно. Не бывает так, что бы сам по себе моргал, особенно с делеем в пол секунды в основном цикле.

Ну почему же! Постоянно люблю что бы у заказчика мигал светодиод. Это показатель того что с фьзами всё ОК и всё работает. А выглядит всего то:

every(500)
  tooggle(LED);

У меня нет заказчиков :sleepy: но в моих поделках они моргают всегда.

Да. Зачастую это признак работоспособности.) Я так тоже поступаю.
Жена: у тебя либо лампочка, либо выключатель не работает.
А тут сразу и видно.)

Ага к сдвиговому подключены они. А как еще размножить выходы? Проблема в том что если убрать все касаемое модбаса и оставить только гуверовскую либу, то баг уходит и светодиод светит нонстопом.

Не может модбас влиять на регистр. Он использует ного 0 1 и они ни как не связаны с регистром. Регистр может моргать, когда у него идет непрерывная перезапись или на входе !OE моргает уровень. Куда у тебя подключён !ОЕ?

Судя по всему речь о 13 пине. Он никуда не подключен.

Спасибо! надо было подтянуть пины на питание и 0 =)
С меня пивас. Реквизиты в личку жду.

Пожалуйста. Вопрос совсем мелкий, не стоит мат. затрат :wink:

Офигеть! Мелочь, но приятно.) Все бы так.)

Приветствую! Так я всего то пивас предлагаю, не затраты же)

1 лайк

Напрограммируем на пивас, тогда и сочтёмся. Задавай ещё вопросы.

2 лайка