Перейти к содержанию
    

LPC11xx и обработка прерываний

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. Вобщем разные цифры.

В чем я ошибся при кодировании прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в дребезге контактов?

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чем я ошибся при кодировании прерывания?

Может виноват дребезг кнопки?

Попробуйте выдать сигнал от другого порта lpc11, настроенного на выход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто задача стоит что бы по последовательности нажатий на кнопку запускать определенную функцию. Тобишь если кнопка такая не стабильная выхода нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто задача стоит что бы по последовательности нажатий на кнопку запускать определенную функцию. Тобишь если кнопка такая не стабильная выхода нет?

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

 

Или вешайте на вход какую-нибудь обвязку(RC-цепочку, триггер и тп).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это просто.

 

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

 

а в основном цикле снимаете флаг только после того как кнопка была отжата несколько тактов

так вы будите реагировать на кнопку 1 раз в те несколько тактов если на кнопку быстро нажимать, или через те тактов после ее отпускания если долго. Подберите число тактов или таймер миллисекунд на 50 - 100 и задача решена. Но в целом это очень стандартная схема, могли для тренировки и сами придумать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве ноги на вход не имеют Schmitt Trigger? Tогда можно попробовать подцепить к входу емкость на 0.22uF к GND, если нет более жестких требований по помехозащищенности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Триггеров Шмитта как правило нет. Но даже если есть конденсатор здесь очень плохо работает. Нужно ждать стабилизации показаний. Хорошие кнопки прекращают дребезжать за 5 мс, плохие - до 50 мс. Если нужно ловить частые нажатия, то нужно опрашивать кнопку примерно раз в 0.5 - 1 мс и если обнаружено 2 одинаковых состояния подряд, то можно считать что дребезг кончился. Это, правда, относится к хорошим кнопкам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0.5мс????

Вы реально способны нажимать на кнопку с частотой 1 кГц??? :smile3046:

Значит вы - УНИКУМ! :rolleyes:

А обычным людям вполне достаточно ~50Гц частоты сканирования кнопок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0.5 мс, если Вы внимательно прочитали пост, - это время опроса дребезга. Общее время дребезга все равно будет не менее 5 мс. На два фронта - 10 мс, стало быть максимум скорости, которую можно отжать от кнопки - 100 Гц. И иногда удобно, чтобы кнопка срабатывала быстро и на короткий удар отвечала двумя переходами, а не блокировала его как дребезг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем deplen

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

или проще и надежнее сделать простой опрос пина в цикле?

Лучше опрос, но не в цикле, а периодически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

 

да гистерезис не особо поможет, конденсатор на кнопицу и пауза в опросе, ну и хорошая дорогая кнопочка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...