Как поместить цикл в case оператора switch
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Пример в студию. Без комментариев. Готовый проект. 3 кнопки. 3 выхода. Подавление дребезга.
- Реклама
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
Подавление дребезга? Давайте разберемся. Возможно, у вас снова случится разрыв шаблона, но тем не менее...
Входы кнопок опрашиваются с некоторыми интервалами времени (за исключением случаев использования прерываний по фронту). На практике, интервал от 5 мс до 50 мс перекрывает дребезг даже довольно разболтанных кнопок. Плюс к этому, конденсатор параллельно кнопке так же фильтрует дребезг. Это обычная, нормальная практика, ничего удивительного. Конденсатор защищает и от случайных выбросов и ошибочных из-за них срабатываний. Если всего этого недостаточно, можно добавить интегрирующий алгоритм.
Входы кнопок опрашиваются с некоторыми интервалами времени (за исключением случаев использования прерываний по фронту). На практике, интервал от 5 мс до 50 мс перекрывает дребезг даже довольно разболтанных кнопок. Плюс к этому, конденсатор параллельно кнопке так же фильтрует дребезг. Это обычная, нормальная практика, ничего удивительного. Конденсатор защищает и от случайных выбросов и ошибочных из-за них срабатываний. Если всего этого недостаточно, можно добавить интегрирующий алгоритм.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
6 страница пошла. Фейспалм.
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
Да я то без проблем, да вот только вы снова не разберетесь в тексте, который не соответствует вашим шаблонам и вашей форме записи. Вы же настолько зашорены своими рамками, что даже не видите иной формы записи того же самого. За вас же беспокоюсь, у вас же снова случится разрыв шаблона и срыв башни
Еще и днище выбьет 
Demiurg, вобщем, идите лучше проспитесь
утро вечера мудреннее. А с утра снова начнете удалять свои мессаги, чтоп стыдно не было 
Demiurg, вобщем, идите лучше проспитесь
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
У меня нет никаких разрывов шаблонов. Не стесняйтесь. Вы 6 страниц показываете, что специалист. И даже графы умеете читать. Пример в студию.
- Реклама
- Сообщения: 44
- Зарегистрирован: Пн окт 05, 2020 17:20:11
Ребята у меня предложение пока только 6 страниц написали! Подправьте мой код для переключения выходов с фиксацией.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Я тебе пример дал. 3 кнопки. Нажатие каждой кнопки отключает все выходы и переключает соответствующий выход. Пустьмы включили устройство. Все выходы отключены. Нажали 1-ую кнопку, включился 1 -ый выход. Нажали 2-ую кнопку, отключился первый выход, включился второй. Повторное нажатие кнопок выключает соответствующий выход.
Может таки со схемки начать, а уж под нее и пример нарисовать конкретно.
Иначе это будут только теоретические пространные обсуждения.
Кстати... никто не запрещает и аппаратный антидребезг применять - как на "перекидном контакте" и рассыпухе, так и на специализированных емкостных кнопах...

Иначе это будут только теоретические пространные обсуждения.
Кстати... никто не запрещает и аппаратный антидребезг применять - как на "перекидном контакте" и рассыпухе, так и на специализированных емкостных кнопах...
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
В одном промышленном приборе видел rs-триггеры на кнопки. Видать, не хватило тяму тогда программно антидребезг сообразить. 
Конденсаторы ставить чревато. Могут пины МК выгореть. Плюс, возможное обгорание контактов.
Конденсаторы ставить чревато. Могут пины МК выгореть. Плюс, возможное обгорание контактов.
Не обязательно - все зависит от требований и особенностей устройства.
Когда программа позволяет опрос делать, а когда лишнее время на сканирование не слишком удобно.
Удачнее всего кнопы с антидребезгом при свеодиодном индикаторе "на рассыпухе" уживаются. Или в программе еще какой основной блок непрерывным сканированием выходных (внутренних)линий/условий занят. Да и кнопы с "перекидным контактом" на сегодня относительная редкость.

