Ошибка в блоке демультиплексора DMS
Ошибка в блоке демультиплексора DMS
Вот что генерируется при демультиплексоре на 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;}
Все сразу встало на свои места. Меняется только та глобальная переменная, которая была выбрана.
К сожалению я еще совсем неопытен, чтобы сделать свой блок с вариантным числом входов. Может быть стоит изменить код и дополнить еще одним блоком демультиплексора?
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
[ref]bamik[/ref],
Это не ошибка - так работает настоящий демультиплексор.
А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
[spoiler] [/spoiler]
Это не ошибка - так работает настоящий демультиплексор.
А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ошибка в блоке демультиплексора DMS
[spoiler]
[/spoiler]
переключатель, насколько я понимаю, переключает сигнал на нужный выход, отключая тот который был.
то есть на других не должно быть ни чего. думаю если брать во внимание дословное название блока, то он работает правильно.
ваша конструкция по полученному функционалу больше напоминает меню.
я так думаю. может не прав.

переключатель, насколько я понимаю, переключает сигнал на нужный выход, отключая тот который был.
то есть на других не должно быть ни чего. думаю если брать во внимание дословное название блока, то он работает правильно.
ваша конструкция по полученному функционалу больше напоминает меню.
этот блок чаще используется для передачи некой переменной в разные места схемы по выбору.
я так думаю. может не прав.
-
- Лейтенант
- Сообщения: 305
- Зарегистрирован: 18 сен 2015, 14:00
- Откуда: Саратов
- Имя: Сергей
- Поблагодарили: 1 раз
Ошибка в блоке демультиплексора DMS
Не совсем понятно ("сделать свой блок с вариантным числом входов"), это уже будет не демультиплексор.
https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BE%D1%80
https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BE%D1%80
S
Ошибка в блоке демультиплексора DMS
если пройтись по всем выходам , то во всех переменных будет _gtv11 даже если выход неактивный ..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;}
а else {_dms1Q0 = 0;} обнуляет после смены состояния
Ошибка в блоке демультиплексора DMS
У настоящего демультиплексора обычно нет третьего состояния.
В данном случае речь идет о передаче данных от одной глобальной переменной в какую-либо другую по входу выбора. При этом значения других переменных меняться не должны. Ни в 0, ни во что-либо другое. А конструкция, что Вы предлагаете, слишком громоздка. Сожрет кучу памяти.
Отправлено спустя 5 минут 15 секунд:
[ref]dizzyy[/ref], выполнится только одно условие, потому изменится только одна переменная. А еще точнее, я совершенно не понял, что Вы хотели сказать.
Отправлено спустя 16 минут 15 секунд:
Согласно справочным данным 74138, на неактивных выходах реального демультиплексора присутствует 1, эквивалентом которой в программном демультиплексоре будет являться отсутствие какого-либо присваивания. Обнулять же глобальные переменные требуется только в том случае, если они не были проинициализированы. Извините, но я учил программирование в конце 80х - начале 90х, но уже тогда инициализация переменных в теле программы было дурным тоном.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Ошибка в блоке демультиплексора DMS
Где Вы видите состояние Z???
Скомпилируйте и посмотрите, сравните со своим кодом. (Очень напоминает "дело Скрипаля")bamik писал(а): 06 апр 2018, 19:01А конструкция, что Вы предлагаете, слишком громоздка. Сожрет кучу памяти.
Но никак не последнее состояние!!! А ноль или один - не принципиально. Проинвертируйте вход и выходы - получите 74138.bamik писал(а): 06 апр 2018, 19:01Согласно справочным данным 74138, на неактивных выходах реального демультиплексора присутствует 1, эквивалентом которой в программном демультиплексоре будет являться отсутствие какого-либо присваивания. Обнулять же глобальные переменные требуется только в том случае, если они не были проинициализированы.
Отличие глобальной от локальной переменной в данном случае неочевидны и ничего не требует.
Вы немного подзабыли, наверное....
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ошибка в блоке демультиплексора DMS
[ref=#ff8000]Sancho[/ref], Вам поспорить не о чем? Рисовать предлагаемую Вами конструкцию как минимум не продуктивно. Данная среда программирования направлена на людей владеющих логикой, но отдаленно программированием. Насколько я понимаю, объявляемые переменные в окне вводов, выводов и переменных - глобальные. И случайное их изменение - ошибка. А данный блок демультиплексора именно к этому и ведет. В его описании сказано, что он направляет входное значение на выбранную переменную. Но ни слова о том, что остальные при этом обнулятся. Если бы это было сказано, то это уже была бы не ошибка, а фича. Геморная, правда. Но уже тогда можно было бы искать пути обхода.
Отправлено спустя 21 минуту 4 секунды:
Вот что сгенерировалось по Вашему предложению. Выглядит красиво. Но вызываются функции. Их содержимое я не знаю. Будут ли они короче 5 строчек с if?
Отправлено спустя 1 минуту 17 секунд:
Если будет, то что мешало и тело демультиплексора построить по такой схеме?
С точки зрения электроники как раз принципиально. 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;}
Отправлено спустя 1 минуту 17 секунд:
Если будет, то что мешало и тело демультиплексора построить по такой схеме?
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Ошибка в блоке демультиплексора DMS
[ref]bamik[/ref],
Откуда взялся такой код????????????????
Попробуйте, если лень рисовать, нажать кнопку компиляция, даже файл прикрепил, для Вас....
Откуда взялся такой код????????????????
Попробуйте, если лень рисовать, нажать кнопку компиляция, даже файл прикрепил, для Вас....
Чудесные элементы любой логики - OR....... )))bamik писал(а): 06 апр 2018, 20:24С точки зрения электроники как раз принципиально. 0 - это открытый транзистор на выходе, и из него уже не сделаешь 1 в данной точке схемы. А вот 1 - это сопротивление к питанию, потому можно другим транзистором в данной точке сделать 0. (Разговор о ТТЛ логике.) Именно поэтому я говорил, что 1 на выводе микросхемы соответствует отсутствию присваивания в программе.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ошибка в блоке демультиплексора DMS
[spoiler= ну что ж . повторим]bamik писал(а): 06 апр 2018, 20:25 В его описании сказано, что он направляет входное значение на выбранную переменную. Но ни слова о том, что остальные при этом обнулятся.

