Подключение ps 2 клавиатуры к микроконтроллеру. Подключение клавиатуры PS/2 к микроконтроллеру: протокол, управление LED и отправка команд

Как работает протокол PS/2 для клавиатур. Как управлять светодиодами на клавиатуре PS/2. Как отправлять команды клавиатуре PS/2 от микроконтроллера. Какие особенности нужно учитывать при работе с PS/2 клавиатурой.

Принцип работы интерфейса PS/2

Интерфейс PS/2 использует две линии связи — данных и синхронизации. Рассмотрим основные принципы его работы:

  • Линии данных и синхронизации работают по принципу открытого коллектора
  • В состоянии покоя обе линии подтянуты к высокому уровню через резисторы
  • Клавиатура генерирует сигнал синхронизации при передаче данных хосту
  • Хост может удерживать линию синхронизации в низком состоянии, чтобы запретить передачу от клавиатуры

Для чего используется интерфейс PS/2? Он позволяет подключать периферийные устройства ввода, такие как клавиатуры и мыши, к компьютеру или микроконтроллеру.

Протокол передачи данных от клавиатуры

При нажатии клавиши клавиатура передает хосту пакет данных по следующему протоколу:


  1. Стартовый бит (всегда 0)
  2. 8 бит данных (скан-код клавиши)
  3. Бит четности
  4. Стоповый бит (всегда 1)

Данные передаются синхронно с сигналом тактирования, генерируемым клавиатурой. Как происходит синхронизация? Данные считаются действительными по спадающему фронту сигнала синхронизации.

Отправка команд клавиатуре

Для отправки команды клавиатуре микроконтроллер должен выполнить следующую последовательность действий:

  1. Удержать линию синхронизации в низком состоянии минимум 100 мкс
  2. Установить на линии данных стартовый бит (0)
  3. Отпустить линию синхронизации
  4. Дождаться спада сигнала синхронизации от клавиатуры
  5. Отправить 8 бит данных команды
  6. Отправить бит четности
  7. Дождаться подтверждения от клавиатуры (0 на линии данных)

Какие команды можно отправлять клавиатуре PS/2? Наиболее распространенные команды включают:

  • Сброс клавиатуры
  • Установка/сброс светодиодов
  • Установка скорости повтора
  • Изменение набора скан-кодов

Управление светодиодами клавиатуры

Для управления светодиодами клавиатуры PS/2 используется следующий алгоритм:


  1. Отправить команду ED hex (237 dec) клавиатуре
  2. Дождаться подтверждения от клавиатуры (FA hex)
  3. Отправить байт с битами состояния светодиодов:
    • Бит 0 — Scroll Lock
    • Бит 1 — Num Lock
    • Бит 2 — Caps Lock
  4. Дождаться подтверждения от клавиатуры

Как часто нужно обновлять состояние светодиодов? Обычно достаточно отправлять команду при изменении состояния соответствующего флага в программе.

Особенности работы с PS/2 клавиатурой

При реализации взаимодействия с PS/2 клавиатурой следует учитывать некоторые важные моменты:

  • Необходимо корректно обрабатывать ошибки связи и повторно инициализировать клавиатуру при необходимости
  • Рекомендуется использовать аппаратные прерывания для обработки входящих данных от клавиатуры
  • Важно учитывать временные параметры протокола PS/2 при отправке команд
  • Желательно реализовать буферизацию входящих данных для исключения потери информации

Какие преимущества дает использование PS/2 клавиатуры с микроконтроллером? Это позволяет создавать компактные системы с полноценным вводом текста при минимальных аппаратных затратах.


Реализация обработчика PS/2 клавиатуры

Рассмотрим пример простой реализации обработчика PS/2 клавиатуры на C для микроконтроллера:

«`c #include #include volatile uint8_t ps2_data; volatile uint8_t ps2_flags; #define PS2_CLOCK_PIN PD2 #define PS2_DATA_PIN PD3 ISR(INT0_vect) { static uint8_t bits_count = 0; static uint8_t data = 0; if (bits_count < 8) { data >
>= 1; if (PIND & (1 << PS2_DATA_PIN)) { data |= 0x80; } bits_count++; } else if (bits_count == 8) { // Проверка бита четности bits_count++; } else { ps2_data = data; ps2_flags |= 1; // Установка флага наличия новых данных bits_count = 0; data = 0; } } void ps2_init() { DDRD &= ~((1 << PS2_CLOCK_PIN) | (1 << PS2_DATA_PIN)); PORTD |= (1 << PS2_CLOCK_PIN) | (1 << PS2_DATA_PIN); EICRA |= (1 << ISC01); // Прерывание по спаду EIMSK |= (1 << INT0); // Разрешение прерывания INT0 sei(); // Глобальное разрешение прерываний } uint8_t ps2_read() { while (!(ps2_flags & 1)); // Ожидание новых данных uint8_t data = ps2_data; ps2_flags &= ~1; // Сброс флага return data; } ```

Как работает данный обработчик? Он использует прерывание по спаду сигнала синхронизации для побитового приема данных от клавиатуры. Полученный байт сохраняется в буфере и устанавливается флаг наличия новых данных.

Отправка команд клавиатуре PS/2

Для отправки команд клавиатуре PS/2 можно использовать следующую функцию:

«`c void ps2_send_command(uint8_t command) { uint8_t parity = 1; // Запрет прерываний cli(); // Удержание линии синхронизации DDRD |= (1 << PS2_CLOCK_PIN); _delay_us(100); // Установка стартового бита DDRD |= (1 << PS2_DATA_PIN); _delay_us(1); // Освобождение линии синхронизации DDRD &= ~(1 << PS2_CLOCK_PIN); // Отправка 8 бит данных for (uint8_t i = 0; i < 8; i++) { while (PIND & (1 << PS2_CLOCK_PIN)); if (command & 1) { DDRD &= ~(1 << PS2_DATA_PIN); parity ^= 1; } else { DDRD |= (1 << PS2_DATA_PIN); } command >>= 1; while (!(PIND & (1 << PS2_CLOCK_PIN))); } // Отправка бита четности while (PIND & (1 << PS2_CLOCK_PIN)); if (parity) { DDRD &= ~(1 << PS2_DATA_PIN); } else { DDRD |= (1 << PS2_DATA_PIN); } while (!(PIND & (1 << PS2_CLOCK_PIN))); // Ожидание подтверждения while (PIND & (1 << PS2_CLOCK_PIN)); while (PIND & (1 << PS2_DATA_PIN)); while (!(PIND & (1 << PS2_CLOCK_PIN))); // Разрешение прерываний sei(); } ```

Как использовать эту функцию для управления светодиодами? Для включения Caps Lock можно вызвать:

ps2_send_command(0xED); // Команда управления светодиодами
ps2_send_command(0x04); // Включение Caps Lock

Заключение

Работа с PS/2 клавиатурой требует понимания низкоуровневого протокола и точного соблюдения его временных параметров. При правильной реализации это позволяет создавать компактные системы с удобным вводом текста на базе микроконтроллеров.


Какие дальнейшие шаги можно предпринять для улучшения работы с PS/2 клавиатурой? Рекомендуется реализовать:

  • Буферизацию входящих данных для исключения потери при высокой скорости ввода
  • Обработку ошибок связи и автоматическую реинициализацию клавиатуры
  • Поддержку расширенных скан-кодов для функциональных клавиш
  • Настройку параметров клавиатуры (скорость повтора, задержка и т.д.)

Это позволит создать надежную и функциональную систему ввода на базе PS/2 клавиатуры и микроконтроллера.


Подключение клавиатуры к микроконтроллеру

Подключение клавиатуры к микроконтроллеру
Информация & документация

Подключение клавиатуры к микроконтроллеру

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

Физическое соединение между клавиатурой и ее ведущим показано на рисунке 1. Используется две линии ввода-вывода. В клавиатуре выходы этих линий сделаны по схеме с открытым коллектором, а резисторы подтягивают линии к напряжению питания. Если мастер будет посылать команды клавиатуре, он также должен использовать только открытый коллектор (для исключения конфликтов). В микроконтроллере для линии A удобнее использовать вывод, способный вызывать прерывание при изменении сигнала на входе. Существует два вида соединителей: 5-выводный разъем DIN типа «5D», и меньших размеров 6-выводный mini-DIN. Распиновка показана в таблице 1.

Таблица 1. Назначение выводов разъема AT-клавиатуры.

Компьютер AT
Сигналы DIN41524, мама со стороны компьютера 5-выводный DIN 180° 6-выводный Mini DIN тип PS2, мама со стороны компьютера
Clock (тактирование) 1 5
Data (данные) 2 1
не подключен 3 2, 6
GND 4 3
+5V 5 4
Shield (экран) Shell Shell

Временная диаграмма

Временная диаграмма передачи данных ведущему из клавиатуры показана на рисунке 2. Протокол следующий: один стартовый бит (всегда 0), восемь битов данных, один бит нечетного паритета и один стоповый бит (всегда 1). Данные верны во время низкого уровня сигнала тактирования. Клавиатура генерирует сигнал тактирования. Импульсы тактирования имеют длительность 30-50 мкс в состоянии низкого уровня и 30-50 мкс в состоянии высокого уровня.

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

Скан-коды

Каждая клавиша в AT-клавиатуре имеет собственный скан-код. Когда происходит нажатие клавиши, этот код передается. Если клавиша нажата какое-то время, передача начинает повторяться. Стандартная скорость повторения — 10 раз в секунду. Когда клавиша отпускается, клавиатура следом за скан-кодом клавиши посылает код «break» ($F0). Для большинства клавиш скан-код имеет размер 1 байт. Некоторые клавиши, например Home, Insert и Delete имеют расширенный скан-код. Размер расширенных скан-кодов — от 2 до 5 байт. Первый байт всегда содержит $E0. Это также верно и для последовательности «break», т.е. E0 F0 xx…

AT-клавиатуры способны работать с тремя наборами скан-кодов. Набор 2 используется по умолчанию.

Ошибки

Если ведущий рассинхронизируется с клавиатурой, все принимаемые данные будут неправильными. Единственный способ решения этой проблемы — использование тайм-аута. Если 11 битов не приняты за 1.5 мс, значит произошла ошибка. Счетчик битов должен быть сброшен.


Подключение PC AT клавиатуры к AVR – Радиодед

Большинство микроконтроллеров, должно иметь какой-нибудь интерфейс взаимодействия с человеком. Это приложение описывает в качестве одного из вариантов, использование стандартной компьютерной клавиатуры. Рассмотрим подключение стандартной PS/2 клавиатуры к микроконтроллеру AVR.

К микроконтроллеру подключается стандартная PC AT клавиатура. Требуется только два I/O вывода микроконтроллера. Один из них должен быть входом внешнего прерывания. Не требуется никаких внешних элементов.

    Физический интерфейс

    Физический интерфейс между клавиатурой и микроконтроллером показан на рисунке 1. Используются две сигнальных линии — синхронизации и данных. Сигнальные линии с открытым коллктором и имеют подтягивающие резисторы, расположенные в клавиатуре. Это позволяет как микроконтроллеру, так и клавиатуре формировать на линиях низкий уровень. Существует два типа разъемов, 5-ти штырьковый DIN разъем типа 5D, и миниатюрный 6-ти штырьковый мини-DIN.

    Расположение выводов показано в таблице 1.

    Рисунок 1. Интерфейс подключения

     

    Разьем
    DIN415246-pin Mini DIN PS2
    Синхронизация15
    Данные21
    Не используются3
    2, 6
    Земля GND43
    Питание +5 В54
    ЭкранОплеткаОплетка

    Таблица 1. Расположение контактов разъемов PC клавиатуры

    Временный диаграммы

    Временные диаграммы передачи данных от клавиатуры к микроконтроллеру показаны на рисунке 2. Протокол обмена следующий: один старт бит (всегда 0), восемь бит данных, один бит четности и один стоп бит (всегда 1). Данные действительны в течении низкого уровня сигнала синхронизации. Синхросигнал формируется клавиатурой с длительностью низкого и высокого уровней по 30-50 мкс. Микроконтроллер также может посылать команды в клавиатуру, устанавливая низкий уровень на линии синхронизации, затем формируя импульс низкого уровня на линии данных (старт бит). После чего линия синхронизации должна быть освобождена микроконтроллером. Затем клавиатура сформирует 10 синхроимпульсов. Данные на линии данных должны быть установлены микроконтроллером до формирования спада сигнала синхронизации. После 10-го бита, клавиатура проверяет наличие высокого уровня на линии данных (стоп бит), и если это так то, в свою очередь формирует низкий уровень. Это указывает микроконтроллеру, что данные приняты клавиатурой.

     

    Скан-коды

    Каждая клавиша АТ клавиатуры имеет свой скан-код. Этот код передается при нажатии клавиши. Если клавиша остается нажатой, то код начинает передаваться повторно. Частота повторения примерно 10 раз в секунду. Когда клавиша отпускается, после скан-кода клавиши передается код «BREAK» ($F0). Для большинства клавиш размер скан-кода составляет один байт. Некоторые клавиши, такие как Home, Insert и Delete имеют расширенный скан-код, от двух до пяти байт. Первый байт всегда $E0. Он также выдается и при формировании «BREAK» кода, то есть E0 F0 xx … АТ клавиатуры могут поддерживать три набора скан-кодов, Второй из которых устанавливается по умолчанию. В примере используется только второй набор.

     

    Алгоритм

    Прием данных от клавиатуры обрабатывается прерыванием INT0. Прием будет происходить независимо от выполнения остальной программы. Алгоритм довольно прост: сохранение значения линии данных по спаду синхроимпульса. Это проще всего выполняется, если линия синхронизации подключена к INT0 или INT1. Прерывание будет выполняться по каждому фронту и спаду синхроимпульса, данные будут сохраняться по каждому спаду. После получения всех бит, данные можно декодировать. Это осуществляется вызовом функции decode. Для символьных клавиш эта функция сохраняет ASCII код клавиш в буфере. Это позволяет учитывать, удерживалась ли нажатой клавиша shift при нажатии данной клавиши. Другие функциональные клавиши вроде курсорных, ctrl и Alt и т.д. игнорируются. Карта соответствия скан-кодов ASCII кодам обрабатывается с помощью таблиц, одной для клавиш нажатых вместе с shift, а другой без.

     

    Изменения и дополнения

    Если микроконтроллер потеряет синхронизацию с клавиатурой, все остальные принятые биты будут неверны. Один из способов решения этой проблемы это использование таймаута. Если 11 бит не получены в течении 1,5 мс, значит произошла ошибка. Счетчик битов должен быть сброшен, а поврежденные данные удалены. Для установки таких параметров как скорость и период повтора нажатой клавиши, необходимо посылать данные в клавиатуру. Это можно сделать, как описано выше. Команды можно найти в спецификации производителя клавиатуры.

    Рисунок 2. Временные диаграммы передачи данных клавиатурой в микроконтроллер.

    Источник: kazus.ru

    Просмотров всего: 986, сегодня: 1

    цифровая логика — при осмотре линий CLK и DATA клавиатуры PS/2 это выглядит… довольно странно

    Ну, это не был плохой прицел, неплотная проводка или плавающее заземление… это был PS/ 2 я использовал для подключения разъема клавиатуры к остальному оборудованию! Дело в том, что вы не очень хорошо знаете свое утилизированное оборудование, а также некоторые сюрпризы, запрятанные в самих кабелях.

    Спасибо за все обсуждения и предложения, хотя в конечном счете сходство с поведением диодов заметил человек, не являющийся членом сообщества, и заставил меня заподозрить, что на самом деле присутствует что-то неожиданное в пределах это кабельное соединение.

    У меня был старый кабель от CueCat. Здесь есть кое-какая интересная информация о демонтаже, хотя это не совсем то, что я пытался сделать (у меня больше нет даже «Кота»… во время его использования. 🙂

    Думая неправильно , что эти разъемы были подключены параллельно, я старательно протестировал оголенную проводку, которая когда-то подключалась к ‘Cat, против male штекер (это было удобно… если бы у меня были ЛЮБЫЕ подозрения, я бы проверил правильный разъем, и ничего бы этого не произошло. Предположения…)

    Я учел правильную нумерацию контактов и все правильно подключил исходя из этого … за исключением того, что ни DATA, ни CLK на самом деле не подключаются к гнездовому разъему (я просто подумал, что два дополнительных провода не использовались, поскольку они ни к чему не подключались). Так что Vcc и Gnd везде были в порядке, но собственно DATA и CLK с клавиатуры ни к чему не подключались!

    Так что по праву я не должен был получить вообще ничего полезного на выходной стороне, так как эти провода даже не были подключены (они были обрезаны коротко и немного в шахматном порядке. Однако я получил явно два нетривиальных и отчетливых ( но сильно затухающие) сигналы, которые я старательно читал и которые здесь люди тщетно пытались понять.Меня осенило, что они могут указывать на то, что диод с обратным смещением делал затухание, но я не уверен (я на самом деле бросил диод в микс после того, как он заработал, и это имело аналогичный эффект). Я думаю, что есть какая-то схема в штекерном разъеме (который имеет два пучка проводов, один от разъема PS / 2 и один со стороны CueCat). Если бы это было простые перекрестные помехи. Я ожидал, что сигналы, которые я видел, будут еще меньше, и эти сигналы будут перемешаны вместе, но они были ОЧЕНЬ отчетливыми (если бы они просто были мертвы, я бы в конце концов понял, что мне нужно проверить розетку и нашел свою ошибку, но видимое наличие защитных диодов в эта промежуточная заглушка все сбросила. Я опубликую продолжение, если мне удастся прибить эту деталь — я могу даже разрезать разъем, чтобы сделать это.

    Редактировать: я просто разрезал его. .. Vcc и Gnd действительно были связаны со всеми тремя целями, как и ожидалось, в то время как DATA и CLK были проведены по разным линиям от разъемов «мама» и «папа» к конечной точке. Однако НИКАКИХ активных или пассивных компонентов не присутствовало , что опровергает эту теорию! Должно быть, было достаточно перекрестных разговоров. Учитывая то, как они были втиснуты в разъем, возможно, они были достаточно близко к соответствующим проводам, чтобы пропускать только свои сигналы, хотя странно, что у меня ослаблялись отдельные сигналы синхронизации и данных, несмотря на то, что их провода прерывались при неиспользованном пинге и их провода даже не были проложены к клавиатуре (эта часть шнура даже не есть эти два провода, которые я читал!) Странно…

    Я разместил это, думая, что это очень простой кабель… очевидно, что это не так, и я использовал неправильные линии, но это хороший пример того, что может произойти когда есть активные компоненты, спрятанные в внешне безобидном разъеме или кабеле (если кто-то помнит последовательные кабели APC, в них были скрытые сюрпризы в виде специальных резисторов, чтобы вы не использовали любой старый последовательный кабель для связи с вашим ИБП. .. и старые кабели для iPod тоже делали это.Proprietary Cabling 101! Надеюсь, это поможет другим, которые устраняют странные проблемы с, по-видимому, нормальным кабелем.

    tl;dr — всегда помните о возможности скрытых компонентов при использовании восстановленных разъемов (особенно если вы получаете странные, но странно повторяющиеся и хорошо изолированные сигналы) и проверяйте контакты, которые вы на самом деле будете использовать, а не только те, которые, по вашему мнению, подключены!

    Вот что я получил в итоге. Это было одинаково, была ли клавиатура подключена к микроконтроллеру, с подтягивающими резисторами или без них, или вообще без чего-либо (просто прямо в прицел). Это должен быть хороший прямой сигнал 5V pp … Я ошибался, говоря, что эти выходы с открытым коллектором имеют какое-либо влияние на силу или форму сигнала. Они были просто отвлекающим маневром благодаря тому, что находится в этом разветвителе…

    микроконтроллер — Как заставить загореться светодиоды на клавиатуре PS/2?

    Задавать вопрос

    спросил

    Изменено 10 лет, 4 месяца назад

    Просмотрено 1к раз

    \$\начало группы\$

    Я делаю простую консольную вещь для mbed с клавиатурой PS/2 и монитором VGA. У меня работает библиотека PS/2, и я могу получать скан-коды и тому подобное. Я хочу выйти за рамки того, что это позволяет, а также позволить светодиодам, таким как блокировка заглавных букв на клавиатуре, загораться по мере необходимости.

    Я знаю, как это сделать с точки зрения абстрактного типа сообщения, и делал это раньше на компьютерах с архитектурой x86. Однако я не понимаю, как это сделать электрически и помнить о тактовом сигнале и тому подобном. Каждая ссылка, которую я нашел для клавиатур PS/2, просто сводится к ассемблерному коду x86, который не обрабатывает то, как на самом деле работает контроллер клавиатуры ПК на электронном уровне. Я имею в виду, как я узнаю, когда клавиатура простаивает, и я могу отправить команду? Клавиатура устанавливает тактовую частоту или я для отправки команд? Есть только линия данных и часы, поэтому я не понимаю, как отправить данные обратно на клавиатуру.

    • микроконтроллер
    • протокол
    • клавиатура

    \$\конечная группа\$

    \$\начало группы\$

    Много информации в сети? Что ты гуглил?

    http://www.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *