AVR243
Декодер клавиатурной матрицы 8x8
Отличительные особенности:
- 64- кнопочная клавиатура в виде матрицы 8 х 8
- Не требуется внешних компонентов
- Выход из режима "сна" по нажатию на кнопку
- Легкая интеграция с другими приложениями
- Низкое потребление
- Программный алгоритм антидребезга
- Поддержка альтернативных функций кнопок, которая для сокращения размера программы может быть легко удалена
- Код программы может использоваться любым AVR микроконтроллером, имеющим не менее 17 линий портов ввода - вывода и имеющим прерывание по изменению состояния линий (в настоящее время это только ATmega162 и ATmega169)
- Код может быть легко модифицирован для применения в других микроконтроллерах, использующих общее прерывание (см. пример применения "AVR240: 4 x 4 Keypad - Wake-up on Keypress")
Введение
В данном примере применения описывается программа драйвера интерфейса клавиатурной матрицы 8 x 8. Пример применения разработан для использования в устройствах с автономным питанием. AVR микроконтроллер большую часть времени проводит в режиме сна, активизируясь лишь тогда, когда происходит нажатие кнопок клавиатуры. После этого происходит сканирование клавиатурной матрицы, обработка информации и возврат в режим пониженного потребления.
Также устройство, описываемое в данном примере применения, поддерживает альтернативные программируемые пользователем функции типа Caps Lock, Ctrl-, Shift- и Alt-. Тестовое приложение обслуживает клавиатурную матрицу 4 x 4, каждой кнопке которой соответствует одна цифра и три символа. Альтернативные кнопки позволяют выбрать функцию нажимаемой кнопки.
Рисунок 1. Тестовое приложение
Это устройство подходит для всех приложений, использующих матричную клавиатуру, например, пульты дистанционного управления, мобильные телефоны и системы аварийной сигнализации и контроля доступа. Обновление программного обеспечения производится очень легко за счет наличия у микроконтроллеров семейства ATmega функций самопрограммирования и внутрисистемного программирования. Эти функции особенно полезны при использовании этих микроконтроллеров в универсальных пультах дистанционного управления.
Устройство, описываемое в данном примере применения, построено на микроконтроллере ATmega162. Однако, после небольших изменений код программы может использоваться в микроконтроллере ATmega169.
Принцип действия
Подключение кнопок клавиатурной матрицы 8 x 8 показано на рисунке 2. При нажатии на кнопку происходит соединение соответствующих строк и столбцов. При нажатии на левую верхнюю кнопку происходит замыкание самого левого столбца и самой верхней строки.
Рисунок 2. Подключение клавиатурной матрицы
Клавиатурные матрицы могут сканироваться несколькими способами. Если может быть нажата только одна кнопка, то выбирается быстрый способ сканирования, при котором одновременно выбираются (устанавливается низкое значение) все строки, и считывается состояние столбцов. После этого выбираются все столбцы, и считывается состояния строк. Возвращенные значения столбца и строки объединяются в код, идентифицирующий нажатую кнопку. Этот метод и используется в данном примере применения.
Если необходимо обслуживать клавиатуру, допускающую одновременное нажатие кнопок, то описанный выше метод не может быть использован. В этом случае строки должны быть отсканированы отдельно. Строки должны быть выбраны (устанавливается низкое значение) последовательно, при этом снимается состояние всех столбцов. При этом определяются все нажатые кнопки. Однако в этом случае появляются межсоединения. На рисунке 3 показан результат нажатия трех клавиш, при котором кажется, что нажата еще и кнопка, помеченная иксом. Это приводит к появлению ошибки декодирования.
Рисунок 3. Ложное декодирование при одновременном нажатии кнопок
Для обнаружения нажатия кнопок и пробуждения из режима сна используется прерывание по изменению состояния выводов, имеющееся у используемого AVR микроконтроллера. Перед входом в режим сна на всех выводах строк устанавливается низкий уровень, что приводит к появлению на входах столбцов низкого сигнала при нажатии на кнопки. В результате этого произойдет прерывание.
При использовании прерывания по изменению состояния входа обслуживается только одно нажатие. В этом случае не формируется автоматическое повторение нажатия при удерживании кнопки. Имитация повторного нажатия должна быть реализована отдельной подпрограммой.
Альтернативные кнопки
Многие клавиатурные интерфейсы используют функции вспомогательных кнопок. Реализовано это может быть несколькими способами. Один из самых распространенных методов состоит в выделении нескольких кнопок, которым назначаются альтернативные функции. При одновременном нажатии этих и обычных кнопок формируется вторичной скан-код. Также существуют варианты, когда альтернативная кнопка нажимается непосредственно перед нажатием основной кнопки. В этом случае устраняется необходимость отслеживания одновременных нажатий.
Альтернативные кнопки принимаются во внимание только в том случае, когда нажаты основные кнопки. В этом случае альтернативные кнопки называются "одновибраторными".
Также возможно реализовать "триггерные" кнопки, которые при первом нажатие активизируют альтернативные функции, а при повторном нажатии отключают их. В этом случае используются альтернативные функции для всех нажимаемых впоследствии кнопок. Такие функции имеет кнопка Caps Lock на стандартной компьютерной клавиатуре. В данном примере применения используется как одновибраторные, так и триггерные кнопки.
Использование принципа последовательного, а не одновременного нажатия кнопок позволяет избежать проблем, связанных с ошибочным декодированием. Если нажато несколько кнопок одновременно, то приложение просто проигнорирует это.
Дребезг контактов
На рисунке 4 показан дребезг контактов при нажатии на кнопку. Как видно, происходит имитация многократного нажатия. Для того, чтобы избежать неправильного декодирования, считывание скан-кода производится через некоторое время, после того, как произошло прерывание по изменению состояния. Также этот алгоритм, называемый антидребезгом, позволяет избежать ложных срабатываний при воздействии шумов. Подавление дребезга контактов может быть реализовано и при помощи аппаратного или цифрового фильтра, но используемый в данном примере применения метод требует наименьших затрат.
Рисунок 4. Дребезг контактов
Реализация
В данной реализации использован микроконтроллер ATmega162. Рекомендации при переходе на микроконтроллер ATmega169 перечислены в конце данного документа.
Клавиатура подключается к двум 8- битным портам AVR микроконтроллера. Один порт (порт D) настроен на работу всех линий в качестве выходов и подключен к строкам клавиатурной матрицы. Другой порт (порт C) настроен на работу всех линий в качестве входов и подключен к столбцам клавиатурной матрицы. Подробнее это можно увидеть на рисунке 2. При сканировании клавиатурной матрицы порт, используемый как выходной, должен удерживать выходы в низком состоянии, а порт, используемый как входной должен иметь встроенные подтягивающие к питанию резисторы.
Описываемое устройство использует первую линию порта Е для формирования последовательного кода, соответствующего коду нажатой кнопки. Данные передаются при помощи встроенного UART, использование которого описанного в примере применения AVR306.
При обычном нажатии формируется скан-код, значение которого лежит в диапазоне от 0 до 63 (8 строк * 8 столбцов). Нажатие кнопки вызова альтернативной функции также формирует обычный скан-код, но кроме этого устанавливаются соответствующие флаги альтернативных функций. Эти флаги состояния хранятся в глобальной переменной.
Три кнопки вызова альтернативных функция настроены на работу в режиме триггерных кнопок, а четыре - как одновибраторные. При нажатии на эти кнопки формируется обычный скан-код, что позволяет приложению обрабатывать их как и обычные кнопки.
Другая глобальная переменная используется для передачи приложению скан-кода вместе с флагами. Шесть младших бит используются для передачи кода (от 0 до 63), а старший значащий бит (СЗБ) указывает на изменение состояния. Драйвер клавиатуры устанавливает этот бит при нажатии кнопки. Приложение опрашивает этот бит и сбрасывает его после считывания скан-кода. Глобальный байт и скан-слово показаны на рисунке 5.
Рисунок 5. Расширенный скан-код
Программа клавиатурного драйвера реализована как программа обработки прерывания. Основная программа переводит микропроцессор в режим сна. При нажатии на кнопку драйвер клавиатуры пробуждает AVR микроконтроллер, получает скан-код и обновляет глобальные байты. После выполнения функций нажатых кнопок основная программа снова переводит микроконтроллер в режим сна.
Модуль инициации и основная программа
На рисунке 6 показан модуль инициализации и основная программа. Сброс флагов альтернативных функций и глобальных переменных, а так же инициализация портов описаны выше. Если не требуется производить никакой обработки, то выбирается Idle режим сна.
Рисунок 6. Модуль инициации и основная программа
Основной модуль декодера клавиатуры
Декодер клавиатуры представляет собой подпрограмму обработки прерывания по изменению состояний портов. Сначала выбирается Idle режим сна, позволяющий AVR микроконтроллеру активизироваться по переполнению таймера, что невозможно при нахождении микроконтроллера в Power-down режиме сна. Таймер устанавливается на формирование прерывания через 5 мс, что вполне достаточно для окончания переходных процессов сигналов на выводах. В течение этого времени задержки основная программа восстанавливает управление и может активизировать режим сна. По окончании времени задержки вызывается процедура обработки нажатия кнопок. Эта функция завершает определение кода нажатой кнопки. По окончании ее на линиях портов всех строк устанавливается низкий уровень и активизируется Power-down режим сна, выход из которого возможен по нажатию на кнопку. Блок-схема этого программного модуля показана на рисунке 7.
Рисунок 7. блок-схема основного программного модуля декодера клавиатуры
Сканирование клавиатуры (обработка нажатия кнопок)
На рисунке 8 приведена блок-схема подпрограммы сканирования клавиатуры. Сначала сканируется результат по столбцам. Три младших бита скан-кода (столбцы) увеличиваются до тех пор, пока не будет найден низкий уровень на линии столбца. После этого происходит инвертирование направленности линий портов и сканирование повторяется. При этом производится поиск низкого уровня на линиях строк. После этого вызывается подпрограмма обработки скан-кода.
Рисунок 8. Блок-схема подпрограммы сканирования клавиатуры
Сначала функция обработки скан-кода копирует сформированный скан-код в глобальную переменную. После этого скан-код сравнивается с кодами кнопок альтернативных функций и формируются соответствующие флаги альтернативных функций. Эти флаги копируются в глобальную переменную. Если нажатая кнопка не является альтернативной, то флаги всех одновибраторных альтернативных функций сбрасываются. Наконец, устанавливаются новые флаги. Блок схема этой функции приведена на рисунке 9.
Рисунок 9. Блок-схема функции обработки скан-кода
Тестовый пример применения myCellPhone
Существует тестовый пример применения, в котором реализована клавиатурная матрица, напоминающая клавиатуру сотового телефона. Конечные символы в нем передаются по USART интерфейсу. Используя клавиатурную матрицу 4 x 4 можно сформировать все цифры и символы, которые можно обеспечить при помощи еще четырех кнопок вызова альтернативных функций. Три кнопки используются для выбора альтернативной функции каждой основной кнопки, а четвертая выполняет роль кнопки Caps Lock (переключение между верхним или нижним регистрами).
Для преобразования скан-кодов в кодовые комбинации, соответствующие кодам нажатых кнопок с учетом кнопок альтернативных функций, используется таблица преобразования. Скан-код может быть использован и для сканирования клавиатурной матрицы 8 x 8. Таким образом, таблица должна иметь 8 входов на строку, притом, что используется только 4 кнопки в каждой строке. Таким образом, при увеличении количества столбцов клавиатурной матрицы изменения размера программы не произойдет.
Размер кода прикладной программы и временные параметры
Размеры кодов подпрограмм различных функций обработки клавиатурной матрицы приведены в таблице 1.
Таблица 1. Размеры кодов подпрограмм различных функций обработки клавиатурной матрицы
Функция |
Размер кода (слов) |
Описание |
key_init |
25 |
Инициация интерфейса клавиатурной матрицы |
key_stop |
7 |
Временная остановка драйвера |
key_get |
15 |
Ожидание нажатия кнопок |
key_processAltKeys |
88 |
Обработка кнопок альтернативных функций и обновление соответствующих флагов |
pinChangeISR |
24 |
Подпрограмма обработки прерывания по изменению состояния линий портов ввода-вывода |
Timer0OVFISR |
107 |
Подпрограмма обработки прерывания по переполнению таймера |
Итого |
266 |
|
В таблице 2 приведены длительности выполнения различных действий микроконтроллером ATmega162, работающем на частоте 8 МГц. Здесь приведены последовательности действий от пробуждения при обнаружении нажатия кнопки до входа в режим сна после обработки нажатых кнопок.
Таблица 2. Длительности выполняемых последовательностей действий
Последовательность |
Время выполнения |
Пробуждение при изменении состояния линии порта ввода-вывода -> инициализация таймера -> переход в режим сна |
40 мкс |
Idle режим сна -> переполнение таймера |
65,4 мс |
Пробуждение по переполнению таймера -> сканирование клавиатурной матрицы -> вход в Power-down режим сна |
351 мкс |
Общее время нахождения в Power-down режиме сна |
65,7 мс |
Если не учитывать Power-down режим сна, то видно, что большую часть времени микроконтроллер работает в Idle режиме сна. В активном режиме микроконтроллер находится всего 0.3 мс, что составляет около 0.5 % от общего времени. Относительное время нахождения в различных рабочих режимах приведено в таблице 3.
Таблица 3. Потребление и относительное время нахождения микроконтроллера в различных рабочих режимах
Режим работы |
Время (потребление) |
Активный |
0.5 % (15 мА) |
Idle режим сна |
99.5 % (7 мА) |
Power-down режим сна |
Ожидание нажатия кнопок (<1 мкА) |
Если предположить, что кнопки нажимаются раз в 10 минут, то среднее потребление составит всего 2 мкА.
Рассуждения об использовании других микроконтроллеров
Единственное отличие при использовании микроконтроллеров ATmega162 и ATmega169 состоит в том, что у них должны использоваться разные порты для подключения клавиатурной матрицы. ATmega162 использует порт C, в то время как у ATmega169 должен использоваться порт Е. Это вызвано тем, что у них различные порты имеют прерывание по изменению состояния линий. ATmega162 имеет функцию формирования прерывания по изменению состояния линий порта С, а ATmega169 - по изменению состояния линий порта Е. Если необходимо использовать другие альтернативные функции этих портов, то необходимо модифицировать приложение таким образом, чтобы использовать для подключения клавиатурной матрицы другой порт, имеющий функцию формирования прерывания по изменению состояния линий.
Также обратите внимание, что для активизации режима сна ATmega169 использует SMCR регистр.
При использовании других микроконтроллеров понадобятся дополнительные внешние компоненты и изменение используемого прерывания. Использование таких микроконтроллеров для обработки клавиатурной матрицы 4х4 описано в примере применения AVR240. Остальные функции описанного примера применения в изменениях не нуждаются.
раздвижные двери на заказ
|