Почему загораются рандомные светодиоды?

На первый взгляд работает всё как надо, вводим в монитор порта номер светодиода и он загорается на несколько секунд. Но почему-то при включении платы, например после пропадания электричества, сначала рандомно загораются светодиоды, пока не подадим первую команду в монитор порта. Как избавиться от этого паразитного явления ? Я сам скетчи писать не умею, код мне помог написать форумчанин, но он не знает как избавиться от этого эффекта. Пробовали в сетап добавить строки выключающие светодиоды сразу после включения платы и да, они выключаются, но сам факт что они продолжают рандомно включаться на доли секунд портит всё. Дело в том, что вместо светодиодов у меня подключены замки на соленоидах и они успевают открыться за эти доли секунд :exploding_head:

#define SER 11 
#define LATCH 12
#define CLK 13 
#define REGNUMBER 3 

unsigned long last_time=0;
void setup()
{
Serial.begin(9600);
pinMode(SER, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}

void loop()
{
  unsigned long time;
  time = micros();
  if (Serial.available() > 0) {
	last_time = time;
    int lamp = Serial.parseInt();
    int reg = (lamp-1) / 8;
    int byte = 1 << ((lamp-1) % 8 );


    digitalWrite(LATCH, LOW); 

        for (int i=0;i<REGNUMBER-reg;i++)
        {
          shiftOut(SER, CLK, LSBFIRST, 0);
        }
    
        shiftOut(SER, CLK, LSBFIRST, byte);
        for (int i=0;i<reg;i++)
        {
          shiftOut(SER, CLK, LSBFIRST, 0);
        }
    digitalWrite(LATCH, HIGH);
  }  else if ((last_time>0) and (time-last_time>4000000)){
        last_time = 0;
        digitalWrite(LATCH, LOW); 

        for (int i=0;i<REGNUMBER;i++)
        {
          shiftOut(SER, CLK, LSBFIRST, 0);
        }
    
    digitalWrite(LATCH, HIGH);
  }
  
}

Научиться” не предлагать? Я правильно понимаю?

1 лайк

Ага, судя по лайку – правильно.

Хорошо, тогда есть другое предложение. Почитать даташит используемого сдвигового регистра и подключить его правильно. Например, использовать пин OE по назначению – для включения и выключения выходов, а не тупо сажать его на землю, оставляя выходы вечно включёнными.

2 лайка

Благодарствую за направление в какую сторону надо копать :+1:

Улыбнуло) Нет, не так… я ржу!!!:rofl:
Причём все телодвижения по обнулению регистра лучше бы осуществлять в самую первую очередь в Setup, до инициализаций всего остального.
Как вариант использовать RC-цепь на вывод ОЕ, чтоб гарантированно был запрещён выход на нужное для запуска кода время.

2 лайка

можете в скетч добавить нужные строки за 500р ?

Не надо в скутче ни чего править. Не поможет это. Вам же сказали, поставте на OE вывод микросхемы 74HC595 RC цепочку ёмкомтью на плюс резистором на минус. Думаю керамики 0,1 мкФ и резистора 1кОм вполне хватит (средняя точка на ОE - 13 нога)

1 лайк

Лучше книгу купи по Си или по МК, толку больше будет.
Просто между OE и землёй резистор на 10-20кОм воткни, и между OE и плюсом питания конденсатор на пару микрофарад(это от балды, надо считать). На пару секунд после включения выходы регистра будету отключены.
@SAB опередил)
Калькулятор говорит что при 10кОм и 1мкФ постоянная будет 10мс.

1 лайк

так что ли ?

Ага, типа того. Главное чтоб эта цепь “держала”, пока код не запишет в регистр то что должен записать.

Если скетч прошивается собственным загрузчиком - не поможет: там после включения/перезагрузки работает загрузчик - примерно 1 секунду ждет, не соберется его кто-нибудь прошивать. Если за секунду не успел - передает управление скетчу.
Нужно прошивать программатором со стиранием загрузчика, тогда скетч будет работать сразу после включения.

1 лайк

Если свободных пинов достаточно, то я бы оставил управление ОЕ за микроконтроллером.
А чтобы не лезла ерунда на выходы при старте - притянул бы ОЕ к питанию резистором 10к
(то есть наоборот к предыдущим советам)

3 лайка

Тогда уж ёмкость выкинуть. Но это лишний провод тянуть, и код править. А так, у него всё работает, не вижу в этом смысла.

конечно

Хотя тоже не известно при включении контроллера, что у него будет в первые милисеунды на выходе. Скорее всего может и 0 оказаться на управляющем выходе. И ни какая подтяжка не сработает. А вот цепочка даст гарантированную задержку, когда уже из сетапа можно будет начать управлять регистром.

Как это неизвестно? Там будет HiZ. Я тоже плюсую b707, если есть свободная нога, то управлять ей.

Это вами лично проверено? Пути Переходных процессов неисповедимы.

Нет, об этом производитель говорит. Вот, например:

Иначе, представьте ситуацию - У вас некоторые из портов подключены напрямую к питанию или земле. И вот, во время неисповедимых переходных процессов на них появиться 0 или 1? Что произойдёт?

То, что происходит у ТС.
Ни один производитель не даст гарантию на выход контроллерных напряжений на пинах на бесконечно малом отрезке времени, пока фронт напряжения источника питания растёт от 0 до номинала. А этот отрезок у разных блоков питания тоже очень сильно отличается. Вот мы про это и говорим. Транзисторы выходных каскадов контроллеров выдерживают мгновенные перегрузки, даже если будет конфликтная ситуация 0/1. А вот регистры могут воспринять это не однозначно. И опять ТС получит такой же эффект. Но когда будет стоять RC, то заряд ёмкости будет нарастать пропорционально с нарастанием напряжения питания, и выходы регистров будут в закрытом состоянии. ИМХО я за RC.

Я подозреваю что переходные процессы учтены на физическом уровне.
По крайней мере осциллограф в ждущем режиме не видит ничего абсолютно.
Все модули и регистры принудительно в нуле некоторое гарантированное время. Ежели питание нарастает медленно, то для этого существует второй эшелон защиты. Это BOD.