Простая стандартная программа Debounce

[g0] если android не может установить выделение, которое вы делаете, используя позицию курсора ... я решил проблему, поставив это точно перед строкой сбоя [/g0] [f1]
8
задан Benoit 30 September 2008 в 20:59
поделиться

7 ответов

Я думаю, что Вы могли узнать много об этом здесь: http://www.ganssle.com/debouncing.pdf

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

Простой пример кода от TFA:

#define CHECK_MSEC 5 // Read hardware every 5 msec
#define PRESS_MSEC 10 // Stable time before registering pressed
#define RELEASE_MSEC 100 // Stable time before registering released
// This function reads the key state from the hardware.
extern bool_t RawKeyPressed();
// This holds the debounced state of the key.
bool_t DebouncedKeyPress = false;
// Service routine called every CHECK_MSEC to
// debounce both edges
void DebounceSwitch1(bool_t *Key_changed, bool_t *Key_pressed)
{
    static uint8_t Count = RELEASE_MSEC / CHECK_MSEC;
    bool_t RawState;
    *Key_changed = false;
    *Key_pressed = DebouncedKeyPress;
    RawState = RawKeyPressed();
    if (RawState == DebouncedKeyPress) {
        // Set the timer which allows a change from current state.
        if (DebouncedKeyPress) Count = RELEASE_MSEC / CHECK_MSEC;
        else Count = PRESS_MSEC / CHECK_MSEC;
    } else {
        // Key has changed - wait for new state to become stable.
        if (--Count == 0) {
            // Timer expired - accept the change.
            DebouncedKeyPress = RawState;
            *Key_changed=true;
            *Key_pressed=DebouncedKeyPress;
            // And reset the timer.
            if (DebouncedKeyPress) Count = RELEASE_MSEC / CHECK_MSEC;
            else Count = PRESS_MSEC / CHECK_MSEC;
        }
    }

}

11
ответ дан 5 December 2019 в 06:10
поделиться

Нет никакого единственного простого решения, которое работает на все типы кнопок. Независимо от того, что кто-то здесь говорит Вам использовать, необходимо будет попробовать его аппаратными средствами и видеть, как хорошо это работает. И посмотрите на сигналы на объеме, чтобы удостовериться, что Вы действительно знаете то, что продолжается. Ссылка богатого B на PDF похожа на хорошее место для запуска.

2
ответ дан 5 December 2019 в 06:10
поделиться

Простые решения являются часто лучшими, и я нашел, что просто только чтение переключателя указывает, что каждый N millseconds (между 10 и 50, в зависимости от переключателей) всегда работал на меня.

Я разделил поврежденный и комплекс debounce стандартные программы и заменил их простым медленным опросом, и результаты всегда были достаточно хороши тот путь.

Для реализации его Вам будет нужно простое периодическое прерывание по таймеру в Вашей системе (принимающий поддержку RTOS), но если Вы привыкли программировать его в чистом металле, который не должно быть трудно расположить.

Обратите внимание, что этот простой подход добавляет задержку с обнаружением изменения в состоянии. Если переключатель берет мс T для достижения нового устойчивого состояния, и это опросило каждые X мс, то худшая задержка случая обнаружения нажатия является мс T+X. Ваш интервал опроса X должен быть больше, чем время возврата худшего случая T.

11
ответ дан 5 December 2019 в 06:10
поделиться

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

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

2
ответ дан 5 December 2019 в 06:10
поделиться

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

1
ответ дан 5 December 2019 в 06:10
поделиться

Если можно выйти сухим из воды, лучшее решение в аппаратных средствах состоит в том, чтобы иметь переключатель, имеют два отличных состояния без состояния между. Таким образом, используйте переключатель SPDT с каждым полюсом, подающим или R или строки S зеркального отражения/переброса. Соединенный проводом тот путь, вывод зеркального отражения/переброса должен быть debounced.

1
ответ дан 5 December 2019 в 06:10
поделиться

То, что я обычно делаю, имеют приблизительно три переменные ширина входного регистра. Каждый опрос, обычно от прерывания, смещает значения один для освобождения дорогу для нового образца. Затем мне сформировали debounced переменную путем установки логического - и образцов и очистки логичной инверсии - или. т.е. (непротестированный, из памяти)

input3 = input2;
input2 = input1;
input1 = (*PORTA);

debounced |= input1 & input2 & input3;
debounced &= (input1 | input2 | input3);

Вот пример:

debounced имеет xxxx (где 'x' "что"),

input1 = 0110,
input2 = 1100,
input3 = 0100

С информацией выше,

Мы должны переключить только бит от 2 до 1 и укусили от 0 до 0. Остальные все еще "возвращаются".

debounced |= (0100); //set only bit 2
debounced &= (1110); //clear only bit 0

Результат состоит в том что теперь debounced = x1x0

0
ответ дан 5 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: