AVR313: Подключение PC AT клавиатуры к AVR
AVR313: Подключение PC AT клавиатуры к AVR Оригинал: Application Note AVR313 фирмы ATMELОсобенности
- Подключается стандартная PC AT клавиатура
- Требуется только два I/O вывода. Один из них должен быть входом внешнего прерывания
- Не требуется внешних элементов
- Полный пример программы на С, осуществляющей преобразование данных, полученных от клавиатуры, и выдачу их через UART
Большинство микроконтроллеров, должно иметь какой ни будь интерфейс с человеком. Это приложение описывает в качестве одного из вариантов, использование стандартной PC AT клавиатуры.
Физический интерфейс
Физический интерфейс между клавиатурой и микроконтроллером показан на рисунке 1. Используются две сигнальных линии - синхронизации и данных. Сигнальные линии с открытым коллктором и имеют подтягивающие резисторы, расположенные в клавиатуре. Это позволяет как микроконтроллеру, так и клавиатуре формировать на линиях низкий уровень. Существует два типа разъемов, 5-ти штырьковый DIN разъем типа 5D, и миниатюрный 6-ти штырьковый мини-DIN. Расположение выводов показано в таблице 1.
Рисунок 1. Интерфейс.
Таблица 1. Расположение контактов разьемов PC клавиатуры
Разьем |
|
|
Синхронизация |
DIN41524 |
6-pin Mini DIN PS2 |
Синхронизаци |
1 |
5 |
Данные |
2 |
1 |
Не используются |
3 |
2, 6 |
Земля GND |
4 |
3 |
Питание +5 В |
5 |
4 |
Экран |
Оплетка |
Оплетка |
Временный диаграммы
Временные диаграммы передачи данных от клавиатуры к микроконтроллеру показаны на рисунке 2. Протокол обмена следующий: один старт бит (всегда 0), восемь бит данных, один бит четности и один стоп бит (всегда 1). Данные действительны в течении низкого уровня сигнала синхронизации. Синхросигнал формируется клавиатурой с длительностью низкого и высокого уровней по 30-50 мкс. Микроконтроллер также может посылать команды в клавиатуру, устанавливая низкий уровень на линии синхронизации, затем формируя импульс низкого уровня на линии данных (старт бит).
Алгоритм довольно прост: сохранение значения линии данных по спаду синхроимпульса. Это проще всего выполняется, если линия синхронизации подключена к INT0 или INT1. Прерывание будет выполняться по каждому фронту и спаду синхроимпульса, данные будут сохраняться по каждому спаду. После получения всех бит, данные можно декодировать. Это осуществляется вызовом функции decode. Для символьных клавиш эта функция сохраняет ASCII код клавиш в буфере. Это позволяет учитывать, удерживалась ли нажатой клавиша shift при нажатии данной клавиши. Другие функциональные клавиши вроде курсорных, ctrl и Alt и т.д. игнорируются. Карта соответствия скан-кодов ASCII кодам обрабатывается с помощью таблиц, одной для клавиш нажатых вместе с shift, а другой без.
Изменения и дополнения Если микроконтроллер потеряет синхронизацию с клавиатурой, все остальные принятые биты будут неверны. Один из способов решения этой проблемы это использование таймаута. Если 11 бит не получены в течении 1,5 мс, значит произошла ошибка. Счетчик битов должен быть сброшен, а поврежденные данные удалены. Для установки таких параметров как скорость и период повтора нажатой клавиши, необходимо посылать данные в клавиатуру. Это можно сделать, как описано выше. Команды можно найти в спецификации производителя клавиатуры.