Опрос кнопок микроконтроллером
Re: Опрос кнопок микроконтроллером
shonty, блин ну я же совсем подругому предлагаю, добавил выше
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Опрос кнопок микроконтроллером
AlexS4, да, этот код подходит и к моему "неполноценному" енкодеру подходит, а про помехи какие мысли будут?
Добавлено after 2 minutes 59 seconds:
но вопрос: по какому условию сдвигать регистр? если при каждом опросе, то если я буду крутить медленно - то такой паттерн никогда не соберётся...
если по изменению, то даже небольшой дребезг и будут большие пропуски, ведь этот паттерн это даже не 3, а 4 проверки и если система нестабильна - пройти их будет трудно...
Добавлено after 2 minutes 59 seconds:
но вопрос: по какому условию сдвигать регистр? если при каждом опросе, то если я буду крутить медленно - то такой паттерн никогда не соберётся...
если по изменению, то даже небольшой дребезг и будут большие пропуски, ведь этот паттерн это даже не 3, а 4 проверки и если система нестабильна - пройти их будет трудно...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Опрос кнопок микроконтроллером
я же выше напсал детально https://radiokot.ru/forum/viewtopic.php ... 3#p4683673
Добавлено after 6 minutes 4 seconds:
будет много попадений, пасаны ж утверждают что антидребезг это ненаучная хрень и КОТельников типа против такого
но если таки нет то можно перед этим применить алгоритм антидребезга проверяющий стабильность 2х последовательных семплов
(еще выше писал) тоесть двигать по 2му одинаковому сэмплу. для этого для таймерного прерывания потребуется выделить еше 1 статическую переменную (регистр) с предыдущим семплом в 2х битах.
Добавлено after 6 minutes 4 seconds:
думаю надо попробовать, скорее всего при правильном времени таймера семплирования ~5..20mSIvanoff-iv писал(а):если по изменению, то даже небольшой дребезг и будут большие пропуски, ведь этот паттерн это даже не 3, а 4 проверки и если система нестабильна - пройти их будет трудно...
будет много попадений, пасаны ж утверждают что антидребезг это ненаучная хрень и КОТельников типа против такого
но если таки нет то можно перед этим применить алгоритм антидребезга проверяющий стабильность 2х последовательных семплов
(еще выше писал) тоесть двигать по 2му одинаковому сэмплу. для этого для таймерного прерывания потребуется выделить еше 1 статическую переменную (регистр) с предыдущим семплом в 2х битах.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Опрос кнопок микроконтроллером
я попробую но с 3мя, а не с 4 мя семплами в памяти (заносить буду в 3 и 4 бит, т.е. 2 младших бита не будут использоваться и будут всегда нулями и в рабочем регистре и в маске сравнения)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Опрос кнопок микроконтроллером
нене это против концепции!! заноси все
а вот паттерны можно более короткие применять,
нормализовать окно (and/or mask) при этом ненужно, важно только чтоб неиспользуемые биты паттерна были заполнены теми же значениями на которые ресетится EcSeq переменная при совпадении паттерна (удобно 0 заполнять в avr)
оно же наполняет EcSeq по факту до 1го совпадения с паттерном, а дальше веравно ресетит и продолжается набор последовательности
ну конечно важно чтоб цикл проверки паттернов был достаточно быстрым (не перегруженным долгими непрерываемыми алгоритмами) чтоб не пропускать "лишние" семплы в последовательнось от таймера. но для энкодера это 10ки mS, так что врядли с этим могут быть проблемы.
а вот паттерны можно более короткие применять,
нормализовать окно (and/or mask) при этом ненужно, важно только чтоб неиспользуемые биты паттерна были заполнены теми же значениями на которые ресетится EcSeq переменная при совпадении паттерна (удобно 0 заполнять в avr)
оно же наполняет EcSeq по факту до 1го совпадения с паттерном, а дальше веравно ресетит и продолжается набор последовательности
ну конечно важно чтоб цикл проверки паттернов был достаточно быстрым (не перегруженным долгими непрерываемыми алгоритмами) чтоб не пропускать "лишние" семплы в последовательнось от таймера. но для энкодера это 10ки mS, так что врядли с этим могут быть проблемы.
Последний раз редактировалось AlexS4 Вт фев 18, 2025 11:07:43, всего редактировалось 1 раз.
Re: Опрос кнопок микроконтроллером
[uquote="chern55",url="/forum/viewtopic.php?p=4683031#p4683031"]из библиотеки Гайвера Александра замутил для себя на c++[/uquote]
В оригинале были битовые поля, 15 флагов занимали 2 байта, а у вас структура из 12 bool занимает 12 байт.
В оригинале были битовые поля, 15 флагов занимали 2 байта, а у вас структура из 12 bool занимает 12 байт.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Опрос кнопок микроконтроллером
я принцип не меняю и заношу всё, просто обрезаюне слева, а справа, при этом экономлю и флеш и время (зачем чтото чистить, если можно и не мусорить?) тем более у меня входы на 3 и 4 бит приходят - достаточно на 1 вправо сдвинуть и вуаля...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Опрос кнопок микроконтроллером
а чистить же всеравно нужно! сразу после обнаружения совпадения!
иначе последовательность будет продолжать совпадать с паттерном и вызывать процедуру +1 или -1 снова и снова ...пока энкодер еще раз не потрогают и он не даст чтото отличное от паттернов
а вот проверка длины записанной последовательности это ненужное усложнение (довольно критического к избыточностиям) обработчика прерывания
слева и справа - совершенно без разницы, я сначала ж предложил в младшие задвигать, а потом просто заметил что битовое бинарное представление паттерна становится более наглядным при задвигании семплов со старших битов (ror)
иначе последовательность будет продолжать совпадать с паттерном и вызывать процедуру +1 или -1 снова и снова ...пока энкодер еще раз не потрогают и он не даст чтото отличное от паттернов
а вот проверка длины записанной последовательности это ненужное усложнение (довольно критического к избыточностиям) обработчика прерывания
слева и справа - совершенно без разницы, я сначала ж предложил в младшие задвигать, а потом просто заметил что битовое бинарное представление паттерна становится более наглядным при задвигании семплов со старших битов (ror)
- chern55
- Нашел транзистор. Понюхал.
- Сообщения: 166
- Зарегистрирован: Сб янв 29, 2011 21:43:38
- Откуда: Чернь, Тульская обл
Re: Опрос кнопок микроконтроллером
[uquote="Adrift",url="/forum/viewtopic.php?p=4683888#p4683888"][uquote="chern55",url="/forum/viewtopic.php?p=4683031#p4683031"]из библиотеки Гайвера Александра замутил для себя на c++[/uquote]
В оригинале были битовые поля, 15 флагов занимали 2 байта, а у вас структура из 12 bool занимает 12 байт.[/uquote]
struct __attribute__((packed)) ButtonFlags {
bool btn_deb : 1;
bool hold_flag : 1;
bool isHolded_f : 1;
bool isRelease_f : 1;
bool isPress_f : 1;
bool step_flag : 1;
bool oneClick_f : 1;
bool isOne_f : 1;
bool inv_state : 1;
bool type : 1;
bool tickMode : 1;
bool noPin : 1;
};
спс за уточнение. не знал .
В оригинале были битовые поля, 15 флагов занимали 2 байта, а у вас структура из 12 bool занимает 12 байт.[/uquote]
struct __attribute__((packed)) ButtonFlags {
bool btn_deb : 1;
bool hold_flag : 1;
bool isHolded_f : 1;
bool isRelease_f : 1;
bool isPress_f : 1;
bool step_flag : 1;
bool oneClick_f : 1;
bool isOne_f : 1;
bool inv_state : 1;
bool type : 1;
bool tickMode : 1;
bool noPin : 1;
};
спс за уточнение. не знал .
Последний раз редактировалось chern55 Вт фев 18, 2025 12:33:39, всего редактировалось 1 раз.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Опрос кнопок микроконтроллером
AlexS4, да, после обнаружения совпадения - конечно, его (это совпадение) надо разрушить...
длину записанной последовательности я и не проверяю.
в остальном спор ни о чём: для мк без разницы, откуда задвигать...
просто мне нет нужды двигать до края (+2 команды), чтобы потом перед сравнением накладывать маску (ещё +2 команды), ведь там скраю, от которого двигаешь, неоткуда взяться данным и там и так всегда нули пока сам туда ничего не внесёшь, а значит ни маскировать ни чистить ничего не надо.
длину записанной последовательности я и не проверяю.
в остальном спор ни о чём: для мк без разницы, откуда задвигать...
просто мне нет нужды двигать до края (+2 команды), чтобы потом перед сравнением накладывать маску (ещё +2 команды), ведь там скраю, от которого двигаешь, неоткуда взяться данным и там и так всегда нули пока сам туда ничего не внесёшь, а значит ни маскировать ни чистить ничего не надо.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Опрос кнопок микроконтроллером
если я правильно понял, то доп двигать сэмпловый регистр никуда не нужно в любом случае,
просто неполный (короткий) паттерн должен быть дополнен 0ми (точнее дефолтным послесбросовым заполнением) с нужной стороны. это просто вопрос формирования хардкодной константы.
просто неполный (короткий) паттерн должен быть дополнен 0ми (точнее дефолтным послесбросовым заполнением) с нужной стороны. это просто вопрос формирования хардкодной константы.
Re: Опрос кнопок микроконтроллером
[uquote="Adrift",url="/forum/viewtopic.php?p=4664880#p4664880"][uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4664792#p4664792"]Ну может человек боится прерываний, не умеет нормально писать обработчики...[/uquote]
Если не используешь прерывания, но тем более нужно стараться писать максимально быстрый нигде подолгу не зависающий код, особенно если еще и критикуешь ЯВУ за недостаточную эффективность)[/uquote]
У меня с прерываниями простое правило: где необходимо, прыгаю в прерывания, в остальных случаях обработку флагов прерываний провожу в окнах основного круга программы. В прерывании минимально необходимые действия.
Вот и в моём примере с кнопками не использую таймер с прерываниями, условия задачи это позволяют. Здесь таймер с прерываниями – лишнее усложнение задачи, зачем это нужно.
[uquote="Adrift",url="/forum/viewtopic.php?p=4664880#p4664880"]ps. Я, кстати, вспомнил, что AQ29 на easyelectronics свой "современный ассемблер", который пока нигде нельзя списать, еще в 2017 рекламировал. По идее общедоступная версия уже должна быть на подходе )[/uquote]
Может быть, не я это был. В 2017 году всё только начиналось, да и было это несерьёзно.
[uquote="Starichok51",url="/forum/viewtopic.php?p=4665310#p4665310"]
Какой же это секрет? Всё в конечном итоге сводится к машинным кодам, фактически, к ассемблеру. Только на ЯВУ, которые нехороши, код сильно «раздувается».
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4683634#p4683634"]осталось разобраться с наводками... как никак МК напрямую к сетевой фазе подключен, да импульсный БП и 5 симисторов рядом...[/uquote]
Не представляю ситуацию, где можно МК напрямую подключить к сетевой фазе.
Если не используешь прерывания, но тем более нужно стараться писать максимально быстрый нигде подолгу не зависающий код, особенно если еще и критикуешь ЯВУ за недостаточную эффективность)[/uquote]
У меня с прерываниями простое правило: где необходимо, прыгаю в прерывания, в остальных случаях обработку флагов прерываний провожу в окнах основного круга программы. В прерывании минимально необходимые действия.
Вот и в моём примере с кнопками не использую таймер с прерываниями, условия задачи это позволяют. Здесь таймер с прерываниями – лишнее усложнение задачи, зачем это нужно.
[uquote="Adrift",url="/forum/viewtopic.php?p=4664880#p4664880"]ps. Я, кстати, вспомнил, что AQ29 на easyelectronics свой "современный ассемблер", который пока нигде нельзя списать, еще в 2017 рекламировал. По идее общедоступная версия уже должна быть на подходе )[/uquote]
Может быть, не я это был. В 2017 году всё только начиналось, да и было это несерьёзно.
[uquote="Starichok51",url="/forum/viewtopic.php?p=4665310#p4665310"]
открою тебе секрет: на любом языке программа ходит по кругу и по вложенным кругам.[/uquote]AQ29 писал(а): На ассемблере программа всегда либо ходит по кругу, либо переход между кругами.
Какой же это секрет? Всё в конечном итоге сводится к машинным кодам, фактически, к ассемблеру. Только на ЯВУ, которые нехороши, код сильно «раздувается».
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4683634#p4683634"]осталось разобраться с наводками... как никак МК напрямую к сетевой фазе подключен, да импульсный БП и 5 симисторов рядом...[/uquote]
Не представляю ситуацию, где можно МК напрямую подключить к сетевой фазе.
Re: Опрос кнопок микроконтроллером
[uquote="AQ29",url="/forum/viewtopic.php?p=4691015#p4691015"]Может быть, не я это был. В 2017 году всё только начиналось, да и было это несерьёзно.[/uquote]
Думаете много есть людей в русскоязычном пространстве которые, как минимум раньше, юзали АБ, а сейчас пишут для AVR на хорошем/современном/макро ассемблере которого нет в общем доступе, при этом С они не знают и примеры приводят на бейсике? И в каком там состоянии этот ассемблер был в 2017-м вообще не важно, вы и сейчас популяризируете то, чем другие пользоваться не могут )
Думаете много есть людей в русскоязычном пространстве которые, как минимум раньше, юзали АБ, а сейчас пишут для AVR на хорошем/современном/макро ассемблере которого нет в общем доступе, при этом С они не знают и примеры приводят на бейсике? И в каком там состоянии этот ассемблер был в 2017-м вообще не важно, вы и сейчас популяризируете то, чем другие пользоваться не могут )
- КРАМ
- Друг Кота
- Сообщения: 25163
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Опрос кнопок микроконтроллером
[uquote="AQ29",url="/forum/viewtopic.php?p=4691015#p4691015"]Не представляю ситуацию, где можно МК напрямую подключить к сетевой фазе.[/uquote]
А в чем вы видите проблему такого подключения? Намекну, в любой стиральной машине МК подключен напрямую к сетевой фазе. Точнее, может быть подключен с вероятностью 50%.
А в чем вы видите проблему такого подключения? Намекну, в любой стиральной машине МК подключен напрямую к сетевой фазе. Точнее, может быть подключен с вероятностью 50%.
Re: Опрос кнопок микроконтроллером
И не только в стиральной машине. В холодильниках МК зачастую питаются от бестрансформаторного БП.
-
Вячеслав М.
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн янв 13, 2025 15:24:02
Re: Опрос кнопок микроконтроллером
Давно читаю эту тему и просто опишу что у меня работает. 24 входа обновляются каждую миллисекунду в три байта, в последствии каждый бит проходит через фильтр переменной, устанавливаемой юзером длиной, берётся этот параметр из таблицы 24 + 24 байта, соответственно на 1 и 0 отдельно, Длина настройки байт, то есть 0....250, четверть секунды максимально. На каждый входной бит оперативка используется по два байта, на счётчик единиц и счётчик нулей отдельно. Получается в итоге то чтобы на выходе фильтра установилось значение это нужно насчитать совпадений всех выборок согласно таблицы от 0 - это получается выход в точности копирует вход, и до 250, когда нужно чтобы вход повторился 250 раз. Программа написана на ACM2 в AStudio. Потребляет в самом коротком случае 17us, до самого длинного случая 30us. Главный цикл 1 ms, вот и вызывается эта программа сразу после обмена вход/выход. Можно было конечно количество оперативки необходимой уменьшить, но у меня была главной задачей это скорость, по этому код долго вылизывался. Дополню ещё что для кнопки достаточно выставить 30.30 или 40.40 и уже никто не сможет протрезвонить кнопкой, кнопка чётко отрабатывает нажатие, дал специально стенд человеку чтобы он увидел дребезг, не смог, сдался. Чуть не забыл - ATmega 168 - 20 mgz.
Re: Опрос кнопок микроконтроллером
Эх, слабак человек.) То же мне тестировщик.(
-
Вячеслав М.
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн янв 13, 2025 15:24:02
Re: Опрос кнопок микроконтроллером
Я ему провода для подключения выдал на стенде, так что он мог подключать любые кнопки или концевики, ну светодиод при каждом нажатии просто инвертировал своё состояние.
Re: Опрос кнопок микроконтроллером
Ну какой это тест? Это не показатель. А люди, как известно, разные. Один просто шустрый, а другой чемпион и что?)
Вот ARV говорит что люди не могут нажимать быстрее 50 мс (не помню), а Старичок вообще 100 мс (не помню) ставит на нажатие. Это его реакция - значит другие быстрее быть не могут.)
Вот ARV говорит что люди не могут нажимать быстрее 50 мс (не помню), а Старичок вообще 100 мс (не помню) ставит на нажатие. Это его реакция - значит другие быстрее быть не могут.)
-
Вячеслав М.
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Пн янв 13, 2025 15:24:02
Re: Опрос кнопок микроконтроллером
Я сам юзал эту кнопку и нашёл правильный ответ - 30.30 или 40.40, Очень удобно, можно например 250 выставить, тогда получается удерживать надо. А если 0 выставить, то тут кошмар - светодиод остаётся в непредсказуемом состоянии, конечно от кнопки всё зависит, тогда я себе сказал - я программист и знаю как кнопку обмануть, тогда и пришла мысль чтобы кто нибудь другой эту кнопку понажимал.