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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 07.10.2011, 14:22   #76
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 38
Сообщений: 1,383
Вес репутации: 1267/71
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)

Забыл уточнить, клавиатура была пленочной. Возможно там дребезг менее длительный.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 07.10.2011, 14:39   #77
2AplusA
Senior Member
 
Аватар для 2AplusA
 
Регистрация: 26.02.2007
Адрес: Penza
Возраст: 38
Сообщений: 1,383
Вес репутации: 1267/71
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)

Цитата:
Сообщение от Sim_spb Посмотреть сообщение
А что за экран, если не секрет?
Не секрет - PG320240WRF.
Только ссылку на него что-то не могу нормальную найти.
__________________
Лучше день потерять, потом за час долететь!
2AplusA вне форума   Ответить с цитированием
Старый 07.10.2011, 14:43   #78
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/124
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 Посмотреть сообщение
Забыл уточнить, клавиатура была пленочной. Возможно там дребезг менее длительный.
Для пленочных дребезг действительно намного меньше (единицы мс).
tester вне форума   Ответить с цитированием
Старый 28.10.2011, 10:31   #79
Solax
Member
 
Регистрация: 09.07.2010
Сообщений: 95
Вес репутации: 129/35
Solax will become famous soon enoughSolax 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


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;

   
}
Результат работы - переменная структура с именем m_Buttons, по полям которой можно определять:
- какие кнокпи нажаты;
- какие нажаты и удерживаются;
- короткое нажатие кнопки;
- короткое нажатие кнопки при удерживании другой (или других);
- состояние каких кнопок изменилось (и как) с последней проверки;
- и т.д.
Виктор, приветствую! Использовал Ваш код для одной кнопки, но вот решил подключить ещё кнопочек.
Использую pic16f690 - 1 кнопка на RA2(подтягивающий резистор включен), 2-4я RC<2 -0> со внешними подтягивающими резисторами.
При однокнопочном варианте - я вызывал раз в 20мс Taks_Buttons (по таймеру) и далее делал проверку
Код:
if (m_ButtonsState.bPressed) {результат нажатия}
Так вот вопрос - не понял как использовать Вашу многокнопочную обработку для реализации отдельной функции под каждую кнопку?
Спасибо.
Solax вне форума   Ответить с цитированием
Старый 28.10.2011, 11:34   #80
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 42
Сообщений: 3,577
Вес репутации: 4386/124
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)

Цитата:
Сообщение от Solax Посмотреть сообщение
Виктор, приветствую! Использовал Ваш код для одной кнопки, но вот решил подключить ещё кнопочек.
...
Так вот вопрос - не понял как использовать Вашу многокнопочную обработку для реализации отдельной функции под каждую кнопку?
Спасибо.
Привет! Используйте эту функцию.
А в коде так:
Код:
if (m_Buttons.ucPressed & (1<<0)) {...}
if (m_Buttons.ucPressed & (1<<1)) {...}
if (m_Buttons.ucPressed & (1<<2)) {...}
tester вне форума   Ответить с цитированием
Старый 28.10.2011, 22:04   #81
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 55
Сообщений: 1,023
Вес репутации: 2657/76
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)

