Ошибка в блоке демультиплексора DMS

Глобальные переменные меняют значения

В данный форум модератором или автором переносятся темы из других форумов после исправления описанной ошибки во время работы над новой версией. Результаты исправления появятся в ближайшем релизе.
Ответить
bamik
Рядовой
Сообщения: 8
Зарегистрирован: 14.02.2018{, 01:20}
Репутация: 0
Имя: Андрей

Ошибка в блоке демультиплексора DMS

#1

Сообщение bamik » 06.04.2018{, 10:35}

Вот что генерируется при демультиплексоре на 5 выходов:
if((_gtv9 == 0)){_dms1Q0 = _gtv11;} else {_dms1Q0 = 0;}
if((_gtv9 == 1)){_dms1Q1 = _gtv11;} else {_dms1Q1 = 0;}
if((_gtv9 == 2)){_dms1Q2 = _gtv11;} else {_dms1Q2 = 0;}
if((_gtv9 == 3)){_dms1Q3 = _gtv11;} else {_dms1Q3 = 0;}
if((_gtv9 == 4)){_dms1Q4 = _gtv11;} else {_dms1Q4 = 0;}
_gtv3 = _dms1Q4;
_gtv5 = _dms1Q3;
_gtv4 = _dms1Q2;
_gtv2 = _dms1Q1;
_gtv1 = _dms1Q0;

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

Изменил скетч на следующую конструкцию:

if((_gtv9 == 0)){_gtv1 = _gtv11;}
if((_gtv9 == 1)){_gtv2 = _gtv11;}
if((_gtv9 == 2)){_gtv4 = _gtv11;}
if((_gtv9 == 3)){_gtv5 = _gtv11;}
if((_gtv9 == 4)){_gtv3 = _gtv11;}

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

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Ошибка в блоке демультиплексора DMS

#2

Сообщение Sancho » 06.04.2018{, 10:44}

bamik,
Это не ошибка - так работает настоящий демультиплексор.
А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
СпойлерПоказать
2018-04-06_10-43-13.png
2018-04-06_10-43-13.png (9.27 КБ) 1805 просмотров
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Ошибка в блоке демультиплексора DMS

#3

Сообщение pan » 06.04.2018{, 10:47}

СпойлерПоказать
Изображение
переключатель, насколько я понимаю, переключает сигнал на нужный выход, отключая тот который был.
то есть на других не должно быть ни чего. думаю если брать во внимание дословное название блока, то он работает правильно.
ваша конструкция по полученному функционалу больше напоминает меню.
bamik писал(а):
06.04.2018{, 10:35}
Меняется только та глобальная переменная, которая была выбрана.
этот блок чаще используется для передачи некой переменной в разные места схемы по выбору.

я так думаю. может не прав.

KSP
Лейтенант
Сообщения: 304
Зарегистрирован: 18.09.2015{, 14:00}
Репутация: 28
Откуда: Саратов
Имя: Сергей

Ошибка в блоке демультиплексора DMS

#4

Сообщение KSP » 06.04.2018{, 11:11}

Не совсем понятно ("сделать свой блок с вариантным числом входов"), это уже будет не демультиплексор.
https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BE%D1%80
S

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

Ошибка в блоке демультиплексора DMS

#5

Сообщение dizzyy » 06.04.2018{, 15:14}

bamik писал(а):
06.04.2018{, 10:35}
if((_gtv9 == 0)){_gtv1 = _gtv11;}
if((_gtv9 == 1)){_gtv2 = _gtv11;}
if((_gtv9 == 2)){_gtv4 = _gtv11;}
if((_gtv9 == 3)){_gtv5 = _gtv11;}
if((_gtv9 == 4)){_gtv3 = _gtv11;}
если пройтись по всем выходам , то во всех переменных будет _gtv11 даже если выход неактивный ..
а else {_dms1Q0 = 0;} обнуляет после смены состояния

bamik
Рядовой
Сообщения: 8
Зарегистрирован: 14.02.2018{, 01:20}
Репутация: 0
Имя: Андрей

Ошибка в блоке демультиплексора DMS

#6

Сообщение bamik » 06.04.2018{, 18:40}

Sancho писал(а):
06.04.2018{, 10:44}
Это не ошибка - так работает настоящий демультиплексор.
У настоящего демультиплексора обычно нет третьего состояния.
В данном случае речь идет о передаче данных от одной глобальной переменной в какую-либо другую по входу выбора. При этом значения других переменных меняться не должны. Ни в 0, ни во что-либо другое. А конструкция, что Вы предлагаете, слишком громоздка. Сожрет кучу памяти.

Отправлено спустя 5 минут 15 секунд:
dizzyy, выполнится только одно условие, потому изменится только одна переменная. А еще точнее, я совершенно не понял, что Вы хотели сказать.

Отправлено спустя 16 минут 15 секунд:
Согласно справочным данным 74138, на неактивных выходах реального демультиплексора присутствует 1, эквивалентом которой в программном демультиплексоре будет являться отсутствие какого-либо присваивания. Обнулять же глобальные переменные требуется только в том случае, если они не были проинициализированы. Извините, но я учил программирование в конце 80х - начале 90х, но уже тогда инициализация переменных в теле программы было дурным тоном.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Ошибка в блоке демультиплексора DMS

#7

Сообщение Sancho » 06.04.2018{, 19:14}

bamik писал(а):
06.04.2018{, 19:01}
У настоящего демультиплексора обычно нет третьего состояния.
Где Вы видите состояние Z???
bamik писал(а):
06.04.2018{, 19:01}
А конструкция, что Вы предлагаете, слишком громоздка. Сожрет кучу памяти.
Скомпилируйте и посмотрите, сравните со своим кодом. (Очень напоминает "дело Скрипаля")
bamik писал(а):
06.04.2018{, 19:01}
Согласно справочным данным 74138, на неактивных выходах реального демультиплексора присутствует 1, эквивалентом которой в программном демультиплексоре будет являться отсутствие какого-либо присваивания. Обнулять же глобальные переменные требуется только в том случае, если они не были проинициализированы.
Но никак не последнее состояние!!! А ноль или один - не принципиально. Проинвертируйте вход и выходы - получите 74138.
Отличие глобальной от локальной переменной в данном случае неочевидны и ничего не требует.
Вы немного подзабыли, наверное....
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

bamik
Рядовой
Сообщения: 8
Зарегистрирован: 14.02.2018{, 01:20}
Репутация: 0
Имя: Андрей

Ошибка в блоке демультиплексора DMS

#8

Сообщение bamik » 06.04.2018{, 20:03}

Sancho, Вам поспорить не о чем? Рисовать предлагаемую Вами конструкцию как минимум не продуктивно. Данная среда программирования направлена на людей владеющих логикой, но отдаленно программированием. Насколько я понимаю, объявляемые переменные в окне вводов, выводов и переменных - глобальные. И случайное их изменение - ошибка. А данный блок демультиплексора именно к этому и ведет. В его описании сказано, что он направляет входное значение на выбранную переменную. Но ни слова о том, что остальные при этом обнулятся. Если бы это было сказано, то это уже была бы не ошибка, а фича. Геморная, правда. Но уже тогда можно было бы искать пути обхода.
Sancho писал(а):
06.04.2018{, 19:14}
А ноль или один - не принципиально.
С точки зрения электроники как раз принципиально. 0 - это открытый транзистор на выходе, и из него уже не сделаешь 1 в данной точке схемы. А вот 1 - это сопротивление к питанию, потому можно другим транзистором в данной точке сделать 0. (Разговор о ТТЛ логике.) Именно поэтому я говорил, что 1 на выводе микросхемы соответствует отсутствию присваивания в программе.

