Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 16.02.2010, 20:56   #51
AlexPv
Senior Member
 
Регистрация: 02.03.2009
Адрес: Russia
Сообщений: 1,800
Вес репутации: 565/61
AlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to allAlexPv is a name known to all
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Большое спасибо! Всё понял.
AlexPv вне форума   Ответить с цитированием
Старый 04.08.2010, 13:45   #52
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Добрый день! Тема старенькая, но возникла пара вопросов к уважаемому tester.

Может, я чего-то не понимаю, но мне кажется, что
Код:
ucTemp = 0x00;

if (!pin_BUTTON0) ucTemp |= 0x01;
if (!pin_BUTTON1) ucTemp |= 0x02;
if (!pin_BUTTON2) ucTemp |= 0x04;
if (!pin_BUTTON3) ucTemp |= 0x08;
if (!pin_BUTTON4) ucTemp |= 0x10;
if (!pin_BUTTON5) ucTemp |= 0x20;
if (!pin_BUTTON6) ucTemp |= 0x40;
if (!pin_BUTTON7) ucTemp |= 0x80;
можно заменить на
Код:
ucTemp = ~KEY_PORT;     // ранее объявлено #define KEY_PORT PORTB
Или я чего-то проглядел?

Ещё не понимаю, зачем нужен и как работает этот фрагмент:
Код:
ucTemp      ^= s_ucPort;            // Изменения с момента последнего выполнения
s_ucPort    ^= ucTemp;              // Текущее состояние портов
Из программы следует, что счётчик ucJitter один на все кнопки. Есть ли какие-то резоны применять 8 счётчиков на 8 кнопок? Ведь кнопки могут быть нажаты в разные моменты, а счётчик считает только для крайних моментов разных кнопок...

Так же не могу въехать, зачем в конструкции
Код:
if (ucTemp)                         // Подавление дребезга
{
    m_Buttons.ucJitter = 0;
    continue;
}
нужен continue?

Как работает конструкция вида
Код:
if (!m_Buttons.ucJitter && ucTemp)  // Состояние изменилось, дребезг подавлен
Откуда видно, что дребезг подавлен? Чего-то не могу въехать, реализован ли тут дребезг при отпускании кнопки? И если да, то где он и как работает...

Наверное, я туплю... если не лень, разъясните мне, пожалуйста, эти моменты.

Спасибо!
Romantic вне форума   Ответить с цитированием
Старый 04.08.2010, 15:08   #53
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/123
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от Romantic Посмотреть сообщение
Может, я чего-то не понимаю, но мне кажется, что
Код:
ucTemp = 0x00;

if (!pin_BUTTON0) ucTemp |= 0x01;
if (!pin_BUTTON1) ucTemp |= 0x02;
if (!pin_BUTTON2) ucTemp |= 0x04;
if (!pin_BUTTON3) ucTemp |= 0x08;
if (!pin_BUTTON4) ucTemp |= 0x10;
if (!pin_BUTTON5) ucTemp |= 0x20;
if (!pin_BUTTON6) ucTemp |= 0x40;
if (!pin_BUTTON7) ucTemp |= 0x80;
можно заменить на
Код:
ucTemp = ~KEY_PORT;     // ранее объявлено #define KEY_PORT PORTB
Или я чего-то проглядел?
Проглядели: выводы контроллера, к которым поключены кнопки могут находиться на разных портах.

Цитата:
Ещё не понимаю, зачем нужен и как работает этот фрагмент:
Код:
ucTemp      ^= s_ucPort;            // Изменения с момента последнего выполнения
s_ucPort    ^= ucTemp;              // Текущее состояние портов
Это стандартный прием, позволяющий получить маску изменений и обновить регистр. Т.е. после выполнения этого кода s_ucPort содержит состояние портов, а ucTemp - различия с предыдущим состоянием.


