This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| ru:examples:digi:switch_debounce [2010/12/14 21:03] – eduardtlmk | ru:examples:digi:switch_debounce [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Фильтрация дребезга переключателя ====== | ||
| - | // | ||
| - | |||
| - | ===== Теория ===== | ||
| - | |||
| - | [{{ : | ||
| - | |||
| - | Как было сказано в главе, знакомящей с переключателями, | ||
| - | |||
| - | [{{ : | ||
| - | |||
| - | Основной метод избежания ложного срабатывания, | ||
| - | |||
| - | ===== Практика ===== | ||
| - | |||
| - | Электрическая фильтрация не используется у переключателей Домашней Лаборатории, | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Программа для демонстрации дребезга контактов | ||
| - | // модуля Дигитальные входы-выходы Домашней Лаборатории. | ||
| - | // | ||
| - | #include < | ||
| - | |||
| - | // | ||
| - | // Обозначение выводов LED-ов и кнопок | ||
| - | // | ||
| - | pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; | ||
| - | pin button | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | // | ||
| - | // Основная программа | ||
| - | // | ||
| - | int main(void) | ||
| - | { | ||
| - | unsigned char new_value, old_value = 0; | ||
| - | unsigned char index, counter = 0; | ||
| - | |||
| - | // Настройка выводов LED-ов выходом | ||
| - | for (index = 0; index < 3; index++) | ||
| - | { | ||
| - | pin_setup_output(leds[index]); | ||
| - | } | ||
| - | |||
| - | // Обозначение выводов кнопок входом | ||
| - | pin_setup_input(button); | ||
| - | |||
| - | // Бесконечный цикл | ||
| - | while (true) | ||
| - | { | ||
| - | // Считывание состояния кнопки | ||
| - | new_value = pin_get_value(button); | ||
| - | |||
| - | // Контроль, | ||
| - | // т.е. является ли новое состояние 1, а старое 0 | ||
| - | if ((new_value) && (!old_value)) | ||
| - | { | ||
| - | // Увеличение счетчика и взятие 3 модуля | ||
| - | counter = (counter + 1) % 3; | ||
| - | |||
| - | // Значение счетчика зажиганию LED-а | ||
| - | for (index = 0; index < 3; index++) | ||
| - | { | ||
| - | pin_set_to(leds[index], | ||
| - | } | ||
| - | } | ||
| - | |||
| - | // Запоминаем старое состояние | ||
| - | old_value = new_value; | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | У программной фильтрации существует несколько методов. Это можно делать просто и сложно, | ||
| - | |||
| - | ~~PB~~ | ||
| - | |||
| - | Надежней программа, | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Функция некоторых IO расширительных плат для чтения фильтрованных значений переключателя | ||
| - | // | ||
| - | unsigned char pin_get_debounced_value(pin button) | ||
| - | { | ||
| - | unsigned char buffer = 0xAA; | ||
| - | unsigned char timeout = 100; | ||
| - | |||
| - | // Ждем, пока состояние кнопки станет ясным или закончится выяснение состояния | ||
| - | while (timeout-- > 0) | ||
| - | { | ||
| - | // Содержание 8 местного (битного) положения буфера | ||
| - | // Все предыдущие состояния (биты) сдвигаются влево и вправо | ||
| - | // добавляется новое состояние (бит). | ||
| - | buffer <<= 1; | ||
| - | buffer |= (pin_get_value(button) ? 0x01 : 0x00); | ||
| - | |||
| - | // Если все 8 бит в верхнем состоянии, | ||
| - | // кнопка точно нажата | ||
| - | if (buffer == 0xFF) | ||
| - | { | ||
| - | return 1; | ||
| - | } | ||
| - | |||
| - | // Если все 8 бит в нижнем состоянии, | ||
| - | // кнопка точно не нажата | ||
| - | if (buffer == 0x00) | ||
| - | { | ||
| - | return 0; | ||
| - | } | ||
| - | |||
| - | // Пауза 1 миллисекунда | ||
| - | // Эта функция находится в библиотеке Домашней Лаборатории | ||
| - | sw_delay_ms(1); | ||
| - | } | ||
| - | |||
| - | // Если состояние не удалось определить, | ||
| - | // что кнопка не нажата. | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Данная функция использует функцию образования задержки, | ||
| - | |||
| - | ~~PB~~ | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Программа для фильтрации дребезга контактов | ||
| - | // модуля Дигитальные входы-выходы Домашней Лаборатории. | ||
| - | // | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | // | ||
| - | // Обозначение выводов LED-ов и кнопок | ||
| - | // | ||
| - | pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; | ||
| - | pin button | ||
| - | |||
| - | // | ||
| - | // Основная программа | ||
| - | // | ||
| - | int main(void) | ||
| - | { | ||
| - | unsigned char new_value, old_value = 0; | ||
| - | unsigned char index, counter = 0; | ||
| - | |||
| - | // Настройка выводов LED-ов выходом | ||
| - | for (index = 0; index < 3; index++) | ||
| - | { | ||
| - | pin_setup_output(leds[index]); | ||
| - | } | ||
| - | |||
| - | // Обозначение выводов кнопок входом | ||
| - | pin_setup_input(button); | ||
| - | |||
| - | // Бесконечный цикл | ||
| - | while (true) | ||
| - | { | ||
| - | // Чтение состояния кнопки | ||
| - | new_value = pin_get_debounced_value(button); | ||
| - | |||
| - | // Контроль, | ||
| - | // и является ли новое состояние 1, а старое 0 | ||
| - | if ((!new_value) && (old_value)) | ||
| - | { | ||
| - | // Увеличение счетчика и взятие 3 модуля | ||
| - | counter = (counter + 1) % 3; | ||
| - | |||
| - | // Зажигание LED-а соответствующего значению счётчика | ||
| - | for (index = 0; index < 3; index++) | ||
| - | { | ||
| - | pin_set_to(leds[index], | ||
| - | } | ||
| - | } | ||
| - | |||
| - | // Запоминаем старое состояние | ||
| - | old_value = new_value; | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Если теперь опробовать программу, | ||