Цитата:
Сообщение от CERGEI Посмотреть сообщение
Пора думать как на Си
Код:
;ПРОГРАММА  КОПЛЕРА ДЛЯ УПРАВЛЕНИЯ ОСВЕЩЕНИЕМ
; УСТРОЙСТВО ПОСЫЛКИ КОМАНДЫ В СОМ ПОРТ
; Это коплер для работы димером
; 22 АПРЕЛЯ 2006
; АЛГОРИТМ РАБОТЫ  КОПЛЕРА ДЛЯ ДИММЕРА
; 1. Короткое нажатие - команда №1
; 2. Длинное нажатие (более какого-то времени) - команда №2
; 3. Короткое нажатие после короткого нажатия или длинного - команда №3
; 4. Длинное нажатие после короткого нажатия или длинного - команда №4
; 5. Размыкание после длинного нажатия - команда №5
;
; Это коплер для работы димером.
; Такой набор команд позволяет реализовать логику с кнопки.
; Если я коротко нажал свет максимально включился. 
; Если я после этого коротко нажал еще раз то свет мгновенно выключился.
; Если я нажал, то свет начинает плавно загораются и как только отпустил перестает разгораться.
; Если я еще раз нажал, то свет начинает плавно гаснуть пока я не отпустил кнопку.
;********************************************************************************************************************
;   SOST_BX1 FLAG_USTR,0 ; СОСТОЯНИЕ ПОРТА ДЛЯ ПЕРВОГО ДАТЧИКА
;  _VKL  FLAG_USTR,2 ; ФЛАГ ВКЛЮЧЕНИЕ УСТРОЙСТВА
;  _PRES  FLAG_USTR,3 ; ФЛАГ ЛЮБОГО НАЖАТИЯ КНОПКИ
;  _PRESDL FLAG_USTR,4 ; ФЛАГ ДЛИТЕЛЬНОГО НАЖАТИЯ КНОПКИ
;****************************************
KOPLER MACRO VXOD,REGVX,FLAG_USTR,CHDLIT,KOP1, KOP2, KOP3, KOP4, KOP5,SEND_KOM1, SEND_KOM2, SEND_KOM3, SEND_KOM4, SEND_KOM5  
;********************************
 RLNCF REGVX,F,A
 BCF REGVX,0,A
 BTFSS PORTB,VXOD,A 
 BSF REGVX,0,A
 MOVLW 0
 XORWF REGVX,W,A
 BTFSC STATUS,Z,A
 BCF FLAG_USTR,0,A
 MOVLW 0FF
 XORWF REGVX,W,A
 BTFSC STATUS,Z,A
 BSF FLAG_USTR,0,A
;********************************
 BTFSS FLAG_USTR,0,A
 GOTO KOP1
     ; ЕСТЬ НАЖАТИЕ КНОПКИ
 BTFSS FLAG_USTR,3,A  ; ЕСЛИ УЖЕ БЫЛО НАЖАТИЕ - ТО НЕ ОБНУЛЯТЬ СЧЕТЧИК ЗАДЕРЖКИ
 CLRF CHDLIT,A
 BSF FLAG_USTR,3,A  ; УСТАНОВИТЬ ФЛАГ НАЖАТИЯ КНОПКИ
 BTFSC FLAG_USTR,4,A  ; ЕСЛИ НЕ БЫЛО ДЛИТЕЛЬНОЕ НАЖАТИЕ
 RETURN    ; ИНАЧЕ ВЫХОД
 DECFSZ CHDLIT,F,A
 RETURN
 BSF FLAG_USTR,4,A
 BTFSS FLAG_USTR,2,A
 GOTO SEND_KOM2
 GOTO SEND_KOM4
KOP1     ; НЕТ НАЖАТИЯ КНОПКИ
 BTFSS FLAG_USTR,3,A
 RETURN
 BTFSC FLAG_USTR,4,A
 GOTO SEND_KOM5
 BTFSS FLAG_USTR,2,A
 GOTO SEND_KOM1
 GOTO SEND_KOM3
KOP2     ; 
 BCF FLAG_USTR,3,A
 BCF FLAG_USTR,4,A
KOP3
 BTFSS FLAG_USTR,2,A
 GOTO KOP4
 BCF FLAG_USTR,2,A
 RETURN
KOP4
 BSF FLAG_USTR,2,A
 RETURN
 ENDM
;********************************
KOPLER1
 KOPLER  0,REGVX1,FLAG_USTR1,CHDLIT1,KOP11, KOP21, KOP31, KOP41, KOP51,SEND_KOM11, SEND_KOM21, SEND_KOM31, SEND_KOM41, SEND_KOM51 
KOPLER2
 KOPLER  1,REGVX2,FLAG_USTR2,CHDLIT2,KOP12, KOP22, KOP32, KOP42, KOP52,SEND_KOM12, SEND_KOM22, SEND_KOM32, SEND_KOM42, SEND_KOM52 
KOPLER3
 KOPLER  2,REGVX3,FLAG_USTR3,CHDLIT3,KOP13, KOP23, KOP33, KOP43, KOP53,SEND_KOM13, SEND_KOM23, SEND_KOM33, SEND_KOM43, SEND_KOM53 
KOPLER4
 KOPLER  3,REGVX4,FLAG_USTR4,CHDLIT4,KOP14, KOP24, KOP34, KOP44, KOP54,SEND_KOM14, SEND_KOM24, SEND_KOM34, SEND_KOM44, SEND_KOM54 