Отправлено спустя 21 минуту 4 секунды:

Код: Выделить всё

 if (_gtv6)
{ if (!(_RTCST_Ost1))
{set3231Date(0x68, &_RTC1, 0, (_gtv2), (_gtv1), (_gtv4), (_gtv5), (_gtv3), -1);
get3231Date(0x68, &_RTC1);
_RTCST_Ost1 = 1;
}}
 else
{ _RTCST_Ost1 = 0;}
Вот что сгенерировалось по Вашему предложению. Выглядит красиво. Но вызываются функции. Их содержимое я не знаю. Будут ли они короче 5 строчек с if?

Отправлено спустя 1 минуту 17 секунд:
Если будет, то что мешало и тело демультиплексора построить по такой схеме?

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Ошибка в блоке демультиплексора DMS

#9

Сообщение Sancho » 06.04.2018{, 20:36}

bamik,
Откуда взялся такой код????????????????
Попробуйте, если лень рисовать, нажать кнопку компиляция, даже файл прикрепил, для Вас....
bamik писал(а):
06.04.2018{, 20:24}
С точки зрения электроники как раз принципиально. 0 - это открытый транзистор на выходе, и из него уже не сделаешь 1 в данной точке схемы. А вот 1 - это сопротивление к питанию, потому можно другим транзистором в данной точке сделать 0. (Разговор о ТТЛ логике.) Именно поэтому я говорил, что 1 на выводе микросхемы соответствует отсутствию присваивания в программе.
Чудесные элементы любой логики - OR....... )))
Вложения
Для теста bamik 1.flp
(96.69 КБ) 98 скачиваний
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Ошибка в блоке демультиплексора DMS

#10

Сообщение pan » 06.04.2018{, 20:49}

bamik писал(а):
06.04.2018{, 20:25}
В его описании сказано, что он направляет входное значение на выбранную переменную. Но ни слова о том, что остальные при этом обнулятся.
ну что ж . повторимПоказать
Изображение
он переключает на один из выходов.
bamik писал(а):
06.04.2018{, 20:25}
направлена на людей владеющих логикой
вот именно. для людей не знакомых с программированием, переключатель, он и в африке переключатель.
и если к переключателю прицепить лампочки, светить будет только одна, другие погаснут.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Ошибка в блоке демультиплексора DMS

#11

Сообщение Sancho » 06.04.2018{, 21:00}

pan писал(а):
06.04.2018{, 20:49}
светить будет только одна, другие погаснут.
Точно, и ни одна из лампочек не запомнит, что она, перед переключением, была включена!
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Ошибка в блоке демультиплексора DMS

#12

Сообщение Labu559 » 06.04.2018{, 21:53}