Цитата:
Из программы следует, что счётчик ucJitter один на все кнопки. Есть ли какие-то резоны применять 8 счётчиков на 8 кнопок? Ведь кнопки могут быть нажаты в разные моменты, а счётчик считает только для крайних моментов разных кнопок...
Один счетчик на все порты - это из-за экономии RАМ. Недостаток - если какая-то ножка окажется в воздухе и будет насасывать все наводки, то остальные кнопки будут обрабатываться нестабильно. Часто, когда кнопки разделены функционально, применяются отдельные счетчики для каждой группы кнопок. Так же есть метод вертикальных счетчиков, но он накладнее по RAM-ресурсам.

Цитата:
Так же не могу въехать, зачем в конструкции
Код:
if (ucTemp)                         // Подавление дребезга
{
    m_Buttons.ucJitter = 0;
    continue;
}
нужен continue?
Это я ошибся, когда вырезал RTOS. Без использования RTOS вместо continue должен быть return.

Цитата:
Как работает конструкция вида
Код:
if (!m_Buttons.ucJitter && ucTemp)  // Состояние изменилось, дребезг подавлен
Откуда видно, что дребезг подавлен? Чего-то не могу въехать, реализован ли тут дребезг при отпускании кнопки? И если да, то где он и как работает...
Дребезг считается подавленным, когда есть изменения по сравнению с предыдущим состоянием кнопок (не порта, обратите внимание, что ucTemp уже содержит разницу s_ucPort и m_Buttons.ucPressed) и счетчик досчитал до 4 (он 2-битный, сбрасывается при каждом несооветствии предыдущего и текущего состояния портов (не кнопок). Этот код обрабатывает дребезг как при нажатии, так и при отпускании.
tester вне форума   Ответить с цитированием
Старый 04.08.2010, 15:14   #54
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Огромное спасибо!

Только про последний блок не вкурил... наверное, сегодня не мой день. Пытаюсь нарисовать алгоритм как я его понимаю. Пока туго идёт...
Romantic вне форума   Ответить с цитированием
Старый 04.08.2010, 15:16   #55
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/123
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от Romantic Посмотреть сообщение
Огромное спасибо!

Только про последний блок не вкурил... наверное, сегодня не мой день. Пытаюсь нарисовать алгоритм как я его понимаю. Пока туго идёт...
Когда будете рисовать, учтите, что проверка (!m_Buttons.ucJitter) фактически выполняет проверку на равенство 4, а не 0.
tester вне форума   Ответить с цитированием
Старый 04.08.2010, 15:17   #56
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
Когда будете рисовать, учтите, что проверка (!m_Buttons.ucJitter) фактически выполняет проверку на равенство 4, а не 0.
Да я пока рисую своё понимание. Получается громоздко. Как дорисую - выложу картинку на обсуждение (если кто захочет обсудить). Может, свежим взглядом будет проще увидеть упрощения или ошибки.
Romantic вне форума   Ответить с цитированием
Старый 04.08.2010, 16:01   #57
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Кажется, дорисовал. Ввиду того, что мне нужны лишь два события от кнопок (нажатие и удержание), то алгоритм не отрабатывает в явном виде события отпускания и пр.

Я предполагаю создать структуру наподобие такой:
Код:
struct Key_Struct
{
    unsigned Key_1      : 1;
    unsigned Key_2      : 1;
    unsigned Key_3      : 1;
    unsigned Key_4      : 1;
    unsigned Key_Hold_1 : 1;
    unsigned Key_Hold_2 : 1;
    unsigned Key_Hold_3 : 1;
    unsigned Key_Hold_4 : 1;
} Key;
При этом в прерывании выполняется алгоритм установки битов структуры, а при отработке кнопок исполняющая программа будет обнулять биты. То есть, если в программе уже учтено нажатие кнопки Key_1, то соответствующий бит обнуляется.

Пока в голове небольшой бардак, однако планирую привести его в порядок за день-другой. Может, у кого-нибудь возникли комментарии или уточнения? Я нигде не ошибся?
Миниатюры
Алг. скан. клавиатуры.png  
Romantic вне форума   Ответить с цитированием
Старый 04.08.2010, 16:08   #58
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/123
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Что-то алгоритм не срастается...
Первое условие "Нет", второе "Да" - и висим до бесконечности? Где проверка счетчика после декремента?
tester вне форума   Ответить с цитированием
Старый 04.08.2010, 16:13   #59
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
Что-то алгоритм не срастается...
Первое условие "Нет", второе "Да" - и висим до бесконечности? Где проверка счетчика после декремента?
Тут учитывается тот факт, что опрос производится с частотой 50 Гц, и при первой комбинации НЕТ, ДА счётчик дребезга будет декрементирован в первый раз, при том, что пороговое значение срабатывания кнопки (подавление дребезга) будет больше 5-7 итераций. Вот если кнопка не была нажата ни в этот, ни в предыдущий раз, то уже нужно проверять значение счётчика дребезга.

Я это вижу так..
Romantic вне форума   Ответить с цитированием
Старый 04.08.2010, 16:18   #60
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/123
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от Romantic Посмотреть сообщение
Тут учитывается тот факт, что опрос производится с частотой 50 Гц, и при первой комбинации НЕТ, ДА счётчик дребезга будет декрементирован в первый раз, при том, что пороговое значение срабатывания кнопки (подавление дребезга) будет больше 5-7 итераций. Вот если кнопка не была нажата ни в этот, ни в предыдущий раз, то уже нужно проверять значение счётчика дребезга.

Я это вижу так..
Т.е. предыдущее значение порта сохраняется каждый раз? В алгоритме это не отражено, вот я и подумал, что будем висеть.
tester вне форума   Ответить с цитированием
Старый 04.08.2010, 16:21   #61
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
Т.е. предыдущее значение порта сохраняется каждый раз? В алгоритме это не отражено, вот я и подумал, что будем висеть.
Ага, сохраняется. Много избыточности тут, как мне кажется. Но ничего проще в голову не лезет. А бездумно взять Ваш алгоритм, не понимая, как он работает, я не могу. Приходится изобретать велосипед...
Romantic вне форума   Ответить с цитированием
Старый 05.08.2010, 11:10   #62
mos
Senior Member
 
Регистрация: 12.04.2008
Сообщений: 638
Вес репутации: 731/54
mos is a splendid one to beholdmos is a splendid one to beholdmos is a splendid one to beholdmos is a splendid one to beholdmos is a splendid one to beholdmos is a splendid one to beholdmos is a splendid one to behold
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от Romantic Посмотреть сообщение
Кажется, дорисовал.
В какой программке создавали?
mos вне форума   Ответить с цитированием
Старый 05.08.2010, 11:15   #63
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,094
Вес репутации: 3340/97
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от mos Посмотреть сообщение
В какой программке создавали?
Visio 2003 с экспортом в PNG. Вроде ничего получилось...
Romantic вне форума   Ответить с цитированием
Старый 18.11.2010, 21:58   #64
VOSAP
Senior Member
 
Аватар для VOSAP
 
Регистрация: 25.10.2008
Адрес: Валдай
Возраст: 39
Сообщений: 129
Вес репутации: 168/41
VOSAP has a spectacular aura aboutVOSAP has a spectacular aura about
Отправить сообщение для VOSAP с помощью ICQ
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
if (ucTemp) // Подавление дребезга
{
m_Buttons.ucJitter = 0;
continue;
}
нужен continue?

Это я ошибся, когда вырезал RTOS. Без использования RTOS вместо continue должен быть return.
а в примере для РТОС в этом куске

Цитата:
if (ucTemp) // Debounce
{
m_Buttons.ucJitter = 0;
}
else
{

//------------------------------------------------------------------------------

m_Buttons.ucJitter++;
,
нету не ретурна ни континуе.
VOSAP вне форума   Ответить с цитированием
Старый 20.11.2010, 22:07   #65
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/123
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от VOSAP Посмотреть сообщение
а в примере для РТОС в этом куске

,
нету не ретурна ни континуе.
Там оборот в виде "else", так что по алгоритму это эквивалент continue. А return в RTOS никак нельзя
tester вне форума   Ответить с цитированием
Старый 06.10.2011, 17:08   #66
Serg.mib
Junior Member
 
Регистрация: 07.09.2011
Сообщений: 22
Вес репутации: 100/29
Serg.mib will become famous soon enoughSerg.mib will become famous soon enough
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
Функция вызывается раз в 20 мс. Следует отметить, что макси JustPressed, JustReleased, Short и Changed - это события, а не состояния, и их нужно обнулять вручную после обработки.

Код:
// Можно задать до 8 кнопок

#define pin_BUTTON0     RB0
#define pin_BUTTON1     RB1
#define pin_BUTTON2     RB2
#define pin_BUTTON3     RB3
#define pin_BUTTON4     RB4
#define pin_BUTTON5     RB5
#define pin_BUTTON6     RB6
#define pin_BUTTON7     RB7


typedef struct
{
    unsigned char   ucPressed;            // Состояния кнопок
    unsigned char   ucJitter    : 2;      // Для подавления дребезга
    unsigned char   ucCounter   : 6;      // Для проверки удерживания
    unsigned char   ucHold;               // Состояние длительного удерживания
                                          // События:
    unsigned char   ucShort;              // Короткое нажатие и отпускание
    unsigned char   ucJustPressed;        // Кнопки только что нажаты
    unsigned char   ucJustReleased;       // Кнопки только что отпущены
    unsigned char   ucChanged;            // Состояние кнопок изменилось

} TBUTTONS;

volatile TBUTTONS    m_Buttons;


void Task_Buttons (void)
{
    static  unsigned char s_ucPort;     // Предыдущее состояние портов
            unsigned char ucTemp;       

    ucTemp = 0x00;

    if (!pin_BUTTON0) ucTemp |= 0x01;
    if (!pin_BUTTON1) ucTemp |= 0x02;
    if (!pin_BUTTON2) ucTemp |= 0x04;
    if (!pin_BUTTON3) ucTemp |= 0x08;
    if (!pin_BUTTON4) ucTemp |= 0x10;
    if (!pin_BUTTON5) ucTemp |= 0x20;
    if (!pin_BUTTON6) ucTemp |= 0x40;
    if (!pin_BUTTON7) ucTemp |= 0x80;

    ucTemp      ^= s_ucPort;            // Изменения с момента последнего выполнения
    s_ucPort    ^= ucTemp;              // Текущее состояние портов

    if (ucTemp)                         // Подавление дребезга
    {
        m_Buttons.ucJitter = 0;
        return;
    }
    //------------------------------------------------------------------------------
    
    m_Buttons.ucJitter++;
    ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Маска изменения состояние

    if (!m_Buttons.ucJitter && ucTemp)      // Состояние изменилось, дребезг подавлен
    {
        //------------------------------------------------------------------------------
        //  Проверяем отпущенные кнопки
        //------------------------------------------------------------------------------
        
        if (m_Buttons.ucPressed & ucTemp)   // Есть отпущенные
        {
            m_Buttons.ucJustReleased    |=  ucTemp;
            m_Buttons.ucChanged         |=  ucTemp;
            m_Buttons.ucShort           |=  ucTemp;
            m_Buttons.ucShort           &= ~m_Buttons.ucHold;
            m_Buttons.ucHold            &= ~ucTemp;
        }   // if released
        //------------------------------------------------------------------------------
        //  Проверяем нажатые кнопки
        //------------------------------------------------------------------------------
        if ((m_Buttons.ucPressed ^ ucTemp) & ucTemp)    // Есть нажатые
        {
            m_Buttons.ucChanged         |=  ucTemp;
            m_Buttons.ucJustPressed     |=  ucTemp;
            m_Buttons.ucShort           &= ~ucTemp;
        }   // if pressed

        m_Buttons.ucPressed = s_ucPort;
        m_Buttons.ucCounter = 0;
    }   // if changed and debounced

    m_Buttons.ucCounter++;
    //------------------------------------------------------------------------------
    //  Проверяем длительное удерживание
    //------------------------------------------------------------------------------
    
    if (m_Buttons.ucCounter == 50)
    {
        m_Buttons.ucChanged |= m_Buttons.ucHold ^ m_Buttons.ucPressed;
        m_Buttons.ucHold = m_Buttons.ucPressed;
    }

}
Результат работы - переменная структура с именем m_Buttons, по полям которой можно определять:
- какие кнокпи нажаты;
- какие нажаты и удерживаются;
- короткое нажатие кнопки;
- короткое нажатие кнопки при удерживании другой (или других);
- состояние каких кнопок изменилось (и как) с последней проверки;
- и т.д.

А по ссылке - полная версия для RTOS. Чтобы использовать без RTOS, нужно убрать из Task_Buttons() вечный цикл и вызов OS_Delay(), а саму функцию вызывать с нужным периодом (например, раз в 20 мс).
Доброго дня, я тоже озадачился с функцией обработки кнопок. Вроде бы разобрался с Вашим кодом, очень понравился в "работе", даже пропало желание вникать в другие варианты обработок с кучей макросов и переходов, для тех кто как и я только " вникает" привожу алгоритм этого кода.
Миниатюры
unnamedудали.png  
Serg.mib вне форума   Ответить с цитированием
Старый 06.10.2011, 21:26   #67
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 55
Сообщений: 1,015
Вес репутации: 2613/74
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Испльзую такой вариант опроса кнопок с защитой от дребезга.
Код:
//****************************************************************************
void ScanKey1Tast(void)
{
static unsigned char Regvx1=0xa5;
 Regvx1= Regvx1 <<1 ;
 if (BUTTON1_IO) Regvx1=Regvx1 | 0x01; //если на входе 1, то в регистр в нулевой разряд записываем 1
 if (Regvx1==0x00) Key1_New_Sost=1; // если все 00 то стабильно нажата
 if (Regvx1==0xFF) Key1_New_Sost=0; // если все 0xFF то стабильно отжата
 if ((Key1_New_Sost==1) & (Key1_Old_Sost==0)) Key1_Pop=1; //Кнопка отжата зафиксирован фронт 
 if ((Key1_New_Sost==0) & (Key1_Old_Sost==1)) Key1_Push=1; //Кнопка нажата зафиксирован спад
 Key1_Old_Sost=Key1_New_Sost;
}
//****************************************************************************
Кнопка работает на замыкание входа с подтягивающим резистором на корпус.
Есть еще более сложный алгоритм когда учитывается длительность нажатия . формируется событие при нажатии, отпускании, при удержании повтор, отжатие после длительного нажатия. Надо найти алгоритм. а так же учитывается в каком состоянии было устройство вкл или выкл. Код правда только на асме.
smart_pic вне форума   Ответить с цитированием
Старый 06.10.2011, 21:30   #68
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 55
Сообщений: 1,015
Вес репутации: 2613/74
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Еще одно дополнение : вызывать программу нужно с частотой 50 - 400 раз в секунду. При меньшей частоте возникает тормознутость кнопок, при большей могут проскакивать ложные сработки. Все также зависит от конструкции кнопок. Разные кнопки ведут себя по разному.
smart_pic вне форума   Ответить с цитированием
Старый 07.10.2011, 01:34   #69
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/42
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от smart_pic Посмотреть сообщение
Код правда только на асме.
Пора думать как на Си
С фронтами не замарачивался,хотя иногда надо знать сколько нажата кнопка для увеличение быстрей переменной как в овеновских приборах.
Делал еще паузу за тело основной программы,в симуляторе прогонял весь цикл и уже выбирал за сколько циклов погасить дребизг.
CERGEI вне форума   Ответить с цитированием
Старый 07.10.2011, 01:53   #70
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 43
Сообщений: 2,610
Вес репутации: 2570/96
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от Serg.mib Посмотреть сообщение
Доброго дня, я тоже озадачился с функцией обработки кнопок. Вроде бы разобрался с Вашим кодом, очень понравился в "работе", даже пропало желание вникать в другие варианты обработок с кучей макросов и переходов, для тех кто как и я только " вникает" привожу алгоритм этого кода.
Кто умеет - делает. Кто не умеет - учит.
fantom вне форума   Ответить с цитированием
Старый 07.10.2011, 07:02   #71
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 37
Сообщений: 1,383
Вес репутации: 1267/70
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от Dmitry_177 Посмотреть сообщение
А сколько обычно делают задержку на практике?


Наверно нашел:
Код:
        if(TMR1IE && TMR1IF)
            {
                if(RB0==0)
                    {
                        spk        = 1;
                    }

                TMR1IE    = 0;
                TMR1ON    = 0;

                INTE    = 1;

                TMR1IF    = 0;
            }
сейчас попробую как работать будет..
Насколько я знаю, стандартные требования на задержку срабатывания дискретного входа - 1-5мсекунд норма. Самый простой вариант подавления дребезга, читаешь в прерываниях от таймера в 1мсекунду значение бита, если оно 2 раза подряд совпало, то с вероятностью 99,9% можно сказать, что это реальное состояние кнопки
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 07.10.2011, 13:05   #72
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/42
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Как по мне проблема появляется когда кнопку нажал,что то сработало и если нужно нажат кнопку снова,то появляется ложное срабатывание два раза подряд,антидребезг убираю.Сейчас в проекте такой глюк встретился.
CERGEI вне форума   Ответить с цитированием
Старый 07.10.2011, 13:14   #73
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/123
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
Насколько я знаю, стандартные требования на задержку срабатывания дискретного входа - 1-5мсекунд норма. Самый простой вариант подавления дребезга, читаешь в прерываниях от таймера в 1мсекунду значение бита, если оно 2 раза подряд совпало, то с вероятностью 99,9% можно сказать, что это реальное состояние кнопки
Для кнопки (для механического контакта) 5 мс - это очень мало. Подключи кнопку к осциллу (у тебя наверняка под рукой), посмотри. Иная кнопка и все 100мс даст. А бывает ставишь нормальную кнопку ( и ей 20мс достаточно), а через год-два контакт окисляется и расшатывается - и получаем уже 100-200мс.
tester вне форума   Ответить с цитированием
Старый 07.10.2011, 14:15   #74
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 37
Сообщений: 1,383
Вес репутации: 1267/70
2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of2AplusA has much to be proud of
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
Для кнопки (для механического контакта) 5 мс - это очень мало. Подключи кнопку к осциллу (у тебя наверняка под рукой), посмотри. Иная кнопка и все 100мс даст. А бывает ставишь нормальную кнопку ( и ей 20мс достаточно), а через год-два контакт окисляется и расшатывается - и получаем уже 100-200мс.
Возможно для кнопки и не прокатит. Я специально написал про дискретный вход. Но есть у меня проект, пульт, там я опрашивал клавиатуру из матрицы 4х4, раз в 5мсекунд, как только предыдущее чтение совпало с текущим, обрабатывал код как нажатие. Работа с клавиатурой не подводила и, когда мы пытались сымитировать ЭМИ быстрощелкающей релюшкой. А вот контроллер экрана подвел серьезно. Мало того, что экран начинал то гаснуть то появляться, так еще и в конце концов, вообще, "белый экран смерти" выпадал и так намертво пока питание не дернешь. Пришлось дополнительно кучу кода в программу добавлять, на тест пропадания связи с пультом и сбоя ОЗУ в контроллере экрана.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 07.10.2011, 14:20   #75
Sim_spb
Junior Member
 
Регистрация: 07.09.2010
Сообщений: 22
Вес репутации: 351/35
Sim_spb is just really niceSim_spb is just really niceSim_spb is just really niceSim_spb is just really nice
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от 2AplusA Посмотреть сообщение
А вот контроллер экрана подвел серьезно.
А что за экран, если не секрет?
Sim_spb вне форума   Ответить с цитированием
Ответ

Метки
антидребезг, кнопка


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нет реакции на нажатие кнопки, pic12f629 Autotronic Вопросы начинающих 20 04.03.2009 05:27
нажатие кнопки на телефоне(модем Sim300) war Общетехнические вопросы 1 31.03.2007 21:50


Часовой пояс GMT +3, время: 04:06.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot