Friendly
09.02.2013, 11:41
Возникла потребность максимально упростить и сделать по максимому надежным алгоритм опроса кнопок в мембранной клавиатуре.
Были случаи ложных срабатываний, импульсы которых делали броски тока по питанию - такое бывает когда на кнопку, которая замыкается, подаются два противоположных полюса питания. Если монитор питания настроен по минимальному уровню отклонения, то такие броски могли вызвать перезагрузку микроконтроллера (МК). Но это бывает редко, чаще это связано с другими причинами. :)
Рассмотрим на примере клавиатуры 4х4 линий (линии А и линии В). т.е. 16 кнопок.
1. Самая старшая модификация алгоритма работала так: на линии А подавались все уровни лог. "0" (L). Линии В , были подтянуты резисторами 10 кОм к питанию +5 вольт (H).
Таймером формировался опрос линии В через равные промежутки времени. При обнаружении низкого уровня на линии В, на линию А подавались поочередно следующие комбинации сигналов 0111, 1011, 1101, 1110 - после каждого такого сигнала опрашивалась линия В. таким образом выполнялось сканирование клавиатуры.
2. Второй алгоритм был усовершенствованием первого в том, что к линиям В катодами были подключены 4 диода, а анодами в точку соединенную с выводом порта внешнего прерывания INT0. Эта точка была подтянута к питанию резисторм 10 кОм, а на общий был подключен конденсатор 4700 пф. На линию А также подавались все низкие уровни, но опроса по линии В не было. При нажатии кнопки низкий уровень попадал на вывод внешнего прерывания МК INT0. Подпрограмма обработки прерывания завершала процедуру опроса кнопок клавиатуры. Преимущество в том, что в обычном состоянии никакие действия над выводами клавиатуры не производятся - как следствие, это снижения шума и высбождение ресурсов МК. Снижение шума особенно важно когда на "борту" работатет точное АЦП.
3. Модернизация алгоритма 2 заключалось в том, что после выполнения прерывания требовалось поочередно формировать на линиях А комбинации сигналов 0111, 1011, 1101, 1110, что имело свои недостатки. При нажатии (и отпускании) кнопок образуется, так называемый "дребезг" контактов - пачки импульсов образующихся в результате переходных прочессов в контактах - которые вызывали ложные вычисления номера нажатой кнопки.
В усовершенствованном алгоритме 3 при срабатывании прерывания и переходе к программе его обработки считывались уровни на линии В и запоминались в переменную - Х (на линии А - все низкие уровни). Затем на линии А уровни устанавливались в лог. "1" и порт переводился на ввод. На линии В подавались уровни соответстствующей переменной - Х. В этот момент с линий порта А считывалось значение - Y. Переменные X и Y перекодировались в значение строк и столбцов и суммировались - в результате получался номер нажатой кнопки клавиатуры.
Алгоритм можно записать так:
A = 0; B = 1;
INT0 { X = B; A = 1; B = X; Y = A; }
S = ( strng[X] + colmn[Y]);
A = 0; B = 1;
Кроме того, что этот алгоритм выполняется за меньшее количество циклов, у него меньше ложных срабатываний. В обычном состоянии (не нажата ни одна кнопка), также не выполняются никакие манипуляции с уровнями сигналов на линиях.
Были случаи ложных срабатываний, импульсы которых делали броски тока по питанию - такое бывает когда на кнопку, которая замыкается, подаются два противоположных полюса питания. Если монитор питания настроен по минимальному уровню отклонения, то такие броски могли вызвать перезагрузку микроконтроллера (МК). Но это бывает редко, чаще это связано с другими причинами. :)
Рассмотрим на примере клавиатуры 4х4 линий (линии А и линии В). т.е. 16 кнопок.
1. Самая старшая модификация алгоритма работала так: на линии А подавались все уровни лог. "0" (L). Линии В , были подтянуты резисторами 10 кОм к питанию +5 вольт (H).
Таймером формировался опрос линии В через равные промежутки времени. При обнаружении низкого уровня на линии В, на линию А подавались поочередно следующие комбинации сигналов 0111, 1011, 1101, 1110 - после каждого такого сигнала опрашивалась линия В. таким образом выполнялось сканирование клавиатуры.
2. Второй алгоритм был усовершенствованием первого в том, что к линиям В катодами были подключены 4 диода, а анодами в точку соединенную с выводом порта внешнего прерывания INT0. Эта точка была подтянута к питанию резисторм 10 кОм, а на общий был подключен конденсатор 4700 пф. На линию А также подавались все низкие уровни, но опроса по линии В не было. При нажатии кнопки низкий уровень попадал на вывод внешнего прерывания МК INT0. Подпрограмма обработки прерывания завершала процедуру опроса кнопок клавиатуры. Преимущество в том, что в обычном состоянии никакие действия над выводами клавиатуры не производятся - как следствие, это снижения шума и высбождение ресурсов МК. Снижение шума особенно важно когда на "борту" работатет точное АЦП.
3. Модернизация алгоритма 2 заключалось в том, что после выполнения прерывания требовалось поочередно формировать на линиях А комбинации сигналов 0111, 1011, 1101, 1110, что имело свои недостатки. При нажатии (и отпускании) кнопок образуется, так называемый "дребезг" контактов - пачки импульсов образующихся в результате переходных прочессов в контактах - которые вызывали ложные вычисления номера нажатой кнопки.
В усовершенствованном алгоритме 3 при срабатывании прерывания и переходе к программе его обработки считывались уровни на линии В и запоминались в переменную - Х (на линии А - все низкие уровни). Затем на линии А уровни устанавливались в лог. "1" и порт переводился на ввод. На линии В подавались уровни соответстствующей переменной - Х. В этот момент с линий порта А считывалось значение - Y. Переменные X и Y перекодировались в значение строк и столбцов и суммировались - в результате получался номер нажатой кнопки клавиатуры.
Алгоритм можно записать так:
A = 0; B = 1;
INT0 { X = B; A = 1; B = X; Y = A; }
S = ( strng[X] + colmn[Y]);
A = 0; B = 1;
Кроме того, что этот алгоритм выполняется за меньшее количество циклов, у него меньше ложных срабатываний. В обычном состоянии (не нажата ни одна кнопка), также не выполняются никакие манипуляции с уровнями сигналов на линиях.