SEND_KOM11
SEND_KOM21
SEND_KOM31
SEND_KOM41
SEND_KOM51
SEND_KOM12
SEND_KOM22
SEND_KOM32
SEND_KOM42
SEND_KOM52
SEND_KOM13
SEND_KOM23
SEND_KOM33
SEND_KOM43
SEND_KOM53
SEND_KOM14
SEND_KOM24
SEND_KOM34
SEND_KOM44
SEND_KOM54
;********************************
выложил код на ASMe правда . На каждую кнопку нужно 3 байта памяти.
smart_pic вне форума   Ответить с цитированием
Старый 29.10.2011, 00:30   #82
Petya
Senior Member
 
Регистрация: 30.11.2008
Адрес: SPb
Сообщений: 150
Вес репутации: 238/43
Petya has a spectacular aura aboutPetya has a spectacular aura aboutPetya has a spectacular aura about
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Попробовал предложенный Tester'ом вариант с 8 кнопками. Оказалось, что при рекомендованном периоде 20 мс не ловятся кратковременные, хотя и отчётливые, нажатия. Уменьшил период до 10 мс - стало хорошо.
Petya вне форума   Ответить с цитированием
Старый 24.11.2011, 05:14   #83
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 37
Сообщений: 526
Вес репутации: 183/44
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
В общем, запарился я разбираться с этой функцией, никак не отделить мух от котлет (плохо и неаккуратно я ее написал, но, собственно, давно и не пользуюсь ей). Так что приведу пример RTOS'овской обработки, которой сейчас пользуюсь. По ссылке внизу полная версия файла для RTOS с возможностью всяких настроек.

А по ссылке - полная версия для RTOS. Чтобы использовать без RTOS, нужно убрать из Task_Buttons() вечный цикл и вызов OS_Delay(), а саму функцию вызывать с нужным периодом (например, раз в 20 мс).
Выражаю уважание и благодарность за универсальность кода! За то что пишет и делится с людьми,очень помогают в хобби.
CERGEI вне форума   Ответить с цитированием
Старый 10.07.2017, 22:01   #84
GoshaGrek
Senior Member
 
Регистрация: 29.09.2011
Сообщений: 280
Вес репутации: 357/35
GoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really nice
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

доброго времени суток...
решил немного реанимировать эту тему.
прежде всего огромный респект TESTERy за пример кода для обработки состояний кнопок.
Сам пользуюсь иногда подобным кодом. Немного переделал правда под свои задачи- но основа такая же. В железе все работает правильно. Да и с

алгоритмом вроде особых непоняток не было...
Но вот возникли некоторые вопросы относитеьно переноса и универсальности данного кода.
Я так понимаю что для этого надо делать header и c файлы и подключать их к проекту..

ну что то наподобие...

Код:
/********************************************************************************
 *
 *  File:           buttons.h
 *
 *  Description:    Header for Task_Buttons
 *
 *******************************************************************************/
#ifndef _TASK_BUTTONS_H
#define _TASK_BUTTONS_H
//****************************************************************************** 
//      Constants
//******************************************************************************

//------------------------------------------------------------------------------
//  Buttons pins definitions (up to 8 pins)
//------------------------------------------------------------------------------
#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
//******************************************************************************  
//      Types 
//******************************************************************************

//------------------------------------------------------------------------------
//  Inputs type definition
//------------------------------------------------------------------------------

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;

//******************************************************************************  
//      Variables 
//******************************************************************************

extern volatile TBUTTONS    m_Buttons;

//******************************************************************************  
//      Function prototypes
//******************************************************************************

extern void Task_Buttons (void);

#endif

//****************************************************************************** 
//      THE END (buttons.h) 
//******************************************************************************
Код:
/***********************************************************************
 *
 *  File:           buttons.c
 *
 **********************************************************************/
//*********************************************************************  
//      Includes
//*********************************************************************
#include <pic.h>
#include <htc.h>
#include "buttons.h"
//*********************************************************************
//  
//      Constants
// 
//*********************************************************************


//********************************************************************* 
//      Variables 
//*********************************************************************
volatile TBUTTONS    m_Buttons;
//********************************************************************* 
//      Function prototypes
//*********************************************************************

