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

 
 
 
Reply to this topicStart new topic
> Работа с прерываниями, xmega, повторно отрабатывает прерывание
MrKot
сообщение Oct 28 2009, 13:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 23-07-08
Пользователь №: 39 158



Есть кнопка, которая при включеном положении замыкает контакт на землю. Соответствующую ногу я назначил входом, подтянул логическую единицу, и назначил прерывание при падении уровня на этой ноге

Код
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);
}


Но обработчик прерывания отрабатывает два раза.
Если убрать задержку в прерывании, то обработка прерывания происходит большее количество раз, что возникает скорее всего из-за дребезга контакта, который в устройстве ничем не отфильтровывается. Собственно вопрос, почему происходит повторная обработка прерывания и как с этим бороться (желательно программно)?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 28 2009, 14:06
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(MrKot @ Oct 28 2009, 16:49) *
Собственно вопрос, почему происходит повторная обработка прерывания и как с этим бороться (желательно программно)?

Вначале придумайте алгоритм подавления дребезга, а потом подумайте как его реализовать. Не получится - спросите. Вы вроде правильно разобрались в причинах, и все равно спрашиваете у нас магическую антидребезговую команду?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Duhas
сообщение Oct 28 2009, 15:37
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



при входе в прерывание чистить свой флаг не вариант?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 28 2009, 18:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Клавиатура - медленное устройство с точки зрения МК. Можно продумать обработку по прерыванию, но чаще всего так не делают. Обычно используется опрос по таймеру с определённой частотой. При этом гасится дребезг.
Go to the top of the page
 
+Quote Post
V_G
сообщение Oct 28 2009, 23:49
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Duhas @ Oct 29 2009, 01:37) *
при входе в прерывание чистить свой флаг не вариант?

Смотря какой флаг чистить. Флаг запроса на прерывание очищается автоматически. А вот запрет прерывания (после поступления первого) на какое-то время входит в один из алгоритмов антидребезга. Потом проверьте сигнал от кнопочки через какой-то таймаут (тоже можно организовать прерывание, но от таймера), считайте установившееся значение и снова разрешите прерывание от кнопки.
Go to the top of the page
 
+Quote Post
Duhas
сообщение Oct 29 2009, 06:10
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



я так понимаю, что во время начала отработки прерывания поступает второй запрос на это же прерывание... т.к. прерывание обрабатывается достаточно быстро для клавиатуры, второе - явно лишнее, следовательно, пожалуй даже при выходе из обработчика, неплохо было бы очистить флаг запроса..
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Oct 29 2009, 07:40
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



у вас таймеры используются? Можно в прерывании очищать переменную (при отработке) и в то же время при входе в прерывание анализировать ее значение. Если оно меньше необходимого выходить из прерывания. Или вообще отключать прерывание на короткое время, а включать по тому же таймеру например. (Это конечно если имеем дело с клавиатурой).
Go to the top of the page
 
+Quote Post
V_G
сообщение Oct 29 2009, 08:28
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Duhas @ Oct 29 2009, 16:10) *
я так понимаю, что во время начала отработки прерывания поступает второй запрос на это же прерывание... т.к. прерывание обрабатывается достаточно быстро для клавиатуры, второе - явно лишнее, следовательно, пожалуй даже при выходе из обработчика, неплохо было бы очистить флаг запроса..

Это малопродуктивно, т.к.
1. Дребезговых импульсов может быть гораздо больше двух
2. Прерывание обрабатывается не просто быстро, а очень быстро, и второй запрос при дребезге скорее всего придет после выхода из прерывания. Так что запретить его лучше... А вот перед повторным разрешением по таймеру - да, запросы надо сбросить!
Go to the top of the page
 
+Quote Post
Duhas
сообщение Oct 29 2009, 12:46
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



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

в своем предыдущем посте под быстрым выполнением я имел ввиду, что нового нажатия специального не может за это время произойти..
Go to the top of the page
 
+Quote Post
V_G
сообщение Oct 29 2009, 16:05
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Задержка внутри прерывания - сверхдурной тон, зачем тогда вообще прерывания?
Оправданно только в том случае, если задача учебная. Но зачем обучаться дурному тону в программировании?
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Oct 29 2009, 18:01
Сообщение #11


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(MrKot @ Oct 28 2009, 16:49) *
Собственно вопрос...?

Про кнопки здесь.
На сам МК внимания можно не обращать. Важен подход.
Go to the top of the page
 
+Quote Post
MrKot
сообщение Oct 29 2009, 19:52
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 23-07-08
Пользователь №: 39 158



Всем спасибо за ответы. Прохожий - полезная ссылка! Попробую организовать подобный алгоритм.
Go to the top of the page
 
+Quote Post
MDD
сообщение Nov 2 2009, 16:26
Сообщение #13


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

Группа: Участник
Сообщений: 90
Регистрация: 7-05-06
Пользователь №: 16 862



Цитата(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.


Такой подход понять можно - на восемь пинов всего два вектора прерывания. В общем случае может оказаться, что две и более ног хотят вызвать одно и тоже прерывание одновременно. Такую ситуацию все равно надо разруливать вручную, так что и ручной сброс флага не сильно напряжет...
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 3 2009, 00:24
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Нет, в pinchange на xmege я запроса не сбрасываю, все работает. С DMA была такая петрушка, помню. Но в описании явно про это написано
Другое дело, если прерывание по уровню, а не по перепаду. Тут уж сбрасывай-не сбрасывай, а активный уровень должен исчезнуть до выхода из прерывания. И это не только на xmege, это на всех процах.

Сообщение отредактировал V_G - Nov 3 2009, 00:33
Go to the top of the page
 
+Quote Post
MDD
сообщение Nov 3 2009, 05:23
Сообщение #15


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

Группа: Участник
Сообщений: 90
Регистрация: 7-05-06
Пользователь №: 16 862



Да, похоже Ваша правда - в соотвествующей аппноте 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.


Впрочем, все это не смертельно и легко выясняется эксперементально. Хотя для новичков трудностей добавляет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 17:08
Рейтинг@Mail.ru


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