Arduino Uno. Танцы выходов

Новичкам не доступно. Я уже ему отписал

ОК. А со скольки?

Это у начальства уточнять нужно ))

Ну, так надо ж было где то в правилах описать. Или нет?

Да я ж не в курсе ))

Поняв.)

Однако, трактор нужен.

Кроме этого мыслей у меня никаких.

pinMode(4,OUTPUT);
digitalWrite(4, HIGH);

Никаких переходных процессов там нет.
Прежде, чем начинать бороться с проблемой, следует понять, в чем эта проблема состоит.
В данном случае - никак не в переходных процессах.

Паразитные сигналы - да, но они ни в коей мере не являются следствием переходных процессов, а возникают вследствие ошибок проектирования схемы.

Способов борьбы два.

  1. Аппаратный - правильно спроектировать схему (т.е. устранить паразитные сигналы).
  2. Программный - правильно спроектировать протокол взаимодействия МК между собой (т.е. сделать систему нечувствительной к паразитным сигналам).

В принципе для устранения проблемы достаточно даже лишь одного из двух (любого).

Тогда еще добавить задержку в начале setup ведомой программы. Собственно, этот совет уже был в сообщении №8.

Тут ключевое слово не “HEX”, а “без загрузчика”.

Так нет гарантии, что ведущий не будет перезагружаться, например, в этот момент.

if ((digitalRead (8)))
{


}

И восьмой вход в это время мне не нужен, а код выполнится.

Частично помог ответ rkit, который посоветовал объединить reset, но только частично. Гораздо лучше стало, когда в дополнение к этому я добавил защиту от дребезга. Насколько лучше - не знаю, но ошибок сегодня не было. Но это как-то больше похоже на костыли. WladDrakula в #15 предложил интересное решение, но это пока выше моего понятия.

Если RESET -ы соединены, то будут перезагружаться синхронно.

Ещё, как вариант, делал, правда только в Proteus, так:

Ведущмй, по готовности, устанавливает пин в LOW, как бы готов к передаче.
Веромый, загрузившись, и удостоверившись, что на линии LOW,
устанавливает на другой линии HIGH, - готов к приёму.
Только после этого(и при наличии этих сигналов далее)
Ведущий что-то передаёт.
Нужно по два свободных пина на каждом МК.
Аналоги сигналов DTR и DSR терминала

А вообще, может проще прикрутить внешнюю память, и, обойтись одним МК?

P.S. Например W25Q128 -SPI flash, 16MB памяти

Как-то выборочно читаешь.
Или сам не помнишь, о чем спрашивал.
Сам ведь писал, что совет ркита помог частично. Вот именно чтобы не частично, а полностью, и нужна задержка. Это будет работать только вместе с советом ркита, а не каждый совет по отдельности.

Он тебе предложил вернуться к началу, т.е. перепроектировать. Т.е. не лепить костыли и заплатки, а с самого начала переделать по уму.

Да, элементарное проектирование протокола обмена.

2ТС: не спеши что-то делать. Остановись и подумай, как оно должно работать. Сначала продумай от начала до конца логику работы, какие процессы будут происходит при перезагрузке контроллера, сообрази, какие должны быть полярности управляющих сигналов, чтобы потом не возникали всякие неожиданности, и только потом начинай что-то воплощать в жизнь.
Сначала - проектирование, потом - изготовление.

1 лайк

Ну если есть возможность обьединить ресеты, то значит контроллеры рядом, тогда дополнительно, можно оставить 1 кварц для обеих контроллеров. На первом подключение кварца оставь как есть и его 8 ногу соедини с 7 ногой второго контроллера от которого кварц вообще удали. Будет полная синхронизация тактирования.

Благодарю всех ответивших! Проблема решена.
Пины ведущего МК:
8 - сигнал на выключение кондиционера;
9 - сигнал на охлаждение;
10 - сигнал на нагрев;
11 - пин для решения проблемы. Сигналит ведомому о том, что надо принять управляющий сигнал. А после отправки сигнала сбрасывается в ноль.
Длительность каждого сигнала 2000. Вполне достаточно.
Пины ведомого МК:
8 - послать RAW-массив на ИК-диод для выключения;
9 - RAW-массив на охлаждение;
10 - RAW-массив сигнал на нагрев;
11 - приготовиться к выполнению задания на отправку кода.
13 - родной светодиод.

Скетч ведомого рабочий