void Task_Buttons (void);


//********************************************************************* 
//      Functions 
//*********************************************************************

/**********************************************************************
 *  TASK: Task_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;
    }
}
//******************************************************************************
//      THE END (buttons.c) 
//******************************************************************************
а основной файл проекта будет типа такого как то

Код:
#include <pic.h>
#include <math.h>
#include <stdio.h>
#include "buttons.h"

__CONFIG(FOSC_INTOSCIO&WDTE_OFF&PWRTE_ON&MCLRE_OFF&BOREN_OFF&CP_OFF&LVP_OFF);

#define _XTAL_FREQ 4000000

#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

//---------------------------------------------------------------------------
void init(void);
void interrupt isr(void);
void main(void);
extern void Task_Buttons(void);

//---------------------------------------------------------------------------
void init() {
...........
...........
}


//---------------------------------------------------------------------------
void interrupt isr(void) {

       Task_Buttons();
    
}
//---------------------------------------------------------------------------
void main(void) {
    init();

  
    do {
 
 //....main code
 
    } while (1);
}
но вот вопрос- в headere надо указывать конкретную привязку кнопок к порту...
а если у меня например другой контроллер- где кнопки подключены вообще вразнобой или к другому порту- то это надо и в headere менять...
По другому что то не получается.. Или я что то не так делаю?
Как сию библиотеку присобачивать к проекту так , чтоб порты , на которых кнопки юзаются , определялись только в основном файле проекта..
Чуйка есть что надо еще макросы делать. Но вот как и в каком файле их изображать, чтоб все корректно работало, пока не пойму...
GoshaGrek вне форума   Ответить с цитированием
Старый 11.07.2017, 06:41   #85
master19
Senior Member
 
Регистрация: 22.01.2008
Возраст: 41
Сообщений: 237
Вес репутации: 162/46
master19 has a spectacular aura aboutmaster19 has a spectacular aura about
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

я вообще не привязываюсь к портам, создаю переменную input, которую заполняю опросом портов, потом передаю ее в функцию обработки. не так быстро и изящно, зато можно обрабатывать сигналов больше 8. Примерно так:
Код:
void buttonControl(TBUTTON * _button, uint8_t _pKeyIn, uint8_t _numButton )
input = 0;
if (PORTB & (1<<0)) input |= (1<<0);
if (PORTС & (1<<6)) input |= (1<<2);
if (PORTA & (1<<2)) input |= (1<<3);

buttonCtrl(&buttons, input);

void buttonControl(TBUTTON * _button, uint8_t _pKeyIn, uint8_t _numButton )
{
	unsigned int i;
	if (_numButton > NUMKEYMAX) _numButton = 0; 
	for(i = 0; i < _numButton; i++)
	{
		
		//------------------------------------------------------------------------------
		//  Кнопка еще не нажата
		//------------------------------------------------------------------------------
		if (!_button[i].bsPressed) 
		{
			_button[i].bsJitter++;
			// активный уровень 1
			if ((_pKeyIn & (1<<i))) _button[i].bsJitter = 0;  // Подавляем дребезг
		
			if (_button[i].bsJitter == 3)				// Перестала дребезжать
			{
				_button[i].bsPressed = 1;			 	// Нажата
				_button[i].bsJustPressed = 1;		 	// Нажата только что (сбрасывается вручную)
				_button[i].bsHold = 0;					// Не удерживается
				_button[i].bsShort = 0;			   		// Не короткое нажатие
				_button[i].bsHoldCounter = 0;
			}   // if jitter
		} 
		else
		{	// if button pressed
		
			//------------------------------------------------------------------------------
			//  Кнопка нажата, проверяем удерживание
			//------------------------------------------------------------------------------
		
			_button[i].bsJitter++;
			// активный уровень 0
			if (!(_pKeyIn & (1<<i))) _button[i].bsJitter = 0; // Подавляем шорох
		
			if (_button[i].bsJitter == 3)			 // Кнопку только что отпустили
			{
				_button[i].bsPressed = 0;
				if (!_button[i].bsHold)			   	// Если не было удерживаниядольше 1 сек,
					_button[i].bsShort = 1;		   	// то установить флаг "короткого нажатия"
				_button[i].bsJustReleased = 1;
				_button[i].bsHold = 0;
				_button[i].bsHoldCounter = 0;
		
			}   // if jitter
		
			_button[i].bsHoldCounter++;
		
			if (_button[i].bsHoldCounter >= 50)	   // Проверяем удерживание
				_button[i].bsHold = 1;
		
		}   // if button pressed	
	}
}	}
master19 вне форума   Ответить с цитированием
Старый 25.08.2017, 13:21   #86
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 828
Вес репутации: 1473/57
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от tester Посмотреть сообщение
А по ссылке - полная версия для RTOS.
tester можете ссылку поправить? спасибо.
DmitrijVDN вне форума   Ответить с цитированием
Старый 25.08.2017, 14:22   #87
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,511
Вес репутации: 4829/116
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
tester можете ссылку поправить? спасибо.
его
"Последняя активность: 05.03.2017 18:12" Или перешел в режим невидимости.
ampersant на форуме   Ответить с цитированием
Старый 25.08.2017, 16:54   #88
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
tester можете ссылку поправить? спасибо.
Вроде вот об этом речь была:
Вложения
Тип файла: rar buttons.rar (2.3 Кб, 9 просмотров)
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 26.08.2017, 00:23   #89
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 828
Вес репутации: 1473/57
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от petrd Посмотреть сообщение
Вроде вот об этом речь была:
возможно... только в коде tester-а и в вашем архиве есть несоответствия

Код:
        if (ucTemp)                             // Debounce
        {
            m_Buttons.ucJitter = 0;
        }
        else
        {
    
            //------------------------------------------------------------------------------
            
            m_Buttons.ucJitter++;
            ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Pins changing mask
.....
......
Код:
 
    if (ucTemp)                         // Подавление дребезга   
  {         m_Buttons.ucJitter = 0;   
           return;     }     //------------------------------------------------------------------------------      

    m_Buttons.ucJitter++;    
 ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Маска изменения состояние    
.....
.....
.....
DmitrijVDN вне форума   Ответить с цитированием
Старый 26.08.2017, 07:45   #90
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,803
Вес репутации: 2039/81
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
возможно... только в коде tester-а и в вашем архиве есть несоответствия

Код:
        if (ucTemp)                             // Debounce
        {
            m_Buttons.ucJitter = 0;
        }
        else
        {
    
            //------------------------------------------------------------------------------
            
            m_Buttons.ucJitter++;
            ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Pins changing mask
.....
......
Код:
 
    if (ucTemp)                         // Подавление дребезга   
  {         m_Buttons.ucJitter = 0;   
           return;     }     //------------------------------------------------------------------------------      

    m_Buttons.ucJitter++;    
 ucTemp = s_ucPort ^ m_Buttons.ucPressed;// Маска изменения состояние    
.....
.....
.....
http://www.microchip.su/showpost.php...4&postcount=65
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 26.08.2017, 14:09   #91
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,876
Вес репутации: 5553/169
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

Цитата:
Сообщение от ampersant Посмотреть сообщение
Или перешел в режим невидимости.
нет, просто редко заходит
Greg вне форума   Ответить с цитированием
Старый 26.08.2017, 22:21   #92
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 828
Вес репутации: 1473/57
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

petrd спасибо. понял
DmitrijVDN вне форума   Ответить с цитированием
Старый 29.08.2017, 22:11   #93
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 828
Вес репутации: 1473/57
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Нажатие кнопки + антидребезг (16F877, HI-TECH)

попробовал вчера применить код от testera,
интересовала лишь реакция на изменение состояния батонов, на медленных изменениях код как-то еще работает , при тактах 2-3 нажатия в секунду все грустно, особенно если добавить ждитер. изменения по одному входу влияют на регистрацию изменений по другому,
скрины: по спаду на С инвертируем состояние на Q
по спаду на MAGNET (S4(IN)) устанавливаем лог1 на SENDER
системный тик = собака 18мс
Миниатюры
TestButton.png  
DmitrijVDN вне форума   Ответить с цитированием
Старый 09.11.2018, 13:40   #94
AlDes
Member
 
Регистрация: 08.07.2016
Сообщений: 37
Вес репутации: 137/13
AlDes will become famous soon enoughAlDes will become famous soon enough
По умолчанию

Функция от уважаемого tester в целом работает хорошо. Но, в "моем" устройстве, иногда есть необходимость быстрого нажатия трех кнопок. В таком случае, не все кнопки отслеживаются.

Совместил функцию с идеей вертикальных счетчиков.

https://www.compuphase.com/electronics/debouncing.htm

Приведу файл buttons.c , которым достаточно заменить прежний buttons.c в проектах, где уже используется функция от tester ,с соответствующими правками на названия переменных и количества кнопок.

В структуре, поле unsigned char ucJitter : 2; становиться не нужным.

Поскольку, мне были необходимы только три позиции, "uiPressed", "uiJustPressed", "uiJustReleased", то остальные не рассматривал. В прочем, их не трудно домыслить.

Этот вариант для 16 ти кнопок, чтобы использовать под 8мь, необходимо заявить переменные как unsigned char.

Функция прогонялась в симуляторе с различными вариациями по нажатию и отпусканию кнопок во время подавления дребезга для других кнопок.

Всегда был следующий результат.
Кнопка будет отслеживаться после изменения ее состояния до тех пор, пока не будет прочитано четыре раза одинаковая информация с нее. И только потом, заявиться как "отдребезжавшая".

Собственно код.

Код:
/************************************************************************************************
 *         debonce vertical counter
 *  File:           buttons.c
 *
 *  Compilers:      XC8
 *
 *  Description:    
 *
 ************************************************************************************************/



