Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с прерываниями
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
MrKot
Есть кнопка, которая при включеном положении замыкает контакт на землю. Соответствующую ногу я назначил входом, подтянул логическую единицу, и назначил прерывание при падении уровня на этой ноге

Код
PORT_ConfigurePins( &PORTB, PIN2_bm, false, false, PORT_OPC_PULLUP_gc, PORT_ISC_FALLING_gc );                        
PORT_SetPinsAsInput( &PORTB, PIN2_bm );
PORT_ConfigureInterrupt0( &PORTB, PORT_INT0LVL_MED_gc, PIN2_bm );


добавил функцию обработки прерывания
Код
ISR(PORTB_INT0_vect){      
    istimer = true;
    timer=0;    
    PORTD.OUTCLR = PIN1_bm;
    sendchar('S');  
    delay_ms(100);
}


Но обработчик прерывания отрабатывает два раза.
Если убрать задержку в прерывании, то обработка прерывания происходит большее количество раз, что возникает скорее всего из-за дребезга контакта, который в устройстве ничем не отфильтровывается. Собственно вопрос, почему происходит повторная обработка прерывания и как с этим бороться (желательно программно)?
Dog Pawlowa
Цитата(MrKot @ Oct 28 2009, 16:49) *
Собственно вопрос, почему происходит повторная обработка прерывания и как с этим бороться (желательно программно)?

Вначале придумайте алгоритм подавления дребезга, а потом подумайте как его реализовать. Не получится - спросите. Вы вроде правильно разобрались в причинах, и все равно спрашиваете у нас магическую антидребезговую команду?
Duhas
при входе в прерывание чистить свой флаг не вариант?
SasaVitebsk
Клавиатура - медленное устройство с точки зрения МК. Можно продумать обработку по прерыванию, но чаще всего так не делают. Обычно используется опрос по таймеру с определённой частотой. При этом гасится дребезг.
V_G
Цитата(Duhas @ Oct 29 2009, 01:37) *
при входе в прерывание чистить свой флаг не вариант?

Смотря какой флаг чистить. Флаг запроса на прерывание очищается автоматически. А вот запрет прерывания (после поступления первого) на какое-то время входит в один из алгоритмов антидребезга. Потом проверьте сигнал от кнопочки через какой-то таймаут (тоже можно организовать прерывание, но от таймера), считайте установившееся значение и снова разрешите прерывание от кнопки.
Duhas
я так понимаю, что во время начала отработки прерывания поступает второй запрос на это же прерывание... т.к. прерывание обрабатывается достаточно быстро для клавиатуры, второе - явно лишнее, следовательно, пожалуй даже при выходе из обработчика, неплохо было бы очистить флаг запроса..
chief_olimp
у вас таймеры используются? Можно в прерывании очищать переменную (при отработке) и в то же время при входе в прерывание анализировать ее значение. Если оно меньше необходимого выходить из прерывания. Или вообще отключать прерывание на короткое время, а включать по тому же таймеру например. (Это конечно если имеем дело с клавиатурой).
V_G
Цитата(Duhas @ Oct 29 2009, 16:10) *
я так понимаю, что во время начала отработки прерывания поступает второй запрос на это же прерывание... т.к. прерывание обрабатывается достаточно быстро для клавиатуры, второе - явно лишнее, следовательно, пожалуй даже при выходе из обработчика, неплохо было бы очистить флаг запроса..

Это малопродуктивно, т.к.
1. Дребезговых импульсов может быть гораздо больше двух
2. Прерывание обрабатывается не просто быстро, а очень быстро, и второй запрос при дребезге скорее всего придет после выхода из прерывания. Так что запретить его лучше... А вот перед повторным разрешением по таймеру - да, запросы надо сбросить!
Duhas
афтор привел код, в котором по окончанию отработки прерывания в обработчике вызывается задержка в 100мс.. после чего, имхо, останется только очистить флаг запроса... если не грузить обработчик задержкой - подход нужен несколько иной...

в своем предыдущем посте под быстрым выполнением я имел ввиду, что нового нажатия специального не может за это время произойти..
V_G
Задержка внутри прерывания - сверхдурной тон, зачем тогда вообще прерывания?
Оправданно только в том случае, если задача учебная. Но зачем обучаться дурному тону в программировании?
Прохожий
Цитата(MrKot @ Oct 28 2009, 16:49) *
Собственно вопрос...?

Про кнопки здесь.
На сам МК внимания можно не обращать. Важен подход.
MrKot
Всем спасибо за ответы. Прохожий - полезная ссылка! Попробую организовать подобный алгоритм.
MDD
Цитата(V_G @ Oct 29 2009, 01:49) *
Смотря какой флаг чистить. Флаг запроса на прерывание очищается автоматически.


В Xмеге далеко не все флаги запроса на прерывание очищаются автоматически. Я с этим столкнулся, когда возился обработкой прерываний от DMA. Здесь скорее всего тоже. Даташит упоминает только про сброс путем записи единицы:

Цитата
The INTnIF flag is set when a pin change according to the pin's input sense configuration
occurs, and the pin is set as source for port interrupt n. Writing a one to this flag's bit location will
clear the flag. For enabling and executing the interrupt refer to the interrupt level description.


Такой подход понять можно - на восемь пинов всего два вектора прерывания. В общем случае может оказаться, что две и более ног хотят вызвать одно и тоже прерывание одновременно. Такую ситуацию все равно надо разруливать вручную, так что и ручной сброс флага не сильно напряжет...
V_G
Нет, в pinchange на xmege я запроса не сбрасываю, все работает. С DMA была такая петрушка, помню. Но в описании явно про это написано
Другое дело, если прерывание по уровню, а не по перепаду. Тут уж сбрасывай-не сбрасывай, а активный уровень должен исчезнуть до выхода из прерывания. И это не только на xmege, это на всех процах.
MDD
Да, похоже Ваша правда - в соотвествующей аппноте 1313 в прерывании флаги тоже вручную никто не сбрасывает. Меня смутило, что в даташите они не заострили на этом внимания. Как, например, для того же SPI:
Цитата
The IF is cleared by hardware when executing the corresponding interrupt
handling vector. Alternatively, the SPIF bit can be cleared by first reading the STATUS register
with IF set, and then access the DATA register.


Впрочем, все это не смертельно и легко выясняется эксперементально. Хотя для новичков трудностей добавляет...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.