|
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 119
|
|||||||||||
STM32f100ret6b и матричная клава01.09.2016, 23:14. Показов 12583. Ответов 49
Метки нет (Все метки)
Народ помогите, зашёл в тупик. Написал код для матричной клавы.
Кликните здесь для просмотра всего текста
А тут вкратце я описал алгоритм Кликните здесь для просмотра всего текста
Алгоритм для матричной клавы Настроить входы и выходы Подать на все 4 пина входа клавы лог 1. Что бы при нажатии ЛЮБОЙ кнопки зафиксировать нажатие Настроить таймер, и прерывание, что бы входил в прер каждые 20 милисек. При настройке не запускать таймер! Настроить внешнее прерывание (что бы сработало при лог 1 на любом из сканирующих пинов клавы, 4 шт.) !!! Прогон кнопки - это каждые 20 мс проверять нажата ли одна и таже кнопка. Если она нажата в течении опред кол-ва прогонов, то считаем, что нажатие кнопки состоялось!!!!!! Ход событий: Нажали кнопу, сработало внешнее прерывание, ввалились в вектор сбрасываем флаги прерываний на всякий случай со всех 4 линий. Потому что нам важно что прер сработало при нажатии любой клавиши. вырубаем внешнее прерывание, что бы повторно не сработало от дребезга, убираем все лог 1 с четырёх пинов клавы. Врубаем таймер, чтоб начал тикать. При прохождении 20 мс от начала прерывания (через 20 мс дребезг как раз закончится), таймера, - вваливаемся в вектор при переполнении. Проверяем что прер прилетело именно от этого таймера, сбрасываем флаг прерывания, вызываем ф-ию скана клавы. Ф-ия выполнит скан и выход из прер таймера. Далее таймер опять тикает до 20 мс и всё повторяется. (Когда клавиша опознана таймер вырубается). ФункциЯ скана: два цикла. Один в другом. Внешний цикл скан по столбам, внутр цикл скан по строкам Во внешнем цикле просто гоняем лог 1 по 4 портам (сдвигаем). Подали лог 1 на 1 пин, и внутр цикл сканит все 4 строки, далее внеш цикл перебрасывает лог 1 на след пин, и опять внутр цикл сканит все 4 строки. И так пока не пройдёт все 4 столба. Итак. Во внеш цикле подаём(сдвигаем) лог 1 на 1 столб. Внутр цикл перебирает все 4 пина строк - проверяем есть ли на пинах лог 1. Если обнаруживем лог 1. записываем в переменную key символ. Прошли все циклы, в переменной key записана кнопка. Далее проверяем. Если предыдушего нажатия кнопки не было, то есть это первый прогон кнопки (используем переменную old_key). То old_key = код нажатой кнопки (key) Иначе(значит это 2 и более прогон кнопки) Сравниваем код текущего прогона с кодом в прошлом прогоне. Если совпадает, то увелич счётчик прогонов (переменная valid_key). иначе обнуляем счётчик прогонов. Далее после сравнивания прошлого прогона и текущего проверяем Если кол-во прогонов == 5 (то есть мы дошли до 5 прогонов при этом все коды прогонов совпадали), то присваиваем переменной find_key кнопку. Эта переменная видна в файле main, где считывается на пустоту. Если в ней аоявляется значение отличное от 0, то там выводим на дисплей. обнуляем valid_key, old_key, key, останавливаем таймер и врубаем снова разрешение на внешние прерывания. Итог: клава отлично работает. НО меня не устраивает, что когда держишь кнопку, на эран подряд быстро сыпятся цифры. С другой стороны это может и хорошо. Но мне надо что бы было одно нажатие - один символ. То есть нажал кнопку и если ее держишь - на экране только 1 символ и второй не появится, пока не отпустишь кнопку и не нажмёшь снова. Я пробовал сделать так: Кликните здесь для просмотра всего текста
Ввёл переменную key_down. Когда ыиксирую факт нажатия присваиваю ей 1. И не останавливаю таймер. При следующих проходах сканится тот вход на котором была 1. И если она всё ещё там - return. А если там появился 0, то обнуляю нужные переменные, останавливаю таймер и вкрубаю внешнее прерывание. Но у меня ничего не получается. Печатается 1 символ и всё. Даже нарисовал схему Я не знаю что делать в промежутке от фикса кнопки до момента, когда её отпускают. Как отловить что кнопка ещё удерживается?. Я знаю что может мой код не совсем корректен, так как обычно делают постоянный скан в циклах без перерыва. И по портам гоняют 0 а не 1. Но мне надо вот именно так, помогите с решением!!! плз
0
|
|||||||||||
| 01.09.2016, 23:14 | |
|
Ответы с готовыми решениями:
49
STM32 + матричная клава Работа с выводом данных на LCD1602 с мк STM32F100RET6B Матричная арифметика |
|
|
|
| 03.09.2016, 15:09 | |
|
Потому что при опросе вы видите только последствия и вынуждены судить о произошедшем по ним. А с прерываниями находитесь в гуще событий.
![]() Добавлено через 1 минуту Клавиатура, концевики, uart таймауты... Всё одно...
1
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
||
| 03.09.2016, 15:16 | ||
|
допустим у меня идет обработка критических данных, то же Фурье, и тут такая клава, обработай меня
0
|
||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 03.09.2016, 17:14 | ||
. Иначе все вышесказанное попросту бессмысленно. Я вам пытался объяснить, почему в случае с "матрицей" бессмысленно и даже вредно использовать прерывания по спадам и фронтам, но, похоже, вам все равно .ЗЫ: к слову, системы на прерываниях именно в таких случаях могут дико сбоить, потому что при плохом контакте вы получаете ОЧЕНЬ МНОГО прерываний. В итоге система будет просто висеть в состоянии, например, отжатой кнопки. Или дико тормозить. В случае же поллинга этой ситуации никогда не случится... Так что тут кому что. Я с вами соглашусь по поводу "никогда не говори никогда", но не более того.
0
|
||
|
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 119
|
|||||||||||
| 03.09.2016, 17:29 [ТС] | |||||||||||
|
ValeryS,
Вижу тенденцию отказаться от прерываний, неужели с ними так запарно? Я то как раз хотел чделать так, что бы когда клаву не используешь - таймер не тикал. Или я ошибаюсь, что постоянное тиканье таймера будет отбирать много ресурсов?
0
|
|||||||||||
|
|
|
| 03.09.2016, 17:57 | |
|
Voland_
В конечном итоге концевик это всё равно кнопка. В случае с матрицей, прерывания на время сканирования можно отключить. Это я вам уже вторую страницу пытаюсь объяснить. ЗЫ. Очень много прерываний тоже можно подавить. Бывает, что у прерываний есть отдельно флаги наличия/регистрации события, и отдельно флаги разрешения запуска обработчика по этому событию.
1
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||||||||||||||||||||||
| 03.09.2016, 18:03 | |||||||||||||||||||||||
|
ты знаешь для чего регистры BRR и BSRR ?? а делаешь чтение-модификация-запись
и в результате можно бросить не только 8 бит, а еще несколько ![]() в регистр BRR просто записывается число, и если бит числа установлен в 1 то соответствующий бит порта сбрасывается вот так
младшие 16 бит для установки, старшие для сброса одним движением руки можно установить и сбросить соответствующие биты вот например установка 0 бита и сброс 1
0
|
|||||||||||||||||||||||
|
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 119
|
|
| 03.09.2016, 19:10 [ТС] | |
|
ValeryS, BRR и BSRR знаю для чего, вот про маску... просто много где в примерах видел, как в BRR делают с маской. А число 0x00020001; обязательно записывать впереди с тремя нулями. Я проверял, если нули впереди не ставишь, ничего не меняется.
Rius Вот очень похоже не мой алгоритм, только он не работает. В 4 пункте вы написали про проверку флага прерывания. А это не этот EXTI->PR? Его же сбросить сразу надо после того как зашли в обработчик. И последний пункт... Допустим во время того, как разрешаем прерывание, отжали кнопку, а там дребезг, только уже не на нажатие, а на отжатие. И будет каша
0
|
|
|
|
|
| 03.09.2016, 19:32 | |
|
supercelt, возможно и PR.
Флаги обычно сбрасывают при входе в обработчике прерывания, чтобы обработчик не вызвался повторно. И в самом начале обработчика, чтобы дать возможность установиться новому флагу, если событие произойдёт за время выполнения обработчика. Добавлено через 4 минуты Код в МК выполняется очень быстро по сравнению с нажатием кнопок человеком. Прерывания я предлагаю использовать лишь для определения момента времени, когда состояние клавиатуры будет стабильным. Если при разрешении обработчика, на последнем шаге, возникнет дребезг, будет всё так же. Узнаете, что состояние изменилось. Можете определить, какая кнопка отжата. Если это не нужно, можете проигнорировать.
0
|
|
|
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 119
|
|
| 03.09.2016, 19:37 [ТС] | |
|
Rius Если это PR, то в прерывании таймера при проверке он будет всегда сброшен, так как он сбрасывается в обработчике прерывания, ДО того как затикает таймер
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||
| 03.09.2016, 19:38 | |||
|
нули в начале ставят чтобы показать размерность 0x00 байт 0x0000 слово 16 бит 0x00000000 двойное слово 32бит и все это 0 нужно это человеку, который сопровождает код, машине по барабану
0
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||||||
| 03.09.2016, 19:41 | |||||||
|
неправильно это
![]() ![]() вот так надо
0
|
|||||||
|
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 119
|
|
| 03.09.2016, 20:11 [ТС] | |
|
не ИЛИ, я говорю, что видел, как маской называют вот это |=
Rius А как без сброса в обработчике? Если его не сбросить, то можно сколько угодно влетать в прерывание по фронтам. У нас же как я понимаю внешнее прерывание что бы отследить нажатие. Вот как я мыслю. Нажали кнопку, прыгнули в обработчик прерывания, флаг не сбрасываем. А в это время идёт дребезг милисекунд так на 20. И пока этот дребезг будет идти мы всё время повторно будем ширкаться в прерывании.
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|
| 03.09.2016, 20:30 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 119
|
|
| 03.09.2016, 22:04 [ТС] | |
|
|= это всё равно что x = x | y
Добавлено через 11 минут Ruis. Сдаётся мне схема из 26 поста будет долбить символы при нажатой кнопке
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|
| 03.09.2016, 22:13 | |
|
0
|
|
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 03.09.2016, 22:47 | ||
. Пока что подводных камней не видно - в принципе ваш алгоритм работоспособный ).ЗЫ: на поллинге клавиатур и вообще, кнопках я делал полноценные клавиатуры, с повторами, отличием событий нажатия и отжатия, фильтрацией дребезга. Были проекты с отслеживанием длинных и коротких нажатий. И как раз ваше решение не очень-то адаптировано под отслеживание длительности нажатия на кнопку и реакции на него. Поллингом это было сделать проще, чем на таймерах.
0
|
||
|
|
||||||
| 04.09.2016, 10:18 | ||||||
|
supercelt, Voland_,
Оба моих варианта призваны только определить стабильное состояние клавиатуры и передать его куда-то дальше. А там уже можете и долбить им, и однократно обрабатывать, и время измерять. Для определения длительности нажатия, например, надо:
Добавлено через 3 минуты Последние три пункта лучше вынести из прерываний в главный цикл программы, либо в задачу RTOS. Добавлено через 1 час 35 минут Допилил демонстрационный код под пост 26. Красный светодиод, переключение - запуск/перезапуск таймера. Зелёный светодиод, состояние - зафиксированное состояние кнопки. Интервал у таймера большой для наглядности. Дребезг эмулируется частыми щелчками кнопки. Кликните здесь для просмотра всего текста
Плата STM32F429I-DISCO. Добавлено через 9 часов 26 минут Основная часть кода, связанная с примером: Кликните здесь для просмотра всего текста
Стоит отметить, что у STM есть несколько линий EXTI, объединённых в одно прерывание, 9-5 и 15-10. Поэтому строки матрицы стоит завести именно на эти пины. Также, флаги PR, выступающие флагами наличия дребезга, можно использовать и в периодическом методе опроса клавиатуры. Для определения установившегося состояния будет достаточно удостовериться, что с прошлого опроса ни один флаг не установился.
2
|
||||||
| 04.09.2016, 10:18 | |
|
Матричная система матричная прогонка Матричная прогонка Матричная игра Матричная арифметика Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|