Когда программа позволяет опрос делать, а когда лишнее время на сканирование не слишком удобно.
Удачнее всего кнопы с антидребезгом при свеодиодном индикаторе "на рассыпухе" уживаются. Или в программе еще какой основной блок непрерывным сканированием выходных (внутренних)линий/условий занят. Да и кнопы с "перекидным контактом" на сегодня относительная редкость.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Опрос кнопок с антидребезгом это всегда выполнение кода, хоть в основном цикле, хоть в прерывании. В моем примере сделано в основном цикле. И вы знаете мой подход. Дробление выполнения всех задач. Итерация основного цикла должна выполняться с запасом в течении системного тика. В моих устройствах даже динамическая индикация часто в основном цикле.
При нынешних мк затраты на подавление антидребезга малы, чтобы воспринимать это как какие то траты ресурсов.
При нынешних мк затраты на подавление антидребезга малы, чтобы воспринимать это как какие то траты ресурсов.
Просто озвучены возможные варианты.
Это такой же подход, как и использование специализированных микросхем для внешней обвязки устройства (или самодельных на дополнительных МК). Что лучше, а что хуже - это уж остается решать в каждом отдельном случае в зависимости от опыта, знаний и имеющихся ресурсов.
К примеру Воть такая "кнопа" весьма удобна:
https://img.radiokot.ru/files/20529/1g6cmrs760.JPG
https://img.radiokot.ru/files/20529/286589ggbo.jpg
https://img.radiokot.ru/files/20529/2d6voi2hag.jpg
НО... нуждается в подаче питания, а пленочных клавиатур да механических кноп "на замыкание" достаточно много.
В то же время бывают варианты схем, где можно антидребезг заменить на контроль допустимых соседних состояний (как например для энкодера с парой контактов)...

Это такой же подход, как и использование специализированных микросхем для внешней обвязки устройства (или самодельных на дополнительных МК). Что лучше, а что хуже - это уж остается решать в каждом отдельном случае в зависимости от опыта, знаний и имеющихся ресурсов.
К примеру Воть такая "кнопа" весьма удобна:
https://img.radiokot.ru/files/20529/1g6cmrs760.JPG
https://img.radiokot.ru/files/20529/286589ggbo.jpg
https://img.radiokot.ru/files/20529/2d6voi2hag.jpg
НО... нуждается в подаче питания, а пленочных клавиатур да механических кноп "на замыкание" достаточно много.
В то же время бывают варианты схем, где можно антидребезг заменить на контроль допустимых соседних состояний (как например для энкодера с парой контактов)...
наиболее прямой путь это в очень коротком прерывании с периодом 5..50mS отслеживать изменения битов входного порта, всего разом или по маске если менее 8 входов или 2-3 портов если их 16 или 24. вычисление изменений 8входов это 1байт памяти и 2-3 комманд на порт, одна из которых xor )). фиксируем отсутствие изменений между соседними тиками и наличие изменений от зафиксированного значения и понимаем что соответствующие входы изменились. все делается элементарно групповыми битовыми командами без ветвлений. периодом таймера выставляем толерантность к дребезгу. если параноидальная защита от дребезга -отслеживаем/храним состояние всех битов входного слова за несколько более коротких тиков, можно хоть счетчиками набирать тик-кворум
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
[uquote="Demiurg",url="/forum/viewtopic.php?p=4301780#p4301780"]Пример в студию.[/uquote]
Да нивапрос
Однако, предупреждаю относительно разрыва вашего шаблона мЫшления. Структура компоновки файлов, характер использования заголовочных файлов, да и вообще, более сложный АРМ-подобный микроконтроллер порвет ваши рамочные шаблоны вклочья и сорвет крышу
Причем, я тут не стал делать метод таблицы переходов, чтобы у вас вдобавок днище не выбило
Вобщем, "учись, студент"(С) А если будут какие-то недовольства, то есть два варианта: а) вы ничего не поняли и порвали свой шаблон и б) "я художник, я так вижу". Потому что программист должен обладать гибким мышлением и уметь задачу решать гибко, не зашоренно на рамочных шаблонах.
Да нивапрос
- Вложения
-
- Blink.zip
- (128.87 КБ) 40 скачиваний
- Сообщения: 44
- Зарегистрирован: Пн окт 05, 2020 17:20:11
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
Я думаю, сенсей Demiurg должен это сделать, он же мастер. Я то че, я так, шанешки по карманам тырю... 
В принципе, Demiurg чето ж написал. Наверно оное работает, на первый взгляд вроде всё для этого есть. Даже если нелогично написано, но в принципе, можно попробовать. Пусть он сам ответит за свой код.
uuu000, в вашем коде функции button_KA, button_KA1, button_KA2 должны присваивать разные значения (1, 2, 3) глобальной переменной mode, которая потом будет определять через switch-case, какому светодиоду разрешить мигание. Или хотябы на первых порах просто включение.
Чтобы сделать мигания светодиодов, нужно сделать три счетчика (по одному для каждого светодиода), которые будут декрементироваться одновременно в конце цикла while(1). И как только какой счетчик дойдет до 0 от начального значения, это будет означать истечение интервала. Можно через if(cnt1 == 0) переключить светодиод на противоположное состояние, а переменной cnt1 заново задать начальное значение. Для остальных счетчиков так же.
Теперь, чтобы разрешать и запрещать мигания, можно разрешать или запрещать декременты счетчиков cnt1, cnt2, cnt3. Или же наоборот, при работающих счетчиках через доп.проверку условия переключать светодиод или принудительно оставлять его выключенным.
В принципе, Demiurg чето ж написал. Наверно оное работает, на первый взгляд вроде всё для этого есть. Даже если нелогично написано, но в принципе, можно попробовать. Пусть он сам ответит за свой код.
uuu000, в вашем коде функции button_KA, button_KA1, button_KA2 должны присваивать разные значения (1, 2, 3) глобальной переменной mode, которая потом будет определять через switch-case, какому светодиоду разрешить мигание. Или хотябы на первых порах просто включение.
Чтобы сделать мигания светодиодов, нужно сделать три счетчика (по одному для каждого светодиода), которые будут декрементироваться одновременно в конце цикла while(1). И как только какой счетчик дойдет до 0 от начального значения, это будет означать истечение интервала. Можно через if(cnt1 == 0) переключить светодиод на противоположное состояние, а переменной cnt1 заново задать начальное значение. Для остальных счетчиков так же.
Теперь, чтобы разрешать и запрещать мигания, можно разрешать или запрещать декременты счетчиков cnt1, cnt2, cnt3. Или же наоборот, при работающих счетчиках через доп.проверку условия переключать светодиод или принудительно оставлять его выключенным.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
MLX90640, Не впечатлил. Не соответствует твоим заявлениям о гениальности, умению читать графы, гибкости мышления, отсутствия шаблонов.
Я ради интереса глянул с чего наш спор вообще начался. Ладно я тогда выпил, меня подзанесло. А ты то что закусился? Якобы затронул твою шаблонность?
По видео. Что то ты быстро отснял. Ты слишком быстро понажимал кнопки, не совсем понятно, как ведут себя выходы.
По коду. Некоторые моменты у нас схожи. Местами нормально написано, местами коряво. Грубо, небрежно, второпях. Невнятные названия переменных. Ты такой типа крутой программер, что тебе плевать, что после тебя будут разбираться с кодом. Особенно начинающие. Как ТС. К примеру.
Вывод. Мы с тобой некоторые места написали практически идентично. Типа шаришь. Но ты небрежен. И совсем не уважаешь участников этого форума. Мне есть с чем сравнивать. Когда то учился у спецов с профильных форумов.
Автор Кирилл. Не Питер случайно?
Я ради интереса глянул с чего наш спор вообще начался. Ладно я тогда выпил, меня подзанесло. А ты то что закусился? Якобы затронул твою шаблонность?
По видео. Что то ты быстро отснял. Ты слишком быстро понажимал кнопки, не совсем понятно, как ведут себя выходы.
По коду. Некоторые моменты у нас схожи. Местами нормально написано, местами коряво. Грубо, небрежно, второпях. Невнятные названия переменных. Ты такой типа крутой программер, что тебе плевать, что после тебя будут разбираться с кодом. Особенно начинающие. Как ТС. К примеру.
Вывод. Мы с тобой некоторые места написали практически идентично. Типа шаришь. Но ты небрежен. И совсем не уважаешь участников этого форума. Мне есть с чем сравнивать. Когда то учился у спецов с профильных форумов.
Автор Кирилл. Не Питер случайно?
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
Ну что и ожидалось, у вас произошел разрыв шаблона
По коду. Ну так это общепринятая практика. Формат Doxygen, подписаны описания, и некоторые примеры. Это ж "модульность, инкапсуляция", как вы заявляли и чего у вас не получилось
Брежно или небрежно, но это общепринятая практика - разделять мухи от котлет и лошадей от коней
Уровни абстракции кода, понимашь ли.
Если "уважать участников форума", то... извините, под каждого не подстроишься. У кого-то такие шаблоны, у кого-то другие. Вон, у топикстартера вообще всё иначе. Я примерно так писал на этапах познавания программирования.
Ну а если учесть, что я уже 10 лет как не работаю с АВР, то я не могу писать так, как топикстартер. Я попытался написать попроще, без излишеств, наглядно-глядельно, даже блок-схему участка кода привел. Вы начали возмущаться. Ну чтож тут поделать то. Под всех не подстроишься. Особенно когда есть общепринятая практика.
Млляяя... Ну у ютуба есть уменьшение скорости в 4 раза. Там сделано всё то, что хотел топикстартер - три МИГАЮЩИЕ светодиода с разной частотой. Нажатие на кн.1 включает мигание светика1, нажатие на кн.2 включает мигание светика 2, нажатие на кн.3 - мигание светика 3. Повторное нажатие ТОЙ ЖЕ кнопки - выключает мигание светика.Ты слишком быстро понажимал кнопки, не совсем понятно, как ведут себя выходы.
По коду. Ну так это общепринятая практика. Формат Doxygen, подписаны описания, и некоторые примеры. Это ж "модульность, инкапсуляция", как вы заявляли и чего у вас не получилось
Брежно или небрежно, но это общепринятая практика - разделять мухи от котлет и лошадей от коней
Если "уважать участников форума", то... извините, под каждого не подстроишься. У кого-то такие шаблоны, у кого-то другие. Вон, у топикстартера вообще всё иначе. Я примерно так писал на этапах познавания программирования.
Ну а если учесть, что я уже 10 лет как не работаю с АВР, то я не могу писать так, как топикстартер. Я попытался написать попроще, без излишеств, наглядно-глядельно, даже блок-схему участка кода привел. Вы начали возмущаться. Ну чтож тут поделать то. Под всех не подстроишься. Особенно когда есть общепринятая практика.
Нее, не Питер, хотя там каждый год бываюНе Питер случайно?
Ммм... А я по книжкам учился, по-старинке. У авторов языка программирования и по мануалам производителей МК.учился у спецов с профильных форумов.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Ты все таки нездоров на голову в плане офигенного раздутого самомнения. У спецов, это значит, что мне есть с чем сравнивать. Ты уже по нескольким пунктам в этом топике налажал. Не впечатлил.
Так что выдохни. И с этого момента ты пишешь только конструктив. Не то какой ты опупительный спец (не доказал). Не то, какой наш уровень. (не доказал, не тебе судить). Сугубо по делу.
Если арм-щик иди и там доказывай свою состоятельность. Здесь тема AVR.
Я сегодня занят. Пока пример программных таймеров и как помигать светодиодом. Пример старый. Завтра попробую накидать под твой запрос. Три кнопки, три выхода.
Так что выдохни. И с этого момента ты пишешь только конструктив. Не то какой ты опупительный спец (не доказал). Не то, какой наш уровень. (не доказал, не тебе судить). Сугубо по делу.
Если арм-щик иди и там доказывай свою состоятельность. Здесь тема AVR.
Я сегодня занят. Пока пример программных таймеров и как помигать светодиодом. Пример старый. Завтра попробую накидать под твой запрос. Три кнопки, три выхода.
- Сообщения: 848
- Зарегистрирован: Ср авг 03, 2022 05:22:56
Нет, ну я же предупреждал об опасности разрыва вашего шаблона. А вы непослушались. Вот щас у вас днище и выбивает.
Впечатлил или невпечатлил, а я не актер, чтобы впечатлять. Ну и тут задача то примитивная, чтобы прям чето изобрести такое эдакое... Кстати, мож FreeRTOS смонтировать, для впечатления, а?
Там вообще переворот всего мЫшления - все функции, реализующие задачи, представляют собой бесконечные циклы без выхода.
Просто то, что вы считаете конечными автоматами, на самом деле является комбинаторной логикой. А для этого нет каких-то там опупенных впечатлений.
led - номер светодиода
act - action, действие (вкл/выкл)
state, st - состояние
p - previous, предыдущее состояние
tr1, tr2, tr3 - триггеры, в данном случае означающие переключение на противоположное состояние
rd - read, прочитанные данные
mode - режим работы
swtimer - переменная структуры софтовых таймеров
cnt - счетчик
period - период
function - указатель на функцию
run - флаг работы
flag - флаг состояния
timer - номер таймера
port - имя порта ввода/вывода
pin - номер ножки
Вроде всё понятно. Остальные непонятности относятся сугубо к самому МК STM32F401.
Пойду чай пить с горя. Беда то большая - какой-то хрен знает кто и из ниоткуда не впечатлился. Ну да, трагедия, трагедия. Даа.. Пхххахаха.
Тьфу, мля. Был бы кто-то там из великих, а то так, невесть кто невесть откеда, который учился по форумам у таких же как и он сам. Зато ЧСВ - охренеть какое. Вздумал тут всех научить "автоматному программированию", а сам то не отличает комбинаторной логики от автоматной, называет инкапсуляцией скидывание всех "лишних" дефайнов и макросов в заголовочный файл... Даааа, куда мы кОтимся...
Впечатлил или невпечатлил, а я не актер, чтобы впечатлять. Ну и тут задача то примитивная, чтобы прям чето изобрести такое эдакое... Кстати, мож FreeRTOS смонтировать, для впечатления, а?
Просто то, что вы считаете конечными автоматами, на самом деле является комбинаторной логикой. А для этого нет каких-то там опупенных впечатлений.
хм. Ну тоже, общепринятые сокращения, самодокументируемый код, ну а в doxygen-описании фукнции все входные и выходные параметры объяснены.Невнятные названия переменных.
led - номер светодиода
act - action, действие (вкл/выкл)
state, st - состояние
p - previous, предыдущее состояние
tr1, tr2, tr3 - триггеры, в данном случае означающие переключение на противоположное состояние
rd - read, прочитанные данные
mode - режим работы
swtimer - переменная структуры софтовых таймеров
cnt - счетчик
period - период
function - указатель на функцию
run - флаг работы
flag - флаг состояния
timer - номер таймера
port - имя порта ввода/вывода
pin - номер ножки
Вроде всё понятно. Остальные непонятности относятся сугубо к самому МК STM32F401.
Ну что поделать, ничего не поделаешь.Не то какой ты опупительный спец (не доказал)
Тьфу, мля. Был бы кто-то там из великих, а то так, невесть кто невесть откеда, который учился по форумам у таких же как и он сам. Зато ЧСВ - охренеть какое. Вздумал тут всех научить "автоматному программированию", а сам то не отличает комбинаторной логики от автоматной, называет инкапсуляцией скидывание всех "лишних" дефайнов и макросов в заголовочный файл... Даааа, куда мы кОтимся...
Последний раз редактировалось MLX90640 Вс окт 09, 2022 19:02:00, всего редактировалось 1 раз.


