реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> LPC11xx и обработка прерываний
deplen
сообщение Feb 6 2013, 16:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Код
volatile uint32_t count = 1;
void PIOINT1_IRQHandler(void)
{
    GPIOIntClear( 1, 9 );
    if( count != 7 )
    {
        count++;
    }
    else
    {
        LPC_GPIO0->MASKED_ACCESS[( 1 << 7 )] = ( 0 << 7 );
        count = 1;
    }
}

int main(void) {
    LPC_SYSCON->SYSAHBCLKCTRL |= ( 1 << 6 );
    NVIC_EnableIRQ( EINT1_IRQn );
    LPC_GPIO0->DIR |= ( 1 << 7 );               // настраиваем PIO0.7 на вывод (светодиод LPCXpresso)
    GPIOSetDir( 1, 9, 0 );

    GPIOSetInterrupt( 1, 9, 0, 0, 0 );
    GPIOIntEnable( 1, 9 );
}

Есть вот такой код обработки прерывания. Суть его такая: при запуске горит светодоид, но при 7 разовом нажатии на кнопку светодиод должен погаснуть. Но работает как то странно. То 7 раз нажать на кнопку и гаснет, то 6, то 4, то 3. Вобщем разные цифры.
В чем я ошибся при кодировании прерывания?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 6 2013, 16:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



в дребезге контактов?
кнопка - это не четкий фронт, она прерывание может и много раз вызвать...

Go to the top of the page
 
+Quote Post
Black Pahan
сообщение Feb 6 2013, 16:39
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 21-07-05
Из: Новосибирск
Пользователь №: 6 978



А дребезг контактов как устраняете?


--------------------
Из того, что дуракам закон не писан, вовсе не следует, что они не принимают участия в их написании.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 6 2013, 16:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(deplen @ Feb 6 2013, 18:16) *
В чем я ошибся при кодировании прерывания?

Может виноват дребезг кнопки?
Попробуйте выдать сигнал от другого порта lpc11, настроенного на выход.
Go to the top of the page
 
+Quote Post
deplen
сообщение Feb 6 2013, 16:51
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Просто задача стоит что бы по последовательности нажатий на кнопку запускать определенную функцию. Тобишь если кнопка такая не стабильная выхода нет?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 6 2013, 16:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(deplen @ Feb 6 2013, 18:51) *
Просто задача стоит что бы по последовательности нажатий на кнопку запускать определенную функцию. Тобишь если кнопка такая не стабильная выхода нет?

Проверяйте состояние входа с каким-нибудь периодом (100-500 раз в секунду). Если уровень на входе не меняется заданное количество раз, то состояние входа можно считать устоявшимся.

Или вешайте на вход какую-нибудь обвязку(RC-цепочку, триггер и тп).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 6 2013, 17:27
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



это просто.

после прерывания считает отсчет и ставите флаг что кнопка нажата, и если оказываетесь в прерывании а флаг стоит просто выходите, сняв прерывание, без отсчета.

а в основном цикле снимаете флаг только после того как кнопка была отжата несколько тактов
так вы будите реагировать на кнопку 1 раз в те несколько тактов если на кнопку быстро нажимать, или через те тактов после ее отпускания если долго. Подберите число тактов или таймер миллисекунд на 50 - 100 и задача решена. Но в целом это очень стандартная схема, могли для тренировки и сами придумать.
Go to the top of the page
 
+Quote Post
DVF
сообщение Feb 6 2013, 19:24
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 26-07-06
Из: Саратов
Пользователь №: 19 097



А разве ноги на вход не имеют Schmitt Trigger? Tогда можно попробовать подцепить к входу емкость на 0.22uF к GND, если нет более жестких требований по помехозащищенности.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Feb 6 2013, 22:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Триггеров Шмитта как правило нет. Но даже если есть конденсатор здесь очень плохо работает. Нужно ждать стабилизации показаний. Хорошие кнопки прекращают дребезжать за 5 мс, плохие - до 50 мс. Если нужно ловить частые нажатия, то нужно опрашивать кнопку примерно раз в 0.5 - 1 мс и если обнаружено 2 одинаковых состояния подряд, то можно считать что дребезг кончился. Это, правда, относится к хорошим кнопкам.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 7 2013, 06:50
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



0.5мс????
Вы реально способны нажимать на кнопку с частотой 1 кГц??? smile3046.gif
Значит вы - УНИКУМ! rolleyes.gif
А обычным людям вполне достаточно ~50Гц частоты сканирования кнопок.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Feb 7 2013, 14:51
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



0.5 мс, если Вы внимательно прочитали пост, - это время опроса дребезга. Общее время дребезга все равно будет не менее 5 мс. На два фронта - 10 мс, стало быть максимум скорости, которую можно отжать от кнопки - 100 Гц. И иногда удобно, чтобы кнопка срабатывала быстро и на короткий удар отвечала двумя переходами, а не блокировала его как дребезг.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 7 2013, 15:14
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Опрашиваю кнопки раз в 50 мс. При этом дребезг гасится автоматически если кнопка дребезжит менее 50мс. Если кнопка дребезжит более 50мс ее надо менять.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
deplen
сообщение Feb 7 2013, 15:54
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



а что делает HYSTERESYS в настройках каждого пина, не триггер ли это?

P.S. да и общий вопрос, вешать такой нестабильный фронт как кнопка на прерывание хорошая идея? или проще и надежнее сделать простой опрос пина в цикле?

Сообщение отредактировал deplen - Feb 7 2013, 16:14
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 7 2013, 16:22
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(deplen @ Feb 7 2013, 17:54) *
а что делает HYSTERESYS в настройках каждого пина, не триггер ли это?

Хоть бы и триггер, но кнопка всё равно дребезжать будет...

Цитата(deplen @ Feb 7 2013, 17:54) *
P.S. да и общий вопрос, вешать такой нестабильный фронт как кнопка на прерывание хорошая идея?

Чего ж хорошего в такой идее.

Цитата(deplen @ Feb 7 2013, 17:54) *
или проще и надежнее сделать простой опрос пина в цикле?

Лучше опрос, но не в цикле, а периодически.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 7 2013, 18:48
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



зависит от задачи.

Опрос кнопок в цикле частенько приводить к тупящим приложениям. Где надо каждый раз нажимать основательно, и ты каждый раз не уверен нажалось оно или нет...

Если главный цикл короткий, и фактически один опрос кнопок и малая индикация можно и полингом, если реакция на кнопки нужна четкая и быстрая, а главный цикл загружен, то прерывание.

И нет никакой проблемы в прерываниях на кнопки, просто надо в этом прерывании не тупить. Обработал клик, поставил флаг что кнопка была, и вывалился. Весьма корректное решение...

Периодический опрос - потенциально приложения пропускающие клики...

да гистерезис не особо поможет, конденсатор на кнопицу и пауза в опросе, ну и хорошая дорогая кнопочка.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2024 - 07:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016