#include <xc.h>
#include "buttons.h"


volatile TBUTTONS    m_Buttons;

void Task_Buttons (void);	
	
	void Task_Buttons( void) 
	{
        
        static unsigned int  s_uiCnt0,s_uiPort, s_uiDelta, s_uiCnt1;
        unsigned int uiToggle,uiTemp;
   
        uiTemp = 0x00;
// Собираем состояния портов в uiTemp
        if (!pin_BUTTON0) uiTemp |= 0x01;
        if (!pin_BUTTON1) uiTemp |= 0x02;
        if (!pin_BUTTON2) uiTemp |= 0x04;
        if (!pin_BUTTON3) uiTemp |= 0x08;
        if (!pin_BUTTON4) uiTemp |= 0x10;
        if (!pin_BUTTON5) uiTemp |= 0x20;
        if (!pin_BUTTON6) uiTemp |= 0x40;
        if (!pin_BUTTON7) uiTemp |= 0x80;
        if (!pin_BUTTON8) uiTemp |= 0x100;
        if (!pin_BUTTON9) uiTemp |= 0x200;
 
 
 
	s_uiDelta = uiTemp ^ s_uiPort;  // получаем изменившиеся биты
        s_uiCnt1 = (s_uiCnt1 ^ s_uiCnt0) & s_uiDelta; // счетчик-фильтр
        s_uiCnt0 = ~s_uiCnt0 & s_uiDelta;
        uiToggle = s_uiDelta & ~(s_uiCnt0 | s_uiCnt1); // отфильтрованные изменения битов
        s_uiPort ^= uiToggle;  // отфильтрованные биты // Текущее состояние портов будет s_uiPort

	if(uiToggle){
	   m_Buttons.uiPressed = s_uiPort;
	   m_Buttons.uiJustReleased |=  (uiToggle & (~m_Buttons.uiPressed));
	   m_Buttons.uiJustPressed  |=  (uiToggle & m_Buttons.uiPressed);
	   }
	   }


//******************************************************************************
// 
//      THE END (buttons.c)
// 
//******************************************************************************
Обращаю внимание, что красивая конструкция
Код:
//------------------------------------------------------------------------------
        //  Проверяем отпущенные кнопки
        //------------------------------------------------------------------------------
        
        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;
    }
работать здесь не будет. Т.к., при нажатии (отпускании) на еще одну кнопку во время подавления дребезга, в полях

Код:
unsigned char   ucShort;              
    unsigned char   ucJustPressed;       
    unsigned char   ucJustReleased;       
    unsigned char   ucChanged;
могут быть не корректные значения.

Недостаток данного решения, в увеличении потребления ресурсов.

На авторство естественно не претендую. Не исключаю возможности, что кто то, уже сделал подобное.
AlDes вне форума   Ответить с цитированием
Ответ

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


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

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

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

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

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


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


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