0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
1 | |
stm32f1 как узнать, на каком порту сработало прерывание.05.12.2015, 16:34. Показов 11494. Ответов 31
Метки нет (Все метки)
Пусть 2-е кнопки висят на pa13 и pc13. Есть внешнее прерывание, срабатывающее по изменению состояния порта т.е. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING . Так вот, узнать в обработчике EXTI15_10_IRQHomdler имя пина можно так: if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESIT) , а вот как узнать порт: pa или pc?
0
|
05.12.2015, 16:34 | |
Ответы с готовыми решениями:
31
Как узнать какое прерывание сработало в stm32f051? Как узнать какое прерывание сработало в stm32f051? Прерывание потока не сработало Как в ms-dos настроить прерывание аппаратное по lpt порту? Как узнать, какое конкретно из условий сработало? |
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 225
|
|
14.12.2015, 20:22 | 21 |
Одинаковые пины можно использовать для опроса энкодера, где один пин вам необходим для прерывания, а второй для определения направления вращения.
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 02:02 | 22 |
Короч, не работает чтение текущего состояния. Объясняю: пришло прерывание, в нём читаем текущее состояние .... и как раз в этот момент идёт дребезг ... итого запросто можно проморгать изменение состояния. Попробую с регистрами, по другому никак.
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 02:12 | 23 |
Господа, а как узнать, на пине изменилось состояние с 0 на 1, или с 1 на 0? Учитывая предыдущее сообщение, без чтения текущего состояния через HAL_GPIO_ReadPin ?
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
15.12.2015, 19:12 | 24 |
Сработало прерывание(для примера вход стал 0)-> запустили таймер на 10-20мс(для кнопок более чем)-> как таймер дотикал читаете состояние пина-> если там по прежнему 0-> кнопка точно нажата, это не помеха, делаем что-то нужное->если там 1(прилетела помеха)-> ничего не делаем, ждем следующее прерывание. Это в случае если отрабатываем кнопки.
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
15.12.2015, 20:08 | 25 |
Если только первый - то можно просто тут же отключить прерывание, и включить его спустя некоторое время. Хотя любая помеха/наводка даст ложные срабатывания. Бывало так, что на 100мгц осцилле я видел условно 10 ложных срабатываний при дребезге, а по факту прерывание насчитывало 12-16 срабатываний. Емкость и прочие аппаратные решения для антидребезга мне кажутся избыточными, т.к. все можно решить программно. Rising/falling решает битовым флагом, который помнит предыдущее состояние.
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 20:17 | 26 |
Да, дело в кнопках, но над ними нужен полный контроль: когда нажали, когда отпустили, текущее состояние. Сделал так: при прерывании запоминаем время, а в отдельном потоке, через определённый интервал, читаем состояние. Всё работает. Просто я изначально думал, что прерывание на стм32 несёт полный набор информации, но, увы, пришлось "костылять", потратив на это много времени. И чего мешало встроить аппаратный модуль антидребезга, и в прерывание подавать полную информацию - ума не приложу.
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
15.12.2015, 20:24 | 27 |
Это ни разу не костыли, а нормальный рабочий процесс написания ПО.Обработка антидребезга так вообще классика. Аппаратная отработка антидребезга внутри контроллера - не слышал ни разу. Прерывания почти во всех МК несет лишь одну информацию - я случилось, вот тебе прерывание, делай что тебе нужно. Вам тогда снаружи надо триггер вешать, вот он точно даст только 1 импульс. И, кстати, кнопки, т.е. человеко-машинный интерфейс - это крайне медленная штука, относительно работы МК. Кнопки можно просто раз в 50мс опрашивать, даже без прерываний.
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 20:51 | 28 |
Сообщение от Hotd
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 20:52 | 29 |
Сообщение от SGE
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
15.12.2015, 20:55 | 30 |
А зачем для кнопки делать rising/falling? Только для того, чтобы знать время нажатия? Так куда проще по срабатыванию falling (после обработки антидребезга), запустить периодический таймер, пусть каждые 50 мс, и при каждом запуске таймера смотреть, нажата еще кнопка или нет. Как только увидели что кнопку отпустили - смотрим сколько раз таймер запустился, это и есть наша длительность. Мне кажется разрешения 50 мс для измерения длительности нажатия кнопки за глаза, там даже 100 мс скорее всего пойдет, контроллер сильно не нагрузит. У кнопок вообще может по факту лишь 3 состояния - кнопку нажали, кнопку отпустили, кнопку долго держали нажатой. Обычно все действия делаются по отжатию кнопки.
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 20:59 | 31 |
Сообщение от SGE
0
|
0 / 0 / 0
Регистрация: 02.12.2015
Сообщений: 46
|
|
15.12.2015, 21:02 | 32 |
Сообщение от Hotd
0
|
15.12.2015, 21:02 | |
15.12.2015, 21:02 | |
Помогаю со студенческими работами здесь
32
Как узнать раскладку клавиатуры? Как её изменить? Как узнать, на каком языке текст в файле? Не работает прерывание по порту B в PIC16F887 (MikroC) Как узнать какой IP на порту Как узнать работает ли в порту интернет? Как програмно узнать к какому com порту подключена ардуина Узнать по какому конкретному условию сработало общее условие Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |