Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 13:17:37

Вопрос не в сраче (потому пока и не МЯУ)...
Спорщики таки выкладывают различные варианты - а это в любом случае полезно.
В то же время замечу, что опрос кнопы сам по себе не существует - он является источником команды управления для основной задачи и результатом для индикации текущего состояния устройства.
Подход естественно разный - минимум четыре варианта "школ" -
школа профессиональной разработки участника крупного коллектива;
школа профессиональной разработки мелкой фирмы/индивидуальных заказов;
школа любительской разработки мелкосерийных заказов;
школа любительской разработки единичных экземпляров;
дополнительно подразделы:
только разработка;
разработка и ремонт;
любительская разработка и ремонт.
В принципе это больше организационные различия в подходах - смотрим тут
https://sunduk.radiokot.ru/view/?id=1369493027
:beer:
А вот для поспорить о вариантах выполнения...
как такой вариант схемы:
Изображение
Допустим какое-то устройство (тот же термостат с фиксированной температурой) имеет три кнопы (они же индикаторы статуса)...
Или пару тех кноп плюс индикатор...
Надо помудрствовать... Терморелюшки с фиксированной температурой и внешним условием запуска штука в прикладном плане полезная...
:roll:
НО... как всегда ЛЕЕНЬЬЬ...
:sleep:

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 17:25:36

Вопрос не в сраче (потому пока и не МЯУ)...
Спорщики таки выкладывают различные варианты - а это в любом случае полезно.:

А, да? Ладно, тогда продолжаем полезный срачь :) Итак, новая тема говнометания - пресловутый дребезг кнопок. И поскольку врага надо знать в лицо, обратимся к фактам. Берем распространенные тактовые кнопки, подтянутые к питанию резистором и с низким уровнем при замыкании. Начинаем тыкать в них и смотреть осциллографограмму.

Вот мы видим среднестатистическое поведение кнопки:
Изображение Изображение Изображение
в среднем, длительность нажатого состояния кнопки составляет 80±30 мс при обычных тыканиях кнопок пользователем.
В момент нажатия дребезг заканчивается уже через 20 мкс, а при отпускании он гораздо дольше - порядка 6 мс. Это средние величины, бывает чуть меньше или чуть больше. Такие результаты объясняются действием тарельчатой пружины, которая под давлением пальца сначала упруго сопротивляется, а затем скачком усилие сжатой пружины уменьшается и кнопка быстро замыкается. При размыкании уже иначе ведет себя пружинка, и вначале она находится в неустойчивом состоянии и контакты "звенят", а затем пружинка быстро распрямляется.
Теперь попробуем получить наихудшие результаты по дребезгу при довольно медленном отпускании кнопки. Получается 27 мс:
Изображение

Затем, узнаем наши скоростные возможности по нажатиям кнопки. Очень быстрое одиночное нажатие - 30 мс (быстрее практически никак), двойное нажатие - между ними около 150±20 мс.
Изображение Изображение

Итого. У нас есть исходные данные для дальнейшей работы: дребезг прекращается менее чем за 30 мс, длительность нажатого состояния более 30 мс, двойное нажатие с длительностью отпущенного состояния более 50 мс.
Теперь, полагаясь на эти цифры, назначим период опроса кнопок 35 мс. Получаем, что моменты опроса будут попадать как раз так, чтобы перекрыть практически все неопределенности. При этом, время реакции системы на нажатую или отпущенную кнопку не превышает периода опроса 35 мс. Для человека это практически незаметно. И не потребовались никакие дополнительные таймеры организации задержек на повторные опросы.

Однако, допустим, нас не устраивает интервал 35 мс, нам почему-то кажется что это медленно. Можно уменьшить интервалы например до 20 мс. В большинстве случаев работает без ложных срабатываний. Но мы перестраховываемся и вводим программный антидребезг. Но решать мы его будем не запуском дополнительного таймера, а просто пропуском до следующего интервала в случае обнаружения изменения предыдущего и текущего считывания.
Можно применить интегрирующий счетчик, который будет увеличиваться или уменьшаться в зависимости от прочитанного состояния в каждом цикле опроса. Когда вход будет стабилен, счетчик будет идти в одну сторону и по достижению порога будет зафиксирован факт подавления дребезга.
Ну а еще один вариант - конденсатор на кнопке. И вот уже получили чистый незамаранный однозначный сигнал
Изображение
а если вдруг кто скажет вам, что от этого кондера обгорают контакты, то просто скажите, что напряжения на микрокнопке недостаточно для зажигания дуги, и еще ни одна микрокнопка не обгорела.

