Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Программный антидребезг

Сб дек 10, 2016 18:49:33

Мой вариант антидребезга:

Соответственно, Buttons_Poll() вызывается каждую милисекунду в основном потоке выполнения, не блокирует работу основного потока и обрабатывает события нажатия (не отпускания, но и это можно сделать).

Re: Программный антидребезг

Сб дек 10, 2016 19:00:04

Oxford - ваше видео тонкое послатие найух. Что вы показали, спрашивается? Какое-то ублюдочное решение? Ублюдочное не в плане автора, а самого решения.
Если вздумаете возмутиться. Вот мой пример. Ссылка.

Примерщикам: Везде, во всех ваших примерах я вижу стремление показать насколько короче ваш код. То есть подспудное желание показать, типа вот как у меня короче чем у тебя. Но каждый раз я вижу какие-то огрызки решения. Вы покажите полностью ваш код. От опроса кнопок до определения кода кнопки. И как остальным модулям реагировать на события, коды кнопок и так далее.

Re: Программный антидребезг

Сб дек 10, 2016 21:38:45

А я обычно использую вот такой простенький алгоритм))

http://mypractic.ru/urok-8-cifrovaya-fi ... duino.html

Код не показываю, т.к. код каждый пишет сам... как ему удобней))

Re: Программный антидребезг

Сб дек 10, 2016 21:48:37

roman.com писал(а):...

От подобного описания мне хочется головой биться об стол. Куда катится мир? Ардуинщик описывает как обрабатывать кнопу. Блджааад! Много заумных слов, мало толку. Чистый программер или админ дорвался до электронной платы со своими нулевыми познаниями в электронике...
Порой мне хочется какого-нибудь ардуинщика за яйцы подвесить, чтобы не лезли куда не следует...

Re: Программный антидребезг

Сб дек 10, 2016 22:16:51

:))) ну я не адруинщик.. это не про меня)) у меня даже ардуины нет))

Re: Программный антидребезг

Сб дек 10, 2016 23:05:13

Demiurg писал(а):Везде, во всех ваших примерах я вижу стремление показать насколько короче ваш код. То есть подспудное желание показать, типа вот как у меня короче чем у тебя. Но каждый раз я вижу какие-то огрызки решения. Вы покажите полностью ваш код. От опроса кнопок до определения кода кнопки. И как остальным модулям реагировать на события, коды кнопок и так далее.

Вы название темы прочитайте, ага?

Re: Программный антидребезг

Пн дек 12, 2016 09:47:52

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

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

в своих разработках я увеличил обработку состояний кнопок до полсекунды, когда приобрести навык своевременного отпускания кнопки проще, чем при более коротком периоде.
поэтому и порты кнопок достаточно опросить один раз за полсекунды. нашли, что кнопка нажата - поставили соответствующий этой кнопке бит.
а дребезг нажатия и отпускания кнопки останется далеко за пределами того "мгновения", когда кнопка проверяется.
да, теоретически момент опроса порта может совпасть с моментом нажатия кнопки и тогда из-за дребезга кнопка определится не нажатой. ну, подержишь эту кнопку еще не менее 0,5 сек. чтобы зафиксировать ее нажатие.

опрос кнопок один раз за полсекунды - это абсолютный минимум, чтобы дребезг не влиял.
и этот абсолютный минимум прекрасно работает!!! я у себя проверял.
но реально я делаю чуть сложнее. я у себя делаю опрос кнопок каждую 0,1 сек. и подсчитываю число нажатых состояний для каждой кнопки.
за весь интервал 0,5 сек. получается максимум 5 срабатываний нажатого состояния.
когда я обрабатываю состояние кнопок (один раз за 0,5 сек.), то не менее 3 срабатываний считается за нажатое состояние.
но это уже излишество. и поскольку абсолютный минимум прекрасно работает, я собираюсь отказаться от этого излишества, и опрос кнопок сделал тоже один раз в 0,5 сек.

Re: Программный антидребезг

Пн дек 12, 2016 09:50:02

Щелчок тактовой кнопкой всё-таки длится короче 0.5 сек.

Re: Программный антидребезг

Пн дек 12, 2016 10:04:16

Щелчёк - это ~ 0.2...0.3 сек.
А ждать 0.5 сек нажатой кнопку, для одного клика - мазохизм.
Встречался я с пром-приборами, ПО для которых писались такими горе-программистами. Одно только лазанье по меню вызывает раздражение, переходящее в нервоз. Не говоря уж о том, когда увеличиваешь/уменьшаешь цифровые значения параметров :facepalm:

Re: Помогите опросить кнопку

Пн дек 12, 2016 11:54:58

Аlex писал(а):Щелчёк - это ~ 0.2...0.3 сек.
это время реакции человека, а не время, затрачиваемое на замыкание контактов.
к тому же, за 0,2 сек. далеко не каждый человек сможет без опоздания среагировать на появившееся изменение и без опоздания отпустить кнопку.
Starichok51 писал(а):мне приходилось работать с промышленными приборами, у которых приборный цикл составлял 0,32 сек.
0,32 сек. вполне согласуется с твоим понятием "щелчка" кнопкой. и как я уже сказал, 0,32 сек. вполне достаточно, чтобы успеть вовремя отпустить кнопку. и как я уже сказал, что даже для 0,32 сек. нужно время для приобретения навыка вовремя отпускать кнопку.
первое время работы с этими приборами (за 0,32 сек.) и я сам и ВСЕ люди безнадежно опаздывали вовремя отпускать кнопку. и только со временем появлялся навык вовремя реагировать.
а то, что я решил увеличить время на реакцию человека до 0,5 сек. - это только мое личное дело.
горе-программист тот, кто не заботится о людях, а думает, что абсолютно все люди обладают такой же "мгновенной" реакцией, как он, и делают кнопочный цикл 0,2 сек.
а 0,5 сек. - это забота о людях, которые будут повторять мои конструкции, чтобы они потом не плевались на слишком быструю смену показаний прибора.

Re: Помогите опросить кнопку

Пн дек 12, 2016 12:01:08

Причём тут быстрая смена показаний ? Быстро меняться должно когда держишь кнопку длительное время, и это может быть доп. опцией, упрощающей большие изменения. А на клик прибор должен реагировать адекватно, т.е. щёлкнул - показания сменились, а не ждать какое-то время. Бывает нужно щелчками подогнать показания, при этом ждать, когда прибор отреагирует на щелчок 0.5 сек - некомильфо. Частота таких нажатий может достигать более 5 Гц.
Клик - это событие, происходящее при изменении одного состояния на другое, а не время удержания кнопки. Именно изменение состояния и нужно обрабатывать. Это избавит от предсказывания реакции пользователя. Он нажал->отпустил - клик прибором зафиксирован. А сколько он будет её удерживать, 0.1 сек или 1.0 сек - это уже его дело.

горе-программист тот, кто не заботится о людях
Тут я совершенно согласен. По этому я и назвал тех "программистов" таковыми. Они совершенно не думали о пользователях, а делали как им хочется(проще, ...).

Re: Помогите опросить кнопку

Пн дек 12, 2016 12:52:53

Аlex писал(а):А сколько он будет её удерживать, 0.1 сек или 1.0 сек - это уже его дело.
на этот случай у меня есть бит блокировки кнопок. можно удерживать хоть "до посинения".
для лучшего понимания вкратце изложу суть.
у меня есть список параметров. его можно "листать" вперед или назад.
вот тут я с тобой могу согласиться, что переход от одного параметра к другому может проходить меньше, чем за 0,5 сек. например, за 0,1 сек.
и другие действия, не связанные с изменением какого-либо параметра, тоже можно делать за 0,1 сек.
а когда у меня происходит изменение значения параметра, то для изменения на большую величину кнопка удерживается на продолжительное время, пока не подберемся близко к требуемому значению. и вот тут интервал срабатывания кнопки должен быть относительно медленным, чтобы пользователь успел вовремя отпустить кнопку.
я вот этот относительно медленный интервал (0,5 сек.) выбрал основным для любых действий с кнопками.

Re: Помогите опросить кнопку

Пн дек 12, 2016 13:22:11

люблю я теоретизирование :)))

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

сделал я два уровня абстракции: нижний, где определена единственная функция get_scancode(), возвращающая код нажатой кнопки, и верхний, где реализована функция get_key(), реализующая нужный протокол обработки.

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

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

задержка перед автоповтором у меня обычно от 1 до 3 секунд, в зависимости от проекта. а задержка автоповтора обычно 0,5-0,3 сек. такие задержки позволяют четко отличить ДОЛГОЕ УДЕРЖАНИЕ кнопки от кратковременного нажатия, и при этом позволяет производить достаточно быстрое изменение параметра при удержании, но не требует особой реакции от пользователя.

как-то так...

Re: Помогите опросить кнопку

Пн янв 30, 2017 01:03:22

Еще раз обьясняю. Тебе нужно отдельно сделать таймер или задачу в ОС создать, которая будет постоянно вызывать опрос каждые 10мс. Идеально если это будет программный таймер средствами ОС повторяющийся с периодом 10мс.

Вставляешь на каждую кнопку этот код:

Код:

uint8_t Button_count_POWER = 0;
uint8_t Button_state_POWER = 0;
uint8_t Button_repeat_POWER = 0;

#define DELAY_PRESS_BUTTON 5
#define BUTTON_REPEAT 50
#define BUTTON_POWER_PRESS    (GPIOA->IDR & GPIO_Pin_0)

 if (BUTTON_POWER_PRESS != 0)
   {
      if (Button_count_POWER < DELAY_PRESS_BUTTON)
         Button_count_POWER++; else
      {

         if (Button_state_POWER == 1) //Автоповтор
         {
            
            Button_repeat_POWER++;
            
            if (Button_repeat_POWER == BUTTON_REPEAT)
            {
               Button_repeat_POWER = 0;
        //
        //Код обработки повторного нажатия кнопки.
        //
           }
            
            
         }

         if (Button_state_POWER == 0) //Одинарное нажатие
         {
            Button_repeat_POWER = 0;
            Button_state_POWER = 1;
        //
        //Код обработки нажатия кнопки.
        //
         }
         
      }
   } else
   {
      if (Button_count_POWER > 0)
         Button_count_POWER--; else Button_state_POWER = 0;
   }


И все будет работать сладко и гладко. Больше ничего не надо, ни прерываний, ни конденсаторов на линию. Работать будет железно как танк. Частоту опроса регулируешь таймером подстраиваешь отклик системы, а переменная DELAY_PRESS_BUTTON регулирует паузу нажатия и отпускания, фильтр.

Добавлено after 29 minutes 37 seconds:
Re: Программный антидребезг
Demiurg писал(а):Oxford - ваше видео тонкое послатие найух. Что вы показали, спрашивается? Какое-то ублюдочное решение? Ублюдочное не в плане автора, а самого решения.
Если вздумаете возмутиться. Вот мой пример. Ссылка.

Примерщикам: Везде, во всех ваших примерах я вижу стремление показать насколько короче ваш код. То есть подспудное желание показать, типа вот как у меня короче чем у тебя. Но каждый раз я вижу какие-то огрызки решения. Вы покажите полностью ваш код. От опроса кнопок до определения кода кнопки. И как остальным модулям реагировать на события, коды кнопок и так далее.


В чем истерика? Логика работы такая же, реализация немного другая и все более туповатая.

Re: Помогите опросить кнопку

Пн янв 30, 2017 13:54:39

Oxford писал(а):
Demiurg писал(а):Примерщикам: Везде, во всех ваших примерах я вижу стремление показать насколько короче ваш код.
Нe всякий мужчина (да и девушка) поймёт, что если двое хвастаются "у кого - короче" - значит программисты! :))
P.S.: Сам этим грешу часто… :)))

Re: Помогите опросить кнопку

Ср фев 01, 2017 08:03:36

Oxford писал(а): будет постоянно вызывать опрос каждые 10мс.
учитывая время реакции человека, ты можешь объяснить, а на хера нужно так часто опрашивать кнопки?

Re: Помогите опросить кнопку

Ср фев 01, 2017 12:40:54

При дин. индикации, реакция глаза человека тоже выше 25 Гц не видит, хотя все эту частоту завышают. Тоже спросите "нахрена ?" ?
Я, например, вообще делаю переключения каждую миллисекунду. А это - на порядок выше частоты реакции глаза (при 4-ех индикаторах). И на вопрос "нахрена так часто ?" отвечу - просто мне так удобно, т.к. во всех проектах имею системные миллисекундные тики.
К чему я это всё... А к тому, что реакция человека совсем тут не при чём. 10 мс. выбрано из соображений подавления дребезга, а не какой-нибудь физической возможности человека. Общепринятое время = ~10...20 мс.
Я делаю 20 мс. , проблем пока не было обнаружено, в т.ч. и с пром-устройствами.

Re: Помогите опросить кнопку

Ср фев 01, 2017 14:15:12

Starichok51 писал(а):
Oxford писал(а): будет постоянно вызывать опрос каждые 10мс.
учитывая время реакции человека, ты можешь объяснить, а на хера нужно так часто опрашивать кнопки?



Можно делать опрос и реже если не требуется быстрая реакция GUI на кнопки.

Можете настроить под ваше приложение дефайнами и периодом таймера.
#define DELAY_PRESS_BUTTON 5
#define BUTTON_REPEAT 50

Дело в том что у кнопки два состояния дребезга. Нажатие и отпускание. Время обработки кнопки увеличивается в двое.

В моем случае при таймере 10мс:
#define BUTTON_FILTER 2
#define BUTTON_REPEAT 20

Т.е. 20мс нажатие, 20мс отпускание 40мс обработка одного нажатия.
Если кнопка удерживается нажатой, работает авто повтор нажатий. При этом авто повтор имеет хорошую реакцию и период 200мс, авто повтор работает внутри алгоритма нажатия кнопки.
В итоге работает стабильно и с отличной производительностью. Без глюков, пропусков и прочих артефактов.

Re: Помогите опросить кнопку

Чт фев 02, 2017 13:00:37

а целесообразно ли включать програмно внутренние подтягивающие резисторы при наличие оных извне ?

Re: Помогите опросить кнопку

Чт фев 02, 2017 13:39:00

FreshMan писал(а):а целесообразно ли включать програмно внутренние подтягивающие резисторы при наличие оных извне ?
я бы ставил вопрос иначе: целесообразно ли ставить внешние резисторы при возможности подтянуть кнопку изнутри? и в подавляющем количестве домашних поделок-игрушек ответ был бы "нецелесообразно": дополнительные компоненты - это удорожание и усложнение.

в вашей же формулировке внутренние резисторы приведут лишь к небольшому увеличению потребляемого схемой тока, причем на мизерную величину. так что вопрос целесообразности не стоит - всё равно. или скажем так: будет подтяжка - не повредит, не будет - хуже не станет.
Ответить