jcxz писал(а):
Да даже элементарно: у человека на халате пояс развязался и при входе в ванную мотанулся вперёд, на обратном качании прилипнув к телу. Уже получается как будто зашли двое.
Нет, посчитает, как одного.
Неправда.
Massaraksh7 писал(а): Чт июн 18, 2026 13:13:26Я вижу, тут описание алгоритма мало кто читает. И отвечают собственным представлениям.
Прочитали. И не нашли ничего, что решало бы вышеозвученные проблемы.
А впустую сказать "у меня всё работает" может любой.
Вот здесь я захожу, выставив перед собой руку. Так что сначала она пересекает барьер, потом я. И выхожу - свет выключается. Этого достаточно? https://cloud.mail.ru/public/wmSx/5MD28vPVg
Massaraksh7 писал(а): Чт июн 18, 2026 14:10:14Скетч дополнен блоком, симулирующим ждущий мультивибратор с перезапуском, остальное всё почти, как было, только теперь всё на прерываниях.
Что тут можно сказать по поводу этого кода? Мрак и ужас!... Это самое мягкое.
Автор никогда не слышал такого слова как "оптимизация". Про побитовые операции тоже не слышал. int-ы - везде, где не нужно и это на дохлом 8-битнике, а не ARM!
Это уж не говоря о стиле написания: "magic numbers", отсутствие "const" где нужно и прочие перлы чайников...
Massaraksh7 писал(а): Чт июн 18, 2026 14:10:14
//---Прочитать состояние входов и записать в буфер
void ReadAndShift() {
m1[2]=m1[1];m1[1]=m1[0];m1[0]=sign1;
m2[2]=m2[1];m2[1]=m2[0];m2[0]=sign2;
if (sign1==0) digitalWrite(FB1,LOW); else digitalWrite(FB1,HIGH);
if (sign2==0) digitalWrite(FB2,LOW); else digitalWrite(FB2,HIGH);
}
Здесь - двойные чтения sign1,sign2. Зачем??? Не уверен, что при этом будет правильно работать.
PS: Или в Ардуине нет 8-битных переменных?
Зачем везде int?
Последний раз редактировалось jcxz Пт июн 19, 2026 13:52:07, всего редактировалось 2 раза.
Massaraksh7 писал(а): Пт июн 19, 2026 13:37:59
Вот здесь я захожу, выставив перед собой руку. Так что сначала она пересекает барьер, потом я. И выхожу - свет выключается. Этого достаточно?
И как же он выключается, если судя по вашему же описанию, в счётчике должно остаться +1 ?
jcxz писал(а): Пт июн 19, 2026 13:45:54
Опять же - МК = 8-битный (или ошибаюсь?), а переменные все == int. И чтение/модификация их происходит в разных перекрывающихся ISR. Автор слыхал о таком понятии как "атомарность доступа"? Как именно обеспечивается атомарность работы с длинными переменными в вашем коде на 8-битном МК?
Massaraksh7 писал(а): Пт июн 19, 2026 13:53:24
Ага, а это стёрли. )))
Ага. Не думал, что кто-то в здравом уме станет на 8-битном МК для хранения значений 0 или 1 использовать int.
Это для чего? Чтобы как можно сильнее затормозить программу?
Massaraksh7 писал(а): Пт июн 19, 2026 13:54:37А для этого надо в коде разбираться внимательнее. )))
Не в чём там разбираться. Работать будет произвольно - от любого болтающегося элемента одежды счётчик будет изменяться произвольно. И свет будет или преждевременно гаснуть или оставаться включённым после ухода.
В мусорку.
Massaraksh7 писал(а): Пт июн 19, 2026 13:37:59
Вот здесь я захожу, выставив перед собой руку. Так что сначала она пересекает барьер, потом я. И выхожу - свет выключается.
Долго тренировались прежде чем удалось так снять, чтобы сработало правильно?
Massaraksh7 писал(а): Пт июн 19, 2026 13:53:24
Ага, а это стёрли. )))
Ага. Не думал, что кто-то в здравом уме станет на 8-битном МК для хранения значений 0 или 1 использовать int.
Это для чего? Чтобы как можно сильнее затормозить программу?
Есть принцип достаточности. В данном случае от использования int вместо byte или Boolean (не уверен, что они тут так называются, не помню, я, так-то, последние 30 лет на Паскале работаю) программа не затормозится насколько, чтобы потерять работоспособность.
jcxz писал(а): Пт июн 19, 2026 14:02:18
Долго тренировались прежде чем удалось так снять, чтобы сработало правильно?
Я Вам не буду ничего доказывать. Если Вы не в состоянии прочитать 100 строк кода, и понять, за счёт чего не происходит двойное срабатывание - это Ваши проблемы, не мои.
roman.com писал(а): Пт июн 19, 2026 14:15:03
Там задержка стоит 2 секунды.
Поэтому нет ложных срабатываний.
Тогда двое могут зайти и это посчитается как один. И когда один выйдет, а второй останется - он останется в темноте.
Только автор виыше уверял, что такое невозможно.
Там весь "код" - сплошные "magic numbers". Это называется г*внокод. Никто в здравом уме не станет пересчитывать все эти такты в секунды. Код должен быть читаемым.
Последний раз редактировалось jcxz Пт июн 19, 2026 14:22:09, всего редактировалось 1 раз.
Massaraksh7 писал(а): Пт июн 19, 2026 14:25:16Ну да, первый признак, что обосрался - это употребление термина "говнокод".
Вот roman.com, почему-то, увидел )))
//---Прерывание таймера 1 канала
ISR(TIMER1_COMPA_vect) {
sign1=1;
}
//---Прерывание по переднему фронту 1 канала
void cannal_1() {
sign1=0;
TCNT1=0;
}
Уже видите где вы здесь обосрались?
Massaraksh7 писал(а): Пт июн 19, 2026 14:25:16Ну да, первый признак, что обосрался - это употребление термина "говнокод".
Я выше привёл множество вопросов к вашему "коду". Будут какие-то ответы по существу? Или только ЧСВ своё чесать способны?
jcxz писал(а): Пт июн 19, 2026 14:27:50
Я выше привёл множество вопросов к вашему "коду". Будут какие-то ответы по существу? Или только ЧСВ своё чесать способны?