Компьютерная мышь PS/2 в радиолюбительских конструкциях А.В.Пахомов
Статья опубликована в журнале
"Радио" №4, 2009.В статье описывается интерфейс
PS/2, система команд интерфейса для управления компьютерной мышью.
Приводится фрагмент принципиальной схемы на микроконтроллере MCS-51,
где показано подключение мыши PS/2. В качестве примера практического
использования компьютерной мыши с интерфейсом PS/2 в радиолюбительской
конструкции приводится описание доработки простой MIDI-клавиатуры
с регулятором громкости (скорости нажатия клавиши) и регулятором
положения колеса выполненными в виде "мышки". Также в статье приводятся
коды и текст программы на ассемблере MCS-51 модернизированной MIDI-клавиатуры.
В статье дается вся необходимая информация для разработки устройств
с применением компьютерной мыши. Содержатся сведения для решения
обратной задачи - подключения радиолюбительских устройств к компьютеру
через интерфейс PS/2.
Введение
Часто в радиолюбительской практике возникает необходимость
использования какого-либо регулятора. В аналоговой технике, как
правило, применяют переменный резистор. В цифровой технике так же,
обычно используют тот же резистор с каким-либо преобразователем
во временной интервал. Более интересным является использование контактных
пар, периодически замыкаемых при вращении, или перемещении ручки
управления. Нередко в качестве такого устройства применяют открытые
оптопары компьютерных мышей. В таком случае мышь разбирают и используют
только требуемый механизм (светодиод, вращающийся диск с прорезями
и фотоэлементы), к выходам фототранзисторов которого подключают
D-триггер и имеют два сигнала: направление и тактовый. Когда у автора
в процессе модернизации простой MIDI-клавиатуры
возникла потребность в непрерывном регуляторе, взгляд сразу упал
на мышь. Первая мысль: разобрать, приделать к колесу ручку управления,
выходы фототранзисторов подключить к микроконтроллеру клавиатуры
и - вперед. Но тут же появилась вторая: жалко ломать изящное, удобное
устройство, верой и правдой служащее миллионам людей, не лучше ли
использовать всю мышь целиком, подключив ее через стандартный разъем
к контроллеру MIDI-клавиатуры. Более того: мы получаем сразу два,
а, при наличии колеса прокрутки, три регулятора в одном удобном
корпусе. Изучение вопроса подключения мыши с интерфейсом PS/2 (в
первую очередь из интернет-источников) показало интересную вещь:
полное отсутствие каких-то связных описаний "мышиного" PS/2. В русскоязычном
Интернете нашел только две более-менее осмысленных статьи [1,2].
Но статьи написаны так, что больше скрывают и, даже, искажают информацию,
причем все авторы с юмором отмечают некую "секретность" интерфейса.
В англоязычной части наткнулся на отличное описание интерфейса PS/2
в [3]
и отличную статью [4]
по системе команд управления мышью PS/2. Ниже представлены результаты
опытов автора по подключению мыши к микроконтроллеру (эксперименты
проводились с МК AT89C51 и мышью Genius NetScroll).
Интерфейс PS/2. Сигналы. Разъем. Подключение.
Интерфейс PS/2 существует несколько десятилетий
и до сих пор широко применяется в персональных компьютерах для подключения
клавиатуры и мыши. Это синхронный последовательный двунаправленный
интерфейс. Наиболее популярный разъем для интерфейса PS/2 - шести
контактный mini-DIN. Кроме линий данных (DATA) и синхронизации (CLOCK)
на контакты разъема (рис.1 - файл RIS1.BMP)
выведены общий провод (GND) и питание (+5В).Выходы
сигнальных линий имеют открытый коллектор, и в пассивном состоянии
имеют уровень логической единицы. Для нормальной работы интерфейса
сигнальные линии должны быть подтянуты к шине питания резисторами
10 ком. При описании протокола обмена данными удобно пользоваться
терминами хост (host) для контроллера (персонального компьютера)
и устройство (device) для мыши. Каждый байт, передаваемый по шине
включает: стартовый бит (логический ноль), восемь бит данных (начиная
с младшего), бит контроля четности и стоп бит (логическая единица).
Бит контроля четности в сумме с количеством единиц в байте должны
составлять нечетное число. Каждый бит данных (на линии DATA) тактируется
импульсом на линии CLOCK. Считывание данных приемником производится
после перевода CLOCK из единицы в ноль для приемника-хоста и после
перевода CLOCK из нуля в единицу для приемника-устройства. Соответственно
передатчик-устройство должен установить данные до перевода CLOCK
из нуля в единицу, а передатчик-хост - до перевода CLOCK из единицы
в ноль. При работе с мышью PS/2 генератором тактовых импульсов на
линии CLOCK всегда выступает устройство (мышь), независимо от того,
кто в данный момент передает (принимает) данные.
Интерфейс PS/2. Протокол обмена Устройство-Хост
и Хост-Устройство.
Сигналы в линиях интерфейса PS/2 при передаче данных
из устройства на хост изображены на рис.2
(файл RIS2.BMP) . Устройство может начать передавать байт хосту
только когда шина свободна (DATA и CLOCK в состоянии единицы). Если
шина занята (CLOCK в нуле), устройство гарантированно не начнет
передачу (переведет CLOCK в ноль) в течение не менее 50 мкс после
освобождения шины. Устройство выдает 11 импульсов CLOCK - по одному
для каждого бита DATA (старт, 8 бит данных, контроль, стоп), хост
фиксирует данные на каждый перепад CLOCK из единицы в ноль. Устройство
изменяет данные на DATA пока CLOCK находится в состоянии единицы.
Хост может затребовать прекращения передачи данных устройством путем
удержания CLOCK в состоянии нуля не менее чем на 100 мкс, в этом
случае устройство прекращает передачу. Хост также может удерживать
CLOCK в состоянии нуля после прихода 11-ого импульса, чтобы предотвратить
передачу следующего байта данных устройством. Временные параметры
к рис.2(файл RIS2.BMP): длительность
нуля (t1) и единицы (t2) тактового сигнала CLOCK может составлять
от 30 до 50 мкс (используемая автором мышь выдавала длительности
по 40 мкс). Гарантируется стабильность данных DATA в течение не
менее 5 мкс до перевода CLOCK из единицы в ноль (t3) и не менее
5 мкс после перевода CLOCK из нуля в единицу (t4). Более подробно
протокол обмена устройство - хост можно посмотреть в [3] или, не
так подробно, в [1]. Сигналы в линиях интерфейса PS/2 при передаче
данных из хоста в устройство изображены на рис.3(файл
RIS3.BMP). Чтобы начать передачу данных в устройство (вспомним,
что синхроимпульсы всегда формирует устройство), хост переводит
линию CLOCK в ноль и удерживает ее в этом состоянии не менее чем
100 мкс. Затем хост переводит DATA в ноль и снимает удержание CLOCK,
формируя, тем самым, состояние "host request-to-send" (вольный перевод
по смыслу: "требую приема"). Обнаружив это состояние шины, устройство
формирует 11 импульсов для приема данных из хоста. Хост производит
смену состояния DATA, пока CLOCK находится в нуле. Устройство должно
принять данные, пока CLOCK находится в состоянии единицы. Хост может
прекратить передачу в любой момент до 11-ого импульса, переведя
линию CLOCK в ноль и удерживая ее не менее чем 100 мкс. После 10-ого
импульса, устройство проверяет уровень стоп-бита (логическая единица).
Если все нормально, устройство переводит DATA в ноль ("line control
bit") и формирует 11-ый импульс. После этого хост может перевести
CLOCK в ноль для предотвращения передачи новых данных. Если устройство
обнаружило ноль на DATA во время приема стоп-бита, то фиксируется
факт ошибки и устройство продолжает формировать импульсы CLOCK до
обнаружения DATA равного единице. Временные параметры к рис.3(файл
RIS3.BMP): длительность нуля (t6) и единицы (t7) тактового сигнала
CLOCK может составлять от 30 до 50 мкс (используемая автором мышь
выдавала длительности по 40 мкс). Хост должен гарантировать истинность
данных DATA не менее чем за 1 мкс до перевода CLOCK из нуля в единицу
(t8) и может менять данные сразу (не менее 0 мкс) после перевода
CLOCK из единицы в ноль (t9). Устройство должно выставить бит "line
control" не менее чем за 5 мкс до перевода CLOCK из единицы в ноль
(t10) и снять его не более чем через 5 мкс после перевода CLOCK
из нуля в единицу (t11). Более подробно протокол обмена хост - устройство
можно посмотреть в [3].
Интерфейс PS/2. Команды управления мышью.
Перечень команд, посылаемых с хоста устройству,
приведен в таблице 1 (лист из файла
- Таблицы к PS2.xls). После подачи питания на устройство (или
получения команды "Reset"), устройство проводит самодиагностику
(BAT (Basic Assurance Test)) и устанавливает следующий режим своей
работы: дискретизация - 100 отсчетов в секунду, разрешение - 4 отсчета
на мм, масштабирование 1:1 и переходит в режим запрета передачи
данных (ждет команд от хоста). В случае успешного окончания BAT
устройство посылает код 0AAh ("BAT successful"), в случае ошибки
- код 0FCh ("Error"). Вслед за кодом результата BAT, устройство
посылает свой ID (для мыши 0), по ID распознается мышь, клавиатура
или другое расширение (например, 3 - Intellimouse). Практика показывает,
что необходимое время на получение ответа о результатах BAT составляет
до 500 мс. Наиболее "популярные" команды управления мышью требуют
некоторого пояснения, дадим комментарии к некоторым командам.
Enable Data Reporting (или просто Enable) (0F4h)
- необходима для перевода мыши в потоковый (Stream mode) режим (основной
режим работы мыши с компьютером) после подачи питания или "сброса"
мыши. После подачи команды мышь выдает данные в указанном ниже формате
при возникновении любого события (смещение мыши, нажатие или отпускание
клавиши и т.д. - далее событие). Максимальная частота передачи пакетов
данных определяется командой Set Sample Rate.
Set Sample Rate (0F3h) - удобная команда
для настройки работы мыши. Например, если нам требуется быстрая
реакция на событие, то имеет смысл увеличить частоту дискретизации,
тем самым мышь быстрее прореагирует на свершившееся. Вместе с тем
путь мыши за период дискретизации будет меньшим и гарантированно
не произойдет переполнение координатных счетчиков. (Пример: 100
отсчетов в секунду, 4 отсчета на мм, 1:1: при перемещении мыши на
10 см счетчик сделает 10 * 10 * 4 = 400 отсчетов, т.е переполнение
произойдет на 255 отсчете (около 7 см), если такое перемещение уложится
в один период дискретизации (10 мс). Отсюда: в данном режиме максимальная
скорость "махания" мышью 7см / 10мс = 7 м/с). Но, с другой стороны,
при высокой частоте дискретизации возрастает нагрузка на контроллер
хоста, т.к. ему чаще придется "отвлекаться" на обработку "мышиных"
данных. Microsoft "придумала" использовать данную команду для переключения
мыши в режим работы с колесом прокрутки и дополнительными кнопками
(Microsoft Intellimouse extension).
Set Resolution (0E8h) - так же очень удобная
команда для настройки работы мыши. В паре с предыдущей командой
позволяет управлять скоростью работы с мышью и регулировать нагрузку
на контроллер хоста. При меньшем значении разрешения требуется более
длинный путь мыши для достижения требуемого значения счетчика.
Set Scaling 2:1 (0E7h) - вместе с двумя
предыдущими командами позволяет оптимально отрегулировать поведение
мыши как регулятора. В данном режиме мышь меняет свою реакцию на
перемещение. При малом перемещении (до 3 отсчетов, т.е. 3 мм при
разрешении 1 отсчет на мм), мышь передает хосту даже меньшее значение,
чем в обычном режиме. Но при больших смещениях передаваемое значение
счетчика наоборот удваивается по сравнению с реальным значением
отсчетов. Т.е. перемещение идет как бы с ускорением. Реально мышь
трансформирует отсчеты следующим образом: 0 - 0, 1 - 1, 2 - 1, 3
- 3, 4 - 6, 5 - 9, далее идет удвоение отсчетов [4]. Необходимо
отметить, что если мышь находится в потоковом (Stream mode) режиме,
то до подачи любой команды, хост должен запретить вывод данных (0F5h
- Disable Data Reporting). Устройство подтверждает получение каждой
команды хоста (в т.ч. и второго байта команды) байтом подтверждения
0FAh. В случае ошибки приема, устройство посылает байт 0FEh (повторить
"Resend"), либо 0FCh (ошибка "Error"), подробнее в [3,4]. Формат
принимаемого пакета данных от стандартной PS/2 мыши (3 байта) приведен
в таблице 2(лист из файла - Таблицы
к PS2.xls). Назначение байтов и битов пакета ясно из таблицы
и хорошо описано в любом из приведенных литературных источников.
При наличии у мыши колеса прокрутки, скорей всего, она поддерживает
расширение Microsoft Intellimouse. В этом случае, после включения
расширения, к 3 байтам пакета данных стандартной мыши добавляется
четвертый байт, передаваемый устройством. В нем передается значение
Z счетчика колеса прокрутки (Scroll) и состояние двух дополнительных
(четвертой и пятой) кнопок мыши (если они есть). В качестве примера
обмена командами хоста и устройства в
таблице 3 (лист из файла - Таблицы к PS2.xls) приведен протокол
начала работы (после подачи питания) описанной ниже MIDI-клавиатуры.
Пример использования мыши: регуляторы для MIDI-клавиатуры.
В качестве практического примера использования
стандартной компьютерной мыши с интерфейсом PS/2, рассмотрим вариант
реализации двух регуляторов для простой MIDI-клавиатуры, описанной
в предыдущей статье. Принципиальная схема
дополнительных цепей для подключения разъема PS/2 показана на
рис.4(файл RIS4.BMP) (полная схема
доработанной MIDI-клавиатуры тут). Для простоты, остальные цепи,
подключенные к микроконтроллеру DD1, на схеме не показаны. Протокол
взаимодействия с мышью PS/2 реализован программно. Линия CLOCK интерфейса
подключена к входу INT0 микроконтроллера. Обработка прерывания по
входу вызывается срезом входного сигнала. Быстродействия микроконтроллера
AT89C51 при частоте кварцевого резонатора 12МГц оказалось достаточно
для отработки прерываний по сигналу CLOCK с периодом следования
импульсов 80 мкс. Запаса быстродействия хватает для считывания бита
данных (DATA) при приеме информации из устройства (мыши) и формирования
данных на линии DATA при передаче из хоста. Процедура обработки
прерывания накапливает байт данных при приеме и помещает его в буфер,
для дальнейшей обработки в основном цикле программы. При передаче
данных эта процедура производит побитный вывод данных из буфера.
После включения питания программа микроконтроллера
клавиатуры производит настройку мыши: максимальная частота передачи
пакетов данных - 20 раз в секунду, разрешение - 2 отсчета на мм,
потоковый режим (протокол обмена приведен в таблице 3). При настройке
мыши, производится анализ времени поступления подтверждения и наличия
сигнала CLOCK. При превышении допустимого значения (около 5 сек),
контроллер ставит признак отсутствия мыши в системе и в дальнейшем
не обслуживает интерфейс PS/2.
В программе реализован алгоритм регулировки скорости
нажатия (громкости) музыкальных клавиш перемещением мыши по оси
Y (вверх-вниз). Настройки выбраны так что изменение громкости от
минимума до максимума вызывается перемещением мыши по вертикали
на 10-15 см. Регулировка громкости осуществляется только при нажатой
правой кнопке мыши. Для контроля текущего уровня громкости в клавиатуру
добавлен анализ кнопки S72 (пересечение линий P0.6 и P3.6). При
нажатии на нее, светодиодный индикатор отображает уровень громкости
звучания ноты.
Перемещение мыши по горизонтальной оси (X) передается
по MIDI-интерфейсу командами положения колеса (0Enh). Команды формируются
только при нажатой левой кнопке мыши, при этом движение вправо вызывает
увеличение высоты тона, влево - ее уменьшение. Нажатие средней кнопки
мыши вызывает "сброс колеса" в нейтральное положение. Оба регулятора
имеют ограничение формируемого кода по достижении крайних значений
(отсутствует переполнение счетчиков). Коды модернизированной программы
приведены в таблице 4(файл MDM221.HEX).
(Текст программы - в таблице 5 - (файл
- mdm221.asm)). Конструктивно, дополнительные элементы (два
резистора), распаяны на плате микроконтроллера.
Разъем интерфейса PS/2 для подключения мыши вместе
с шлейфом взят из комплекта шлейфов для старых материнских плат
форм-фактора АТ (рис.5) (фото P3160009.JPG
или P3160010.JPG).
Выводы.
Представленная в статье информация поможет радиолюбителям
в решении двух противоположных задач. Первая, очевидная: неплохое
(и, что не маловажно, очень дешевое) устройство - компьютерная мышь
PS/2 (это удобнее чем СОМ) найдет свое применение в различных конструкциях
в качестве регуляторов (например, регулировка громкости, тембра,
частоты и т.п.). Конечно, при реализации такого регулятора будет
необходим какой-либо индикатор состояния регулируемого параметра,
эта простая задача может быть реализована любым доступным способом.
Вторая задача, не вполне очевидная, обратная первой: мы имеем еще
один интерфейс для ввода данных в компьютер. Радиолюбитель может
реализовать эмулятор мыши, и, с помощью его, осуществлять ввод данных
в компьютер. В [2] приведено достаточно сведений для реализации
программного интерфейса, правда, в среде MS-DOS. Для примера: открываем
графический редактор, запускаем наше устройство, например анализатор
сигналов с выходом PS/2, и видим, как на экране рисуется анализируемый
сигнал… Как отмечается в [4] для реализации второй задачи наше устройство
- эмулятор мыши должно, как минимум, соблюдать следующие правила:
" Никогда не посылать данные, если CLOCK в нуле. " Через 500 мс
после подачи питания сформировать 0AAh и 0. " Ждать, когда хост
передаст команду 0F4h (Enable) и только после этого посылать свои
данные. " Эмулировать трехбайтные команды данных. " Правильно откликаться
на команду 0FFh (Reset). " Выдавать правильный ID (0) на запрос
хоста. " Корректно откликаться на запрос о статусе устройства (команда
0E9h (Status Request) подробно описана в [3,4]). " Выдавать подтверждение
(0FAh) на все поступающие команды. В статье лишь вскользь было упомянуто
о современных "мышках", имеющих одно или два колеса прокрутки и
пять кнопок. Поддержка этих органов управления реализована в расширении
Microsoft Intellimouse, описание которого, достаточное для практического
применения, приведено в [4].
Список литературы:
1. Самарин А. Интерфейсы с клавиатурой. - http://www.platan.ru/shem/pdf/st44-50.pdf
2. Гудилин А.Е. Микропроцессорные устройства систем
управления: Учебное пособие. - Челябинск: Изд. ЮУрГУ, 2005.-98 с.
- www.lib.susu.ac.ru/ftd?base=SUSU&key=000305422&dtype=F&etype=.pdf
3. Synaptics TouchPad Interfacing Guide. - www.pronau.org.ua/edu/base/ACTS_KPI/EPASY/KP/my/ACF126.pdf
4. Adam Chapweske. The PS/2 Mouse Interface. -
osdev.ru/docs/hardware/mouse/ps2interface.htm
Рисунки (имена файлов)
Рис.1. Контакты и сигналы разъема PS/2 (вид на
"хвост мыши"). (RIS1.BMP)
Рис.2. Передача данных из устройства на хост. (RIS2.BMP)
Рис.3. Передача данных из хоста в устройство. (RIS3.BMP)
Рис.4. Подключение мыши PS/2 к микроконтроллеру
MIDI-клавиатуры. (RIS4.BMP)
Рис.5. Вид на конструкцию MIDI-клавиатуры. (фото)
(P3160009.JPG или P3160010.JPG)
Дополнительно в файле KB_MIPS.BMP
приводится полная схема MIDI-клавиатуры.
Таблицы (имена файлов)
Таблица 1. Команды интерфейса мыши PS/2. (Таблицы
к PS2.xls)
Таблица 2. Формат пакета данных передаваемых стандартной
мышью PS/2. (Таблицы к PS2.xls)
Таблица 3. Протокол обмена командами: MIDI-клавиатура
- мышь PS/2. (Таблицы к PS2.xls)
Таблица 4. Коды программы MIDI-клавиатуры. (MDM221.HEX)
Таблица 5. Текст программы на ассемблере MCS-51
MIDI-клавиатуры. (mdm221.asm)
|