bamik писал(а):
06.04.2018{, 10:35}
К сожалению я еще совсем неопытен, чтобы сделать свой блок с вариантным числом входов
Если я правильно понял, то Вам должна подойти такая конструкция
СпойлерПоказать
_gtv11= variable state1; // 1-й вход (состояние 1)
_gtv12= variable state2; // 2-й вход (состояние 2)
/* previos_gtv9- предыдущее состояние переключающего входа _gtv9,
*или маркер последнего изменнённого выхода _gtv1..._gtv5
*/
byte previos_gtv9;
//Ваша конструкция без проверки всех условий (до первого совпадения)
switch (_gtv9)
{
case 1:
_gtv1 = _gtv11;
break;
case 2:
_gtv2 = _gtv11;
break;
case 3:
_gtv3 = _gtv11;
break;
case 4:
_gtv4 = _gtv11;
break;
case 5:
_gtv5 = _gtv11;
break;
default:
if (previos_gtv9!= _gtv9) // Возвращаем значение последнего изменённого выхода в состояние 2 (предыдущее состояние)
{
switch (previos_gtv9)
{
case 1:
_gtv1 = _gtv12;
break;
case 2:
_gtv2 = _gtv12;
break;
case 3:
_gtv3 = _gtv12;
break;
case 4:
_gtv4 = _gtv12;
break;
case 5:
_gtv5 = _gtv12;
break;
}
previos_gtv9= _gtv9;
}
При просмотре теряется структура (табуляция) файла, в редакторе- нет.

bamik
Рядовой
Сообщения: 8
Зарегистрирован: 14.02.2018{, 01:20}
Репутация: 0
Имя: Андрей

Ошибка в блоке демультиплексора DMS

#13

Сообщение bamik » 07.04.2018{, 05:37}

Sancho писал(а):
06.04.2018{, 21:00}
Точно, и ни одна из лампочек не запомнит, что она, перед переключением, была включена!
Переменные не лампочки, они помнят.
Жаркий спор разгорелся на пустом месте.
А собственно вопрос состоит в том, чтобы в программе FLProg был блок с вариантным количеством выходов, который бы присваивал одно значение одной выбранной переменной, не затрагивая другие. Это было бы удобно. Вариант из сборных конструкций - от "бедности".
Sancho писал(а):
06.04.2018{, 20:36}
Откуда взялся такой код????????????????
Я создал платку со схемой, которую Вы мне нарисовали в своем первом посту. И, однако таки, нажал на кнопочку "компиляция". Код из Arduino IDE, который скомпилировался.
Ничего от себя я не добавлял.

Отправлено спустя 10 минут 30 секунд:
if ((_gtv2) == (2)) {
_gtv5 = _gtv1;
}
if ((_gtv2) == (1)) {
_gtv4 = _gtv1;
}
if ((_gtv2) == (0)) {
_gtv3 = _gtv1;
}
if ((_gtv2) == (3)) {
_gtv6 = _gtv1;
}
Вот что выдала Ваша платка. Наверное, компилятор сам выбирает конструкцию в зависимости от текущей ситуации.
И этот код ничем не отличается от моего кода в самом первом посту.
Приклепляю свои конструкции. Можете убедиться, что я не поленился собрать Вашу конструкцию.
Вложения
myENCDR4_(CODE).ubi
Блок энкодера.
(34.62 КБ) 82 скачивания
Проба работы с часами и энкодером.flp
(451.07 КБ) 84 скачивания

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Ошибка в блоке демультиплексора DMS

#14

Сообщение Sancho » 07.04.2018{, 09:04}

bamik писал(а):
07.04.2018{, 05:48}
И этот код ничем не отличается от моего кода в самом первом посту.
Sancho писал(а):
06.04.2018{, 10:44}
А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
Так я Вам об этом и говорил - а Вы мне об раздутии, увеличении веса проги...
bamik писал(а):
06.04.2018{, 19:01}
Сожрет кучу памяти.
Если Вы занимаетесь кодо-водством - зачем Вам FLProg? Ещё и писать - баги блока...
bamik писал(а):
07.04.2018{, 05:48}
А собственно вопрос состоит в том, чтобы в программе FLProg был блок с вариантным количеством выходов, который бы присваивал одно значение одной выбранной переменной, не затрагивая другие. Это было бы удобно. Вариант из сборных конструкций - от "бедности".
Пожелания о новых блоках - в другой теме. Там-же, где я жду modulo, давно.....
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Ошибка в блоке демультиплексора DMS

#15

Сообщение support » 17.06.2018{, 19:55}

Ну вообще то это именно переключатель. Примерно вот такая бандура
Переключатель.jpg
то есть когда выход отключён, то на нём 0 вольт (ну и у меня ноль становится). так что всё в принципе логично.

Хотя возможно я и не прав. На всякий случай сделал галочку в свойствах блока
Снимок.PNG
Снимок.PNG (10.81 КБ) 1560 просмотров
при её установке после переключения на отключенных выходах будет оставаться последнее значение.

Ждите новый релиз программы
Автор программы FLProg.

Ответить

Вернуться в «Выполненно»