Ну чтож, вот практические результаты на лицо. Ждем тем теперь новых волн говносрача и яростного опровержения практических результатов. :)))

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 19:00:57

О_о...

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 20:04:43

а если вдруг кто скажет вам, что от этого кондера обгорают контакты, то просто скажите, что напряжения на микрокнопке недостаточно для зажигания дуги, и еще ни одна микрокнопка не обгорела.

Ну наверное если кто-то не видел "заварившейся" кнопки - ему просто повезло или стаж работы небольшой. Мне, увы, приходилось не раз. Не знаю насчёт - дуга ли или мгновенное выделение тепла в точке контакта - но было. Лечится просто - коротить кондёр на землю не непосредственно, а через 10..47 Ом. Никакого обгорания.
А дребезг я гасил троекратным опросом кнопки - без всяких дополнительных таймеров. У основного таймера всегда найдётся куда присунуть пару строк. Состояние фиксируется по трём совпадающим значениям. Но это всё писалось на асме, когда МК выполняет то, что ты написал, а не как это понял компилятор.

С ВОВ51 согласен не совсем - в споре рождается, говорят, истина (если её не придушат спорящие), но этические нормы следует соблюдать и не переходить на личности. Тогда это будет именно аргументированный спор, а не срач.

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 20:09:53

Угу. Конденсаторы. Обгорание контактов кнопок. Выгорание пинов МК, МС в случае наличия защитных диодов. Все зависит от тока коммутации, ёмкости конденсатора. Пины могут выгореть в моменты, когда сняли напряжения питания и конденсатор разряжается через защитные диоды входов. Либо каким то образом на конденсаторе накопилось напряжение выше питания МК, МС.

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 20:22:00

Обгорания контактных площадок у кноп для МК или логики-рассыпухи особо не попадалось, а вот "пленочные" клавиатуры довольно часто портятся... Возможно тому содействуют ошибки в технологиях изготовления (несоответствующие материалы напыления или качество осаждения металла или когти пользователей), но "самоклейки" на бытовухе, весах или иной технике весьма часто менять приходилось... Иногда при разборе видимые следы "электропрогара" отмечались...
8)
Троекратный опрос в принципе равноценен использованию некоторой задержки между первым и последним опросом за счет времени исполнения команд МК (тот же вариант с программной генерацией паузы между двумя последовательными опросами).
Другое дело как в случае с энкодером - пара контактов с жестко заданной последовательностью возможных состояний -там действительно быстрый анализ без антидребезга возможен.
:roll:

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 21:26:35

Ну уж, выгорание прям-таки пинов. Защитные диоды спокойно держат постоянный ток в несколько миллиампер (указано в даташите). А уж какой там ток от мелкого кондера в 10 нФ то... Тем более, что такие кондеры вообще не редкость на кнопках. Так что всё там нормуль, не надо пугать. Не ставьте кондеров на 22 мкФ на кнопку, и все дела то.

Re: Как поместить цикл в case оператора switch

Ср окт 12, 2022 23:28:58

Возможно "проблемы выгорания" или окисления контактных поверхностей вызваны не столько конденсаторами, сколько не столь заметными дополнительными факторами - электрохимической коррозией (помимо факторов материалов контактов и их покрытия, качества изготовления и прочих мелочей)...
В старых кассовых аппаратах попадались схемы клавиатуры на "пленке" с резисторами и конденсаторами на линиях возврата... С появлением новых МК (и технологий изготовления) изменилось и качество "пленок". А в новых вообще появилась пара - контактные площадки на плате и "проводящая резинка" на резиновом "коврике", да и линии связи между контактным полем и главной платой стали заметно короче. Часто и отдельный МК обработки рядышком ставится - их сегодня весьма много появилось (чаще от китайцев при совмещении функционала контроллера дисплея и клавиатуры).
Так что с единичными кнопками чаще радиолюбителям сталкиваться приходится.
:roll:

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 11:28:48

Пока благородные доны успокоились, опишу объектно ориентированный способ решения задачи.

Сначала опишем объекты.

1. Кнопка библиотечная. Вешается но ножку микроконтроллера и опрашивается вызовом метода Scan() с частотой 30-100 Гц. Метод isKeyPressed() возвращает была ли нажата кнопка. Настраивается на срабатывание по "0" или "1".

2. Светодиод библиотечный. Вешается на ножку микроконтроллера и умеет включаться On(), выключаться Off() и менять своё состояние Toggle(). Настраивается на активный "0" или "1".

3. Для нашей задачи конструируем "Мигающий диод". Он управляет обычным светодиодом библиотечным. Умеет включать режим мигания On(), выключать режим мигания Off() и менять состояние режима мигания Toggle(). Для работы мигания с какой-то частотой вызывается метод tic(). Частота вызова tic() делённая на заданный коэффициент деления даёт требуеую частоту мигания.

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



Теперь опишем поведение схемы. Если любая из кнопок нажата, то назначенному ей мигающему диоду меняем состояние Toggle(), а остальным выключаем Off(). Собственно все, собираем это до кучи, инициализируем ножки и таймер и всё готово.
Скажу сразу, можно сделать сильно оптимальней. Можно 3 кнопки как одну клавиатуру, выдающую коды нажатия, сделать и диоды объединить в одно целое. Но так проще, быстрее и сразу работает. А преждевременная оптимизация сами знаете что...

Исходники
3BlinkingLeds SRC.zip
(2.39 KiB) Скачиваний: 39

Видосик работы в Proteus
Blinking in Proteus.zip
(398.51 KiB) Скачиваний: 38

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 11:49:23

Опрос всех кнопок как одну реализовано у меня. Как бы это не преждевременная оптимизация. А один из способов опроса кнопок.

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 11:59:58

Вопрос лишь в масшатбируемости задачи. Одна кнопка - один диод, две кнопки - два диода, три кнопки - три диода и т.д. На каком шаге пора применять класс KeyBoard ?

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 12:46:03

У тебя показан как раз мой подход. В смысле, что я его применяю. Событие кнопок, клавиатуры, код кнопок. Матричная клавиатура 4х4. Этот подход я увидел у Татарчевского. Попробовал. И меня такой метод устроил по всем пунктам.
Татарчевский. Switch-case технологии. Часть 8.
Мой пример

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 13:01:36

Статьи про опрос кнопок... :shock: А что не диссер сразу? :)

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 13:15:54

В этом цикле статей показываются конечные автоматы. В свое время у меня были затруднения в программировании МК. Я не знал, как организовать параллельную работу программных модулей. Как будто уперся в стену. Пробовал использовать диспетчеры. Не то. На одном из профильных форумов мне указали на конечные автоматы. В процессе поиска информации по конечным автоматам наткнулся на цикл статей Татарчевского. Стал пробовать. Вот тогда я понял основной принцип. Конечные автоматы сами себе диспетчеры. И в определенных моментах что то вроде кооперативных ОС. Позже понял ещё один принцип. Дробление выполнения кода ветвлениями, условиями, состояниями конечных автоматов.

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 16:55:53

объектно ориентированный способ

объЕДко-ориентированный? :)))
Топикстартеру бы дайбох научиться параметры в фукнцию передавать и возвращать, а вы ему объедко-ориентированный С++ :))) Дааа, тема диссертации: "Кнопки в нашей жизни - проблематика и изыскания".

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 18:25:26

MLX90640, слишком много хамства в теме от тебя.
если будешь продолжать в том же духе, дам бан за нарушение правил форума, пункт 2.3.

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 21:39:18

VladislavS, объекты, конструкторы... - не сложно ли для начинающего? Потому и солидарен с MLX90640.

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 21:54:43

Смотря что понимать под сложностью. Я начал с ассемблера. Си мне дался не сразу. Несколько раз бросал. Но когда у меня подошел уровень развитых меню, понял, что пора переходить. Последний раз я сделал следующее. Остановил все заказы, и начал осваивать си. Я к чему. Ещё когда писал на асме, знакомился с методами программирования. Приходилось разбираться в примерах на разных языках. MicroMenu и Татарчевский мне попались ещё на этапе ассемблера. Позже, когда более менее перешёл на си, коллеги мне скидывали примеры меню, свои некоторые проекты. Один мне вообще примеры на X-macro скинул. Вот на них у меня чуть когнитивный диссонанс не случился. :))) Зато. X-macro отличный инструмент.

Что такое сложно? Некогда? Инерция? Боязнь сложностей? Характер? Важность того, что сложно. Зона комфорта. Обстоятельства конечно же. Но...

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 22:04:08

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

Re: Как поместить цикл в case оператора switch

Пт окт 14, 2022 22:30:04

Татарчевский, си, си++, асм ... все собрали? или еще что есть?

Ваша задача подкорректировать код ТС, в чем проблема?

VladislavS, что бы собрать ваш пример, мне пришлось вечер потратить, пришлось искать в своем "загашнике" готовый makefile для WinAVR(avr-g++), но я его собрал, а вот соберет ли ТС ... ?
Ответить