#include <IRremote.h>
IRsend irsend;
bool trigger;
long int time1;
// Выключить
const unsigned int PROGMEM ConOff[211] = {8900,4400,550,1650,550,1650,550,500,550,500,550,550,550,550,550,1650,550,1650,550,1650,550,1650,550,1650,550,550,550,550,550,500,550,1650,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,500,550,500,550,1650,550,500,550,550,550,500,550,500,550,500,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,550,1650,550,550,550,1700,500,1700,550,550,500};
// Холод
const unsigned int PROGMEM ConCold[211] = {8900,4400,550,1650,550,1650,550,500,550,500,550,550,550,550,550,1650,550,1650,550,1650,550,1650,550,1650,550,550,550,550,550,500,550,1650,550,500,550,500,550,500,550,550,550,550,550,550,550,500,550,500,550,550,550,550,550,550,550,550,550,500,550,500,550,500,550,550,550,550,550,500,550,500,600,500,600,500,600,500,600,1600,600,500,600,500,550,500,600,500,600,500,600,450,600,500,600,500,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,1700,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,1700,550,550,500,1700,550,600,500,600,500,600,500,600,500,600,450,1750,500,1700,500,1700,500,1700,500,600,500,600,500,600,500,1750,500};
// Тепло
const unsigned int PROGMEM ConHeat[211] = {8830,4470,480,1720,480,1720,480,620,530,570,480,620,480,620,480,1720,480,1720,480,620,480,620,480,620,480,620,480,1720,480,620,480,620,480,1720,480,620,480,620,480,570,480,620,480,620,480,1720,530,1720,480,1720,480,620,480,620,480,570,530,570,480,620,480,620,480,620,480,620,480,620,480,570,480,620,480,620,480,620,480,620,480,1720,480,620,480,620,480,620,480,570,480,620,480,620,480,620,480,620,480,620,480,620,430,620,530,570,480,620,480,620,480,620,480,620,480,1720,480,620,480,620,480,570,530,570,480,670,430,620,480,620,480,620,480,620,480,620,480,620,430,670,430,620,480,620,480,620,480,620,480,620,430,670,430,670,430,620,480,1770,430,1770,430,670,430,670,430,620,480,620,480,620,430,670,480,620,430,670,430,670,430,620,480,1770,430,670,430,1770,430,670,430,620,480,620,480,620,480,620,480,620,430,670,430,670,430,1770,430,670,430,1770,430,670,430,670,430};
unsigned int m[211];
int cicl;
bool dopusk=0;
bool from;
void setup()
{
	pinMode(8,INPUT);
	pinMode(9,INPUT);
	pinMode(10,INPUT);
	pinMode(11,INPUT);
	pinMode(13,OUTPUT);
	digitalWrite(13,0);
	trigger=0;
	time1=millis()+500;
}
void loop()
{
	if (millis()>=time1)
	{
		time1=millis()+250;
		trigger=!trigger;
		digitalWrite(13,trigger);
	}
	from=digitalRead(11);
	if (from) delay(750);
	from=digitalRead(11);
	if (from) dopusk=1;
	if ((digitalRead(8))&&dopusk)
	{
		for (cicl=0;cicl<=210;cicl++) m[cicl]=pgm_read_word(&ConOff[cicl]);
		irsend.sendRaw(m,211,38);
	}
	if ((digitalRead(9))&&dopusk)
	{
		for (cicl=0;cicl<=210;cicl++) m[cicl]=pgm_read_word(&ConCold[cicl]);
           	irsend.sendRaw(m,211,38);
	}
	if ((digitalRead(10))&&dopusk)
	{
		for (cicl=0;cicl<=210;cicl++) m[cicl]=pgm_read_word(&ConHeat[cicl]);
		irsend.sendRaw(m,211,38);
	}
	dopusk=0;
	from=0;
}

В строке 34 опрашивается 11-й пин.
Если там единица то через 750 миллисекунд этот пин опрашивается еще раз.
И если на этот раз там единица, то устанавливается переменная dopusk в единицу.

Если часто щелкать кнопкой Reset ведущего МК, или привязывать-отвязывать USB-порт, то видно, что 13-й диод ведомого сбивается с ритма, но ложных срабатываний не происходит. Это говорит о том, что во время перезагрузки выходы все-таки пляшут. Спасибо!

Эх, не хватило немного “силы воли” без делей сделать)))

В первую очередь была попытка реализовать Вашу идею. Не получилось. И вот почему. В момент перезагрузки ведущего ведомый думает что ведущий готов, а он не готов. Что касается delay, то можно обойтись и без него, то есть не притормаживать цикл void loop(). Но все равно надо вычислить время устойчивого присутствия высокого уровня на 11-ом пине.

А тут еще родилась идея. Но знаний явно не хватает. И возможно ли ее воплотить? И где копать, если возможно?
В моем проекте на передачу сигнала задействовано три пира: 8,9 и 10. А можно ли обойтись одним выходным пином? То есть ведущий передает ведомому по одному проводу команды: 1,2,3.
И если можно, тогда сделать по такому сценарию.
Ведущий дает команду ведомому например 3 (включить обогрев). Ведомый выбирает число случайным образом, например 123, и говорит ведущему: “дай мне число 123, тогда выполню”, ведомый отвечает числом 123, ведущий выполняет команду.

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

Если ресет-ы соединены, и есть задержка в сетапе, да МК прошит без загрузчика - ведомый ничего не может думать.
Вообще, на будущее, желательно выкладывать полную схему устройства, иначе можно долго разговаривать впустую.
Возможно , нужно было лишь добавить один резистор)).

А в целом, ИМХО, лучше делать проще. Это будет надёжнее.
Я о том, что загрузить массив из SPI FLASH/EEPROM памяти, и не надо второго МК

Почему бы нет? Почитайте про 1-Wire, например

Ресеты уже не соединины. Защита от дребезга убрана.

В EEPROM не хватит места для трех массивов. В каждом массиве 211 элементов типа unsigned int. 3 x 211 x 2 = 1266 байт. В дальнейшем, надеюсь, перейду на ESP32, но там тоже будет куча вопросов. Радует, что с Arduino UNO стал как-то разбираться. Проект работает, а это для меня уже огромный успех, хотя для кого-то - семечки.