он переключает на один из выходов.
вот именно. для людей не знакомых с программированием, переключатель, он и в африке переключатель.
и если к переключателю прицепить лампочки, светить будет только одна, другие погаснут.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Ошибка в блоке демультиплексора DMS
Точно, и ни одна из лампочек не запомнит, что она, перед переключением, была включена!
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ошибка в блоке демультиплексора DMS
Если я правильно понял, то Вам должна подойти такая конструкция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]
При просмотре теряется структура (табуляция) файла, в редакторе- нет.
Ошибка в блоке демультиплексора DMS
Переменные не лампочки, они помнят.
Жаркий спор разгорелся на пустом месте.
А собственно вопрос состоит в том, чтобы в программе FLProg был блок с вариантным количеством выходов, который бы присваивал одно значение одной выбранной переменной, не затрагивая другие. Это было бы удобно. Вариант из сборных конструкций - от "бедности".
Я создал платку со схемой, которую Вы мне нарисовали в своем первом посту. И, однако таки, нажал на кнопочку "компиляция". Код из 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
bamik писал(а): 07 апр 2018, 05:48И этот код ничем не отличается от моего кода в самом первом посту.
Так я Вам об этом и говорил - а Вы мне об раздутии, увеличении веса проги...Sancho писал(а): 06 апр 2018, 10:44А то, что написали Вы - операции присваивания при совпадении, элементарно делается в программе с помощью компаратора и включения "входа разрешения записи" у переменной.
Если Вы занимаетесь кодо-водством - зачем Вам FLProg? Ещё и писать - баги блока...
Пожелания о новых блоках - в другой теме. Там-же, где я жду modulo, давно.....bamik писал(а): 07 апр 2018, 05:48А собственно вопрос состоит в том, чтобы в программе FLProg был блок с вариантным количеством выходов, который бы присваивал одно значение одной выбранной переменной, не затрагивая другие. Это было бы удобно. Вариант из сборных конструкций - от "бедности".
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- support
- Супермодератор
- Сообщения: 1917
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Поблагодарили: 23 раза
- Контактная информация:
Ошибка в блоке демультиплексора DMS
Ну вообще то это именно переключатель. Примерно вот такая бандура
то есть когда выход отключён, то на нём 0 вольт (ну и у меня ноль становится). так что всё в принципе логично.
Хотя возможно я и не прав. На всякий случай сделал галочку в свойствах блока
при её установке после переключения на отключенных выходах будет оставаться последнее значение.
Ждите новый релиз программы
то есть когда выход отключён, то на нём 0 вольт (ну и у меня ноль становится). так что всё в принципе логично.
Хотя возможно я и не прав. На всякий случай сделал галочку в свойствах блока
при её установке после переключения на отключенных выходах будет оставаться последнее значение.
Ждите новый релиз программы
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Автор программы FLProg.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя