Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Genadyi
17 / 17 / 3
Регистрация: 17.02.2010
Сообщений: 202
1

отследить прерывание

13.02.2020, 22:08. Просмотров 190. Ответов 8
Метки нет (Все метки)

Установил в кубе прерывание на 6-м и 7-м пине порта А (STM32F030F4) по фронту и спаду сигнала. И тут возник вопрос, а как это отследить? Чтение на пинах (6 и 7) если прерывание установлено только рисинг или фалинг, все идет без проблем, а вот как фиксировать оба уровня? Сигналы снимаю с щелевых датчиков и нужно определять когда окно датчика закрыто и открыто.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2020, 22:08
Ответы с готовыми решениями:

Прерывание от TIM2
Добрый день. Всплыла такая проблемка, что при инициализации NVIC void InteruptTIM2(void) { /*...

Прерывание от RTC
Добрый день уважаемые форумчане. Пытаюсь завести прерывание по аларму на STM32T-Dyscovery.при...

Прерывание по TMR0
Кто может помочь? Пытаюсь разобраться с прерываниями в PIC. С внешним прерыванием разобрался, но не...

Прерывание от энкодера
Всем привет. Понадобилось использовать энкодер в проекте. Подключил его к TYM1, все работает,...

Прерывание USB_LP_CAN1_RX0_IRQHandler
Здравствуйте. Пожалуйста помогите. Может Кто сталкивался. Камень STM32F103RC постоянно срабатывает...

8
_SayHello
798 / 483 / 157
Регистрация: 30.07.2015
Сообщений: 1,596
14.02.2020, 10:00 2
Genadyi, В прерывании проверяй уровень пина, если 1 значит был фронт, если 0 значит был спад.
0
Voland_
1751 / 1083 / 108
Регистрация: 04.01.2010
Сообщений: 3,757
14.02.2020, 12:27 3
Цитата Сообщение от _SayHello Посмотреть сообщение
проверяй уровень пина, если 1 значит был фронт, если 0 значит был спад.
не полный ответ. Нужно еще сверять текущее состояние с предыдущим сохраненным. Т.к. прерывание может быть вызвано помехой (вроде дребезга). В итоге, МК входит в прерывание, а состояние пина может уже вернуться в первоначальное состояние. это надо обязательно учитывать.
0
Genadyi
17 / 17 / 3
Регистрация: 17.02.2010
Сообщений: 202
14.02.2020, 20:38  [ТС] 4
По поводу дребезга, смотрел сигнал по осцылу( специально), дребезга не наблюдалось, да и откуда ему взяться это ведь не кнопка. Текстовку последнего варианта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)          // обрабока направления ШД
{
    if(GPIO_Pin == GPIO_PIN_4) delta_f = 500;
    if((GPIO_Pin == GPIO_PIN_6) == 1) lewo = 1;
    else lewo = 2;
    //{
        //if(HAL_GPIO_ReadPin(GPIOA, PinLevo_Pin) == GPIO_PIN_SET) delta_f = 400;//
        //else delta_f = 300;//lewo = 2;
    //}
    if((GPIO_Pin == GPIO_PIN_7) == 1) prawo = 1;
    else prawo = 2;
    //{
        //if(HAL_GPIO_ReadPin(GPIOA, PinPrawo_Pin) == GPIO_PIN_SET) delta_f = 200;//
        //else delta_f = 100;//prawo = 2;
    //}
}
Результат обеих вариантов (заремарино первоначально) одинаково и по фронту и по спаду. В основном цикле на мониторе смотрю результат (лево, право). Еще подумываю отказаться от прерывания по этим пинам и опрашивать их в основном цикле, дикость конечно, но .... Может есть способ какой еще?

Добавлено через 9 минут
Voland_ ваш вариант меня заинтересовал по сохранение предыдущего состояния пина, прикину как все это прикрутить, спасибо!
0
ValeryS
Модератор
8065 / 5948 / 789
Регистрация: 14.02.2011
Сообщений: 20,507
Завершенные тесты: 1
14.02.2020, 20:49 5
Цитата Сообщение от Genadyi Посмотреть сообщение
if((GPIO_Pin == GPIO_PIN_6) == 1)
и что ты рассчитываешь получить таким условием?
я расскажу что происходит
сравнивается сначала GPIO_Pin == GPIO_PIN_6 т.е равен ли вывод выводу GPIO_PIN_6 результат true\false
потом он приводится к 1\0 и это сравнивается с 1
и где просчет уровней? а без него не узнаешь фронт или спад
0
Genadyi
17 / 17 / 3
Регистрация: 17.02.2010
Сообщений: 202
14.02.2020, 21:10  [ТС] 6
воще-то эту строку я не вытянул из инета, и по логики ( GPIO_Pin == GPIO_PIN_7 ) это идет из прерывания, т.е. оно уже определено (0 или 1) и далее я проверяю чему оно равно, сравниваю с 1 (труе). До этого я использовал простое чтение пина на ифе обрабатывал. //if(HAL_GPIO_ReadPin(GPIOA, PinPrawo_Pin) == GPIO_PIN_SET) delta_f = 200;
Я может неправ, и если не трудно, чирканите как вы предлагаете строить обработку прерывания.
0
ValeryS
Модератор
8065 / 5948 / 789
Регистрация: 14.02.2011
Сообщений: 20,507
Завершенные тесты: 1
14.02.2020, 21:55 7
Цитата Сообщение от Genadyi Посмотреть сообщение
и по логики ( GPIO_Pin == GPIO_PIN_7 ) это идет из прерывания, т.е. оно уже определено (0 или 1) и далее я проверяю чему оно равно, сравниваю с 1 (труе).
ну и зачем козе баян? сравнивать true c true?
Цитата Сообщение от Genadyi Посмотреть сообщение
Я может неправ, и если не трудно, чирканите как вы предлагаете строить обработку прерывания.
ну например так
C
1
2
3
4
5
6
7
if(GPIO_Pin == GPIO_PIN_7)
    {
         if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET) 
             ....// здесь будем при восходящем фронте на 7 
        else  
          ...... //здесь будем при спадающем  фронте на 7 
    }
0
Genadyi
17 / 17 / 3
Регистрация: 17.02.2010
Сообщений: 202
14.02.2020, 22:14  [ТС] 8
Это первое что я делал(остатки остались хвосты заремарины). Пока нового я ничего не увидел, странно, я грешным делом подумал что чтение пина на прерывании не работает, глупость конечно, но тем ни менее мысль такая была. Ладно, попробую еще варианты. Всем спасибо за участие!
0
ValeryS
Модератор
8065 / 5948 / 789
Регистрация: 14.02.2011
Сообщений: 20,507
Завершенные тесты: 1
14.02.2020, 22:51 9
Цитата Сообщение от Genadyi Посмотреть сообщение
Это первое что я делал(остатки остались хвосты заремарины)
да, но только там
Цитата Сообщение от Genadyi Посмотреть сообщение
if(HAL_GPIO_ReadPin(GPIOA, PinPrawo_Pin)
что за HAL_GPIO_ReadPin? мы же не знаем вполне возможно банальная описка
и почему в одном и то же блоке и GPIO_PIN_7 и HAL_GPIO_ReadPin это одно и тоже или это разные пины?
0
14.02.2020, 22:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2020, 22:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Секундное прерывание
Настроил в stm32f103 RTC и прерывание. Итого: счетчик RTC меняется, а прерывание так и не...

Прерывание stm32f103c8t6
Добрый день форумчане!Может кто то сталкивался с подобной проблеммой? Суть.Настраиваю пин для...

Help! Прерывание и IAR
Всем привет. Может кто поможет? Проблема возникла с прерыванием, а точнее с обработчиком...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.