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

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

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

Сообщение bamik »

Вот что генерируется при демультиплексоре на 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 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

[ref]bamik[/ref],
Это не ошибка - так работает настоящий демультиплексор.
А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
[spoiler]
2018-04-06_10-43-13.png
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

[spoiler]Изображение[/spoiler]
переключатель, насколько я понимаю, переключает сигнал на нужный выход, отключая тот который был.
то есть на других не должно быть ни чего. думаю если брать во внимание дословное название блока, то он работает правильно.
ваша конструкция по полученному функционалу больше напоминает меню.
bamik писал(а): 06 апр 2018, 10:35Меняется только та глобальная переменная, которая была выбрана.
этот блок чаще используется для передачи некой переменной в разные места схемы по выбору.

я так думаю. может не прав.
KSP
Лейтенант
Сообщения: 305
Зарегистрирован: 18 сен 2015, 14:00
Откуда: Саратов
Имя: Сергей
Поблагодарили: 1 раз

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

Сообщение KSP »

Не совсем понятно ("сделать свой блок с вариантным числом входов"), это уже будет не демультиплексор.
https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BE%D1%80
S
Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24 ноя 2017, 16:25
Откуда: Червоноград
Имя: Марьян

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

Сообщение dizzyy »

bamik писал(а): 06 апр 2018, 10:35if((_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 фев 2018, 01:20
Имя: Андрей

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

Сообщение bamik »

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

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

Отправлено спустя 16 минут 15 секунд:
Согласно справочным данным 74138, на неактивных выходах реального демультиплексора присутствует 1, эквивалентом которой в программном демультиплексоре будет являться отсутствие какого-либо присваивания. Обнулять же глобальные переменные требуется только в том случае, если они не были проинициализированы. Извините, но я учил программирование в конце 80х - начале 90х, но уже тогда инициализация переменных в теле программы было дурным тоном.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

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

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

Сообщение bamik »

[ref=#ff8000]Sancho[/ref], Вам поспорить не о чем? Рисовать предлагаемую Вами конструкцию как минимум не продуктивно. Данная среда программирования направлена на людей владеющих логикой, но отдаленно программированием. Насколько я понимаю, объявляемые переменные в окне вводов, выводов и переменных - глобальные. И случайное их изменение - ошибка. А данный блок демультиплексора именно к этому и ведет. В его описании сказано, что он направляет входное значение на выбранную переменную. Но ни слова о том, что остальные при этом обнулятся. Если бы это было сказано, то это уже была бы не ошибка, а фича. Геморная, правда. Но уже тогда можно было бы искать пути обхода.
Sancho писал(а): 06 апр 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 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

[ref]bamik[/ref],
Откуда взялся такой код????????????????
Попробуйте, если лень рисовать, нажать кнопку компиляция, даже файл прикрепил, для Вас....
bamik писал(а): 06 апр 2018, 20:24С точки зрения электроники как раз принципиально. 0 - это открытый транзистор на выходе, и из него уже не сделаешь 1 в данной точке схемы. А вот 1 - это сопротивление к питанию, потому можно другим транзистором в данной точке сделать 0. (Разговор о ТТЛ логике.) Именно поэтому я говорил, что 1 на выводе микросхемы соответствует отсутствию присваивания в программе.
Чудесные элементы любой логики - OR....... )))
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

bamik писал(а): 06 апр 2018, 20:25 В его описании сказано, что он направляет входное значение на выбранную переменную. Но ни слова о том, что остальные при этом обнулятся.
[spoiler= ну что ж . повторим]Изображение[/spoiler]
он переключает на один из выходов.
bamik писал(а): 06 апр 2018, 20:25направлена на людей владеющих логикой
вот именно. для людей не знакомых с программированием, переключатель, он и в африке переключатель.
и если к переключателю прицепить лампочки, светить будет только одна, другие погаснут.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

pan писал(а): 06 апр 2018, 20:49 светить будет только одна, другие погаснут.
Точно, и ни одна из лампочек не запомнит, что она, перед переключением, была включена!
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25 янв 2018, 22:23
Откуда: Bukovyna
Имя: Василий

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

Сообщение Labu559 »

bamik писал(а): 06 апр 2018, 10:35К сожалению я еще совсем неопытен, чтобы сделать свой блок с вариантным числом входов
Если я правильно понял, то Вам должна подойти такая конструкция
[spoiler]_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;
}[/spoiler]
При просмотре теряется структура (табуляция) файла, в редакторе- нет.
bamik
Рядовой
Сообщения: 8
Зарегистрирован: 14 фев 2018, 01:20
Имя: Андрей

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

Сообщение bamik »

Sancho писал(а): 06 апр 2018, 21:00Точно, и ни одна из лампочек не запомнит, что она, перед переключением, была включена!
Переменные не лампочки, они помнят.
Жаркий спор разгорелся на пустом месте.
А собственно вопрос состоит в том, чтобы в программе FLProg был блок с вариантным количеством выходов, который бы присваивал одно значение одной выбранной переменной, не затрагивая другие. Это было бы удобно. Вариант из сборных конструкций - от "бедности".
Sancho писал(а): 06 апр 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;
}
Вот что выдала Ваша платка. Наверное, компилятор сам выбирает конструкцию в зависимости от текущей ситуации.
И этот код ничем не отличается от моего кода в самом первом посту.
Приклепляю свои конструкции. Можете убедиться, что я не поленился собрать Вашу конструкцию.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

bamik писал(а): 07 апр 2018, 05:48И этот код ничем не отличается от моего кода в самом первом посту.
Sancho писал(а): 06 апр 2018, 10:44А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
Так я Вам об этом и говорил - а Вы мне об раздутии, увеличении веса проги...
bamik писал(а): 06 апр 2018, 19:01Сожрет кучу памяти.
Если Вы занимаетесь кодо-водством - зачем Вам FLProg? Ещё и писать - баги блока...
bamik писал(а): 07 апр 2018, 05:48А собственно вопрос состоит в том, чтобы в программе FLProg был блок с вариантным количеством выходов, который бы присваивал одно значение одной выбранной переменной, не затрагивая другие. Это было бы удобно. Вариант из сборных конструкций - от "бедности".
Пожелания о новых блоках - в другой теме. Там-же, где я жду modulo, давно.....
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
support
Супермодератор
Сообщения: 1917
Зарегистрирован: 03 янв 2018, 11:45
Откуда: Астрахань
Имя: Сергей
Поблагодарили: 23 раза
Контактная информация:

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

Сообщение support »

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

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

Ждите новый релиз программы
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Автор программы FLProg.
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя