DRAKON.SU

Текущее время: Среда, 23 Сентябрь, 2020 05:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 13 Август, 2020 21:48 

Зарегистрирован: Пятница, 18 Январь, 2019 12:03
Сообщения: 29
Отладил простейший алгоритм подавления дребезга контактов.

Хочу поделиться как это выглядит на ИС ДРАКОН и как в традиционном представлении (код в Arduino IDE написан по общепринятым правилам с комментариями).

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

Суть алгоритма в том, что при появлении на цифровом выводе Arduino сигнала (на важно переход от 0 к 1 или обратно), делаем повторную проверку через 20 миллисекунд (достаточное время даже для плохой кнопки). И если через 20 мс подтвердится переход (от 0 к 1 или обратно), то выполняем какое-либо действие (в моем случае это выдача на терминал 0 или 1 для визуального контроля).
По сути это алгоритм, который отслеживает момент изменения фронта импульса. Алгоритм не использует прерывания. Так же не тормозит выполнение другого полезного кода и позволяет легко подключать от 1-й до любого количества кнопок (сколько памяти хватит). Руками надо только прописать количество кнопок и номера выводов микроконтроллера.

Код:
// ---------- Функция Состояние кнопки (подавления дребезга) ----------------
int monitor_S1(){
  if(flag_proverka_po_timer[nomer_kn]) { // "Проверить через 20 мс" = 1?   
    if(millis()>timers[nomer_kn]+drebezg_S){ // Прошло 20 мс от старта таймера?   
      if(digitalRead(pins_kn[nomer_kn])==HIGH) flag_[nomer_kn]=true; // "Текущее состояние кнопки" = 1
      else flag_[nomer_kn]=false; // "Текущее состояние кнопки" = 0
     
      flag_proverka_po_timer[nomer_kn]=false; // "Проверить через 20 мс" = 0
     
      if(flag_[nomer_kn] != pre_flag_[nomer_kn]){ // "Текущее состояние" отличается от "Предыдущего"?
        pre_flag_[nomer_kn]=flag_[nomer_kn]; // "Предыдущий" = "Текущий"
        if(flag_[nomer_kn]) return 1; // Переход в 1, возрастание фронта
        else return 2; // Переход к 0, убывание фронта
      }
    }
  }
  else { // Непрерывный мониторинг
    if(digitalRead(pins_kn[nomer_kn]) == HIGH) { // Цифровой вход = 1?
      if(!flag_[nomer_kn]){ // "Текущее состояние" != 1?
        // Состояние цифр. входа не соотв. флагу состояния
        timers[nomer_kn]=millis(); // Старт таймера
        flag_proverka_po_timer[nomer_kn]=true; // "Проверить через 20 мс" = 1
      }
    }
    else { // 0
      if(flag_[nomer_kn]) { // "Текущее состояние" = 1?
        // Состояние цифр. входа не соотв. флагу состояния
        timers[nomer_kn]=millis(); // Старт таймера
        flag_proverka_po_timer[nomer_kn]=true; // "Проверить через 20 мс" = 1
      }
    }
  }
  return 0; // Возвращаем 0
}


Вложения:
Схема подавления полная.png
Схема подавления полная.png [ 47.83 КБ | Просмотров: 457 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Август, 2020 14:32 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 22
Откуда: Киев
Как-то выглядит сложней, чем надо. Например, видно, что Вы недолюбливаете логику высказываний, что приводит к появлению тавтологий. Если попытаться их устранить, получается что-то вроде этого:

Код:
int monitor_S1(void) {
  int state = 0;
  if(!flag_proverka_po_timer[nomer_kn]) { // "Проверить через 20 мс" не выставлен?   
    /* Непрерывный мониторинг */
   
    flag_proverka_po_timer[nomer_kn] = /* Запустить проверку по таймеру если произошла смена состояния */
      (digitalRead(pins_kn[nomer_kn]) == HIGH) != flag_[nomer_kn];
    if (flag_proverka_po_timer[nomer_kn]) {
        timers[nomer_kn] = millis();   
    }
  } else if (millis() > timers[nomer_kn] + drebezg_S) { // Прошло 20 мс от старта таймера?
    flag_proverka_po_timer[nomer_kn] = false; /* Отмена проверки по таймеру */
    flag_[nomer_kn] = digitalRead(pins_kn[nomer_kn]) == HIGH; /* Выставим текущее состояние кнопки */

    if (flag_[nomer_kn] != pre_flag_[nomer_kn]) { // "Текущее состояние" отличается от "Предыдущего"?
      pre_flag_[nomer_kn] = flag_[nomer_kn]; // "Предыдущий" = "Текущий"
      if (flag_[nomer_kn]) {
        state = 1; // Переход в 1, возрастание фронта
      } else {
        state = 2; // Переход к 0, убывание фронта
      }
    }
  }
  return state;
}

Также, код можно улучшить, создав соответствующие структуры данных, избавившись от глобальных переменных и магических чисел и проведя декомпозицию, чему может помочь предварительное избавление от неструктурных переходов. Всё это лежит за пределами блок-схем. А комментарии, во многом, станут не нужны.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 07:47 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 4836
Откуда: Москва
Дышлевый Андрей писал(а):
Хочу поделиться как это выглядит на ИС ДРАКОН и как в традиционном представлении (код в Arduino IDE написан по общепринятым правилам с комментариями).
Андрей, как получен код на Си?
Вы его руками написали?
Или он получен автоматически из дракон-схемы на выходе ИС Дракон?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 07:48 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 4836
Откуда: Москва
Comdiv писал(а):
Как-то выглядит сложней, чем надо. Например, видно, что Вы недолюбливаете логику высказываний, что приводит к появлению тавтологий.
Comdiv, относятся ли эти слова к дракон-схеме?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 13:12 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 22
Откуда: Киев
Владимир Паронджанов писал(а):
Comdiv писал(а):
Как-то выглядит сложней, чем надо. Например, видно, что Вы недолюбливаете логику высказываний, что приводит к появлению тавтологий.
Comdiv, относятся ли эти слова к дракон-схеме?
Сначала поправлюсь, что речь была о логике предикатов, а не высказываний.

Я смотрел на код на C, но похоже, что именно дракон-схема и провоцирует это, потому что блок-схемы сосредоточены на потоке выполнения, а упростить код можно, рассматривая результат сравнений как значение, а не только как условие перехода. Автор использовал такой подход не в полной мере.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 16:12 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 4836
Откуда: Москва
Comdiv писал(а):
Я смотрел на код на C, но похоже, что именно дракон-схема и провоцирует это, потому что блок-схемы сосредоточены на потоке выполнения, а упростить код можно, рассматривая результат сравнений как значение, а не только как условие перехода.

Comdiv, прежде всего, я хочу поблагодарить вас за участие в обсуждении.

Теперь по сути. Я не знаю, как был получен код на Си. Предположу, что он был получен автоматически из дракон-схемы.

В этом случае качество Си-кода не играет роли. Исходным кодом считается дракон-схема, и только она. На Си-код можно не смотреть, точно так же, как мы не смотрим на машинный код после компиляции.

Данная дракон-схема нарисована правильно, ибо она не содержит знаков И, ИЛИ, НЕ (которые являются потенциальным источником ошибок), реализуя принцип "конъюнкция без знака конъюнкции" и "дизъюнкция без знака дизъюнкции".

Цель языка ДРАКОН — облегчить понимание алгоритмов и программ ЧЕЛОВЕКОМ. Вторая цель — сократить число ошибок.

ДРАКОН не может конкурировать с другими языками по таким критериям как быстродействие, экономия памяти, скорость написания программы. Возможно, ДРАКОН может уменьшить время на отладку программы.

Comdiv, что вы об этом думаете?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 19:16 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 22
Откуда: Киев
Думаю, что в ряде случаев ДРАКОН может облегчить понимание. Во многом, это зависит от конкретного человека и от конкретного языка программирования, который служит наполнением для схемы.
Но в этом примере я увидел обратное. Посмотрев на схему, я понял, что мне легче понять код на C. Увидев недостатки в коде и уже поняв суть, я посмотрел на схему и увидел, что именно ДРАКОН спровоцировал появление этих недостатков. То есть, недостатки есть не только в сгенерированном коде, но и в исходной схеме.

Цитата:
Данная дракон-схема нарисована правильно, ибо она не содержит знаков И, ИЛИ, НЕ (которые являются потенциальным источником ошибок), реализуя принцип "конъюнкция без знака конъюнкции" и "дизъюнкция без знака дизъюнкции".
Если бы ДРАКОН предлагал лучшую замену для любых выражений, а не только логических операций, то с этим можно было бы согласиться. А так, логические операции являются не большими источниками ошибок, чем любые другие операции. При условии, конечно, что человек понимает, что делает.

Цитата:
ДРАКОН не может конкурировать с другими языками по таким критериям как быстродействие, экономия памяти, скорость написания программы
Как мне видится, сам ДРАКОН никак не ухудшает быстродействие и расход памяти. Но вот скорость написания программы критичны в том числе и для отладки. Не улучшает отладочные возможности и стремление оградить разработчика от уверенной работы с логическими операциями, так как они играют важную роль в верификации программы.

Тем не менее, я уверен, что ДРАКОН был бы полезен для понимания программы, как минимум, при выполнении обратной задачи - визуализации кода в виде схемы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 20:57 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 4836
Откуда: Москва
Comdiv писал(а):
логические операции являются не большими источниками ошибок, чем любые другие операции.

Можно ли подкрепить это утверждение ссылками на литературу?

Мне известны ссылки на опасность ошибок именно в логических выражениях.
====================

Как известно, логическое отрицание представляет определенную трудность для понимания. В связи с этим Эдвард Йодан советует:
Цитата:
«Если это возможно, избегайте отрицаний в булевых [логических] выражениях. Представляется, что их понимание представляет трудность для многих программистов» [10].

Опасность ошибочного понимания провоцируют не только знаки отрицания, но и другие связки. Поэтому Йодан расширяет и усиливает свою мысль:
Цитата:
«Избегайте без нужды использования сложных булевых выражений… Даже если нет неоднозначностей, такие выражения обычно с трудом понимают все, за исключением их автора» [10].

Сходные предостережения делает не только Йодан. Его поддерживает Гленфорд Майерс:
Цитата:
«Распространенным источником ошибок является использование логических операций И и ИЛИ» [11].


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 22:05 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 22
Откуда: Киев
Владимир Паронджанов писал(а):
Можно ли подкрепить это утверждение ссылками на литературу?
Может и можно, но обычно люди не пишут просто так о том, что что-то не является чем-то, потому что можно составить бесконечное количество подобных утверждений.


Не смог сходу найти оригиналы цитат. Без этого неясно ни контекста, ни на что указывают ссылки. На результаты корректных исследований, некорректных исследований или на высказывание мнений?

Цитата:
Избегайте без нужды использования сложных булевых выражений… Даже если нет неоднозначностей, такие выражения обычно с трудом понимают все, за исключением их автора
Это просто "вода". Поэтому что является подмножеством обобщённого совета:

Избегайте без нужды использования сложного ЧЕГО УГОДНО. Такое сложное ЧТО УГОДНО многие понимают с трудом.Переусложнённый поток выполнения, являющийся результатом недопонимания логики тоже подпадает под это правило.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Август, 2020 07:43 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 4836
Откуда: Москва
Comdiv писал(а):
Не смог сходу найти оригиналы цитат. Без этого неясно ни контекста, ни на что указывают ссылки. На результаты корректных исследований, некорректных исследований или на высказывание мнений?

[10] Йодан Э. Структурное проектирование и конструирование программ. / Пер. с англ. / Под ред. Л.Н. Королева. — М.: Мир, 1979. – 415 с. — С. 252.

[11] Майерс Г. Надежность программного обеспечения / Пер с англ. / Под ред. В.Ф. Кауфмана. — М.: Мир, 1980. — 360 с. — С. 292.

Мое собственное изучение этого вопроса см.
Цитата:
Часть 3. Алгоритмическая логика. Математическая логика в алгоритмах. Визуальная алгебра логики

Глава 12. Логические операции И, ИЛИ, НЕ
Глава 13. Логическая функция И
Глава 14. Логическая функция ИЛИ
Глава 15. Как удалить логические связки из логических выражений
Глава 16. Канонические логические схемы
Глава 17. Логическая функция «исключающее ИЛИ»
Глава 18. Сложные логические функции

стр. 124 – 183 https://drakon.su/_media/24_zhizneritm20.pdf


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Август, 2020 16:44 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 22
Откуда: Киев
Спасибо, ознакомился. Теперь контекст ясен и он не имеет никакого отношения к использованию логических выражений в целом. Я бы их не использовал для аргументации, потому что это не исследования, а просто советы, к тому же вырванные из контекста. Раздавать такие советы лучше без ссылок, потому что такое цитирование только вредит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Август, 2020 23:08 

Зарегистрирован: Пятница, 18 Январь, 2019 12:03
Сообщения: 29
Владимир Паронджанов писал(а):
Дышлевый Андрей писал(а):
Хочу поделиться как это выглядит на ИС ДРАКОН и как в традиционном представлении (код в Arduino IDE написан по общепринятым правилам с комментариями).
Андрей, как получен код на Си?
Вы его руками написали?
Или он получен автоматически из дракон-схемы на выходе ИС Дракон?

Извиняюсь что раньше не написал (был очень занят).

Код на Си написан руками уже после того как Дракон-схема была завершена (т. е. первоисточник схема). Я не пытался оптимизировать код на Си, а набросал его так, как делают большинство неопытных программистов (к числу которых я тоже отношусь).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 22 Август, 2020 00:12 

Зарегистрирован: Пятница, 18 Январь, 2019 12:03
Сообщения: 29
Comdiv писал(а):
Как-то выглядит сложней, чем надо. Например, видно, что Вы недолюбливаете логику высказываний, что приводит к появлению тавтологий.
Также, код можно улучшить, создав соответствующие структуры данных, избавившись от глобальных переменных и магических чисел и проведя декомпозицию, чему может помочь предварительное избавление от неструктурных переходов.


Полностью с Вами согласен.
Более того я не знаю что такое: логика высказываний и неструктурные переходы.

Это сильно простой пример, давайте на минуту представим что код будет сложнее, например 5 принципиально разных алгоритмов подавления дребезга контактов которые перебираются покуда гарантировано не подавят этот самый дребезг.
Вы (профи) написали 80% кода и по какой-то причине ушли с фирмы или предприятия. Программиста вашего уровня нет и не предвидится. Мне (любителю) надо закончить и отладить.
Если алгоритм в виде ДРАКОН схемы, то разобраться как это работает любителю под силу. А значит можно закончить работу. Да пусть не так быстро.
Если же код на Си и писал опытный человек, то ищи минимум такого же по уровню знаний. Тут мне кажется без вариантов. А нет профи то и работа станет. Как сказал один умный человек: "Кадры решают все".

Это исключительно мое мнение и пишу это я больше для себя, чтобы лучше понять.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 22 Август, 2020 02:15 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 22
Откуда: Киев
Цитата:
Более того я не знаю что такое: логика высказываний и неструктурные переходы.
Тогда Вы как большинство программистов, но незнание названий само по себе не мешает использованию.
Цитата:
Если алгоритм в виде ДРАКОН схемы, то разобраться как это работает любителю под силу
Переходы не являются исчерпывающей информацией и от разбирательства с содержимым квадратиков это не спасает. Мне, например, схема не особо помогла.

Цитата:
~~ написали 80% кода и по какой-то причине ушли с фирмы или предприятия. Программиста вашего уровня нет и не предвидится. Мне (любителю) надо закончить и отладить.
Если код напишет программист хорошего уровня, то сопровождать его будет легче, а не наоборот. Прибедняться не нужно, если Ваш код на ДРАКОН Вам видится хорошим для сопровождения, то Ваши способности куда выше моих. Я стремлюсь упрощать именно потому, что понимаю ограничения своего ума, а не потому что сильно умный. Визуализация потока выполнения, пусть и выполненная по продуманным правилам - это не панацея для понимания алгоритма.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2008-2020, участники конференции «DRAKON.SU», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB