Это аппаратная ошибка?

Green
Offline
Зарегистрирован: 01.10.2015

Не, не, не. В первую очередь китайский "процессор". Потом уже китайская плата. И т.д. по убывающей. Кривые руки вообще не рассматриваются!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Кривые руки вообще не рассматриваются!

И кривая голова - тоже. Они же не китайские в конце концов!

Green
Offline
Зарегистрирован: 01.10.2015

Это да. Кривая голова ко всем темам подходит.)

freesdx
Offline
Зарегистрирован: 19.10.2022

Местным дегенератам посвящается: всё работает после покупки другого реле той же модели. Да, просто брак, как я и предполагал вначале

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

freesdx пишет:
Местным дегенератам посвящается: всё работает после покупки другого реле той же модели. Да, просто брак, как я и предполагал вначале

Вам же говорили...

Дим-мычъ пишет:

значит проблема с питанием или реле(что тоже может быть).

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Так глючит все же реле, а не ардуино ?
Чем тебе был плох совет прицепить диод ?
Реле глючит не сразу, а через 8 часов ?
Интересное реле....

rkit
Offline
Зарегистрирован: 23.11.2016

Классическое же "на другом форуме помогли".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
Так глючит все же реле, а не ардуино ? Чем тебе был плох совет прицепить диод ? Реле глючит не сразу, а через 8 часов ? Интересное реле....

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

freesdx пишет:

     if (xxx > 8 && xxx < 22) {
        digitalWrite(PIN_RELAY, LOW); // Включаем реле - посылаем низкий уровень сигнала
     } else {
        digitalWrite(PIN_RELAY, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
     }

Простите за глупый вопрос: А вот так (как выше написано) постоянно «долбить в лапу», даже если состояние не меняется, как? Сильно страшно или пофиг? Я что-то поймал себя на том, что последнее время так не делаю (использую флаги).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

freesdx пишет:

     if (xxx > 8 && xxx < 22) {
        digitalWrite(PIN_RELAY, LOW); // Включаем реле - посылаем низкий уровень сигнала
     } else {
        digitalWrite(PIN_RELAY, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
     }

Простите за глупый вопрос: А вот так (как выше написано) постоянно «долбить в лапу», даже если состояние не меняется, как? Сильно страшно или пофиг? Я что-то поймал себя на том, что последнее время так не делаю (использую флаги).


иголок вроде нет

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

BOOM пишет:

постоянно «долбить в лапу», даже если состояние не меняется, как? Сильно страшно или пофиг? Я что-то поймал себя на том, что последнее время так не делаю (использую флаги).

 Там delay(5000), так что... другое дело, если бы через несколько микро/ милли секунд, то, ИМХО было-бы лишним

nik182
Offline
Зарегистрирован: 04.05.2015

BOOM пишет:

freesdx пишет:

     if (xxx > 8 && xxx < 22) {
        digitalWrite(PIN_RELAY, LOW); // Включаем реле - посылаем низкий уровень сигнала
     } else {
        digitalWrite(PIN_RELAY, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
     }

Простите за глупый вопрос: А вот так (как выше написано) постоянно «долбить в лапу», даже если состояние не меняется, как? Сильно страшно или пофиг? Я что-то поймал себя на том, что последнее время так не делаю (использую флаги).

Согласен с предыдущим докладчиком ua6em . Зачем флаги и лишняя обработка, если состояние не меняется? МК железный. Ему всё равно куда колотить. А вот кода меньше и это иногда имеет значение.  

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Не не, я потому вопрос и задал. Спасибо всем ответившим.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Не не, я потому вопрос и задал. Спасибо всем ответившим.


бум, я сам как и ты заморачивался, потом глянул осилографом - иголок нет, и заморочки закончились )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BOOM пишет:

freesdx пишет:

     if (xxx > 8 && xxx < 22) {
        digitalWrite(PIN_RELAY, LOW); // Включаем реле - посылаем низкий уровень сигнала
     } else {
        digitalWrite(PIN_RELAY, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
     }

Простите за глупый вопрос: А вот так (как выше написано) постоянно «долбить в лапу», даже если состояние не меняется, как? Сильно страшно или пофиг? Я что-то поймал себя на том, что последнее время так не делаю (использую флаги).

Тут надо разделить общий случай и частный.

Если digitalWrite рассматривать как один из вариантов изменения состояния, то "долбить", конечно, не следует. Но в частном случае установки состояния пина (без какой-либо дополнительной работы), разницы нет.

 

PS. В качестве примера: если нам нужно писать в порт или ОЗУ, "долбить" вполне допустимо, а если, скажем, в EEPROM - то не следует. Не следует и в том случае, если установка нового состояния, скажем, пишется в протокол работы.

SLKH
Offline
Зарегистрирован: 17.08.2015

BOOM пишет:

freesdx пишет:

     if (xxx > 8 && xxx < 22) {
        digitalWrite(PIN_RELAY, LOW); // Включаем реле - посылаем низкий уровень сигнала
     } else {
        digitalWrite(PIN_RELAY, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
     }

Простите за глупый вопрос: А вот так (как выше написано) постоянно «долбить в лапу», даже если состояние не меняется, как? Сильно страшно или пофиг? Я что-то поймал себя на том, что последнее время так не делаю (использую флаги).

Некоторые видят повышенный износ порта PIN_RELAY из-за интенсивного трения электронов об него. Дырки образуются...

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

 Ну а если часто "долбить",  ведь так же часто и прерывания будут запрещаться,  это же может быть критично? Там, где нужны точные интервалы?

nik182
Offline
Зарегистрирован: 04.05.2015

А где здесь запрещение прерываний? Откуда они беруться и для чего используются? 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nik182 пишет:

А где здесь запрещение прерываний? Откуда они беруться и для чего используются? 

Я имел ввиду digitalWrite(), если конечно не ошибаюсь

nik182
Offline
Зарегистрирован: 04.05.2015

Нет там никаких прерываний. Это просто запись значения в регистр вывода. Если в регистре вывода тоже значение что и записывается, то никаких изменений в МК не произойдёт. Только несколько тактов пробегут.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nik182 пишет:

Нет там никаких прерываний. Это просто запись значения в регистр вывода. Если в регистре вывода тоже значение что и записывается, то никаких изменений в МК не произойдёт. Только несколько тактов пробегут.

 Возможно, я не прав, я лишь разбираюсь

Не очень ясно, что в стр№8, если можно , объяснте пжлст

А прерывания запрещаются/разрешаются  в стр №17, 25


void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Дим-мычъ пишет:

Не очень ясно, что в стр№8, если можно , объяснте пжлст

Если Вы задали неправильный номер пина, ничего не делаем.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

andriano пишет:

 Если Вы задали неправильный номер пина, ничего не делаем.

 Спасибо, не смог найти, "слабоват" ещё))

nik182
Offline
Зарегистрирован: 04.05.2015

Дим-мычъ пишет:

 Возможно, я не прав, я лишь разбираюсь

Не очень ясно, что в стр№8, если можно , объяснте пжлст

А прерывания запрещаются/разрешаются  в стр №17, 25

void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}

 

Да здесь есть запрет прерывания, но он грамотно сделан всего на несколько тактов МК. Такие короткие запреты могут вылезти только если МК будет работать на пределе загрузки другими прерываниями. В своих проектах я стараюсь не использовать digitalWrite. Есть более быстрые и занимающие куда меньше места bitClear(), bitSet(), bitWrite() и прочие битовые операции, описанные на исходном сайте https://www.arduino.cc/reference/en/

Но при использовании этих функций нет защиты от дурака, встроенной в ардуину, и надо точно понимать что делаешь.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nik182 пишет:

  надо точно понимать что делаешь.

 Да уж, верно сказано.  С  этим не всегда получается, но будем стремиться))