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

 
 
> Обработка прерывания кнопки
Nikitoc
сообщение Aug 21 2011, 21:35
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Может я засиделся сегодня у компа, но что-то меня заклинило: как правильно писать обработчик прерывания по нажатию кнопки? Суть вопроса сводится к расположению задержки (~30мс) для "устранения " дребезга контактов кнопки. Ведь существует неписанное правило о том, что обработчики прерывания должны быть как можно короче по времени исполнения, а введение "антидребезговой" задержки этому как-то не способствует. Или это неизбежное зло и таким обработчикам просто следует назначать наименьший приоритет? Если тема боян - ткните носом. Не нашел.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alexeyv
сообщение Aug 22 2011, 04:20
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Примерно лет шесть делаю так:



CODE

// в .h-файле:
// кол-во времени до события "длинное нажатие"
#define TIMER_COUNT 250
// кол-во кнопок
#define KEY_COUNT 4
// время автоинкремента
#define TIMER_SCROLL 20

// состояние кнопки
enum {KN_DOWN =0, KN_UP =1, KN_PRESS=2 };
// тип функции кнопки
typedef byte(KeyFunc)(void);

// структура хранящая набор переменных для каждой кнопки
typedef struct key_struct__
{
byte state; // состояние кнопки
byte mask; // маска клавиши
byte pins; // буфер значений с клавиши
byte count; // счетчик нажатий
KeyFunc * exec_down;
KeyFunc * exec_up;
KeyFunc * exec_pres;
}key_struct;

// в .c-файле:
//*****************************************************************************
// Драйвер кнопок
// назначение кнопок
// 1- MiNUS 2-PLUS 3- Select 4- Enter
//*****************************************************************************

//=============================================================================
// состояния кнопок
static key_struct key_mass [KEY_COUNT] = {
//state mask pins count exec_down exec_up exec_pres
{KN_UP, PIN_KEY_MINUS, 0xFF,0x00, kn_empty, kn_minus_up ,kn_minus_up }
,{KN_UP, PIN_KEY_PLUS, 0xFF,0x00, kn_empty, kn_plus_up ,kn_plus_up }
,{KN_UP, PIN_KEY_SELECT, 0xFF,0x00, kn_empty, kn_select_up ,kn_empty }
,{KN_UP, PIN_KEY_ENTER, 0xFF,0x00, kn_empty, kn_empty ,kn_enter_press }
};
//=============================================================================

ISR(TIMER1_COMPA_vect)
{
#define Sta key->state
#define Pin key->pins
#define Cnt key->count
#define Msk key->mask
#define Down key->exec_down
#define Up key->exec_up
#define Pres key->exec_pres

key_struct * key = key_mass;
for(byte i=0; i< KEY_COUNT ; i++)
{
Pin *=2; // * or <<
if(KEY_PIN & Msk) Pin |= 0x01;

if(Sta == KN_UP)
{
if(!Pin) // начало счета - нажатие
{
Down();
Sta = KN_DOWN;
Cnt = 0x00;
}
}
else // down or press
{
if(Pin==0xFF) // отпустили
{
if(Sta == KN_DOWN) Up();
Sta = KN_UP;
}
else// удерживаем
{
if(Cnt <= TIMER_COUNT) ++Cnt;
if(Cnt == TIMER_COUNT) // длительное удержание - попадаем один раз!!
{
if(Pres()) Cnt = TIMER_COUNT - TIMER_SCROLL;
else Sta = KN_PRESS;
}
}
}
key++;
}
}


Таймер в CTC-режиме на порядка 5....15 мсек

Сообщение отредактировал alexeyv - Aug 22 2011, 04:22
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikitoc   Обработка прерывания кнопки   Aug 21 2011, 21:35
- - нечитатель   Кто запрещает что-то другое делать, пока задержка....   Aug 22 2011, 02:25
- - 777777   Цитата(Nikitoc @ Aug 22 2011, 01:35) Може...   Aug 22 2011, 06:12
|- - mempfis_   Для устранения дребезга контактов давно делаю так:...   Aug 23 2011, 13:24
- - SSerge   Сама идея прерываний от кнопки не очень хороша. Из...   Aug 22 2011, 09:00
- - Nikitoc   Спасибо всем за ответы. Прокомментируйте, пожалуйс...   Aug 22 2011, 09:19
|- - whiteTigr   Цитата(Nikitoc @ Aug 22 2011, 13:19) Спас...   Aug 22 2011, 10:06
- - MrYuran   Я вообще не вижу смысла вешать кнопку на вход прер...   Aug 22 2011, 10:10
- - ILYAUL   Запускаешь АЦП и никаких тебе дребезгов и задержек...   Aug 22 2011, 12:36
|- - whiteTigr   Цитата(ILYAUL @ Aug 22 2011, 16:36) Запус...   Aug 23 2011, 04:57
|- - ILYAUL   Цитата(whiteTigr @ Aug 23 2011, 08:57) Чт...   Aug 23 2011, 07:43
|- - whiteTigr   Цитата(ILYAUL @ Aug 23 2011, 11:43) А я н...   Aug 23 2011, 07:47
|- - ILYAUL   Цитата(whiteTigr @ Aug 23 2011, 11:47) За...   Aug 23 2011, 07:59
- - skripach   Ни в одном проекте не использовал прерывания для к...   Aug 23 2011, 12:42
- - ARV   вообще не понимаю, зачем для столь низкоприоритетн...   Aug 23 2011, 12:54
- - _Pasha   Если кнопки на АЦП, то лучше пройдет поллинг с исп...   Aug 23 2011, 15:40


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

 


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


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