C64

МАУСЬ

Адаптер PS/2-мышки для Коммодора 64

English version here

В помощь знакомому пикселисту, который решил попробовать силы на тру C64, я решил сделать адаптер для подключения обычной PS/2-мышки к Коммодору. Самая распространенная мышь на Ц64 — Commodore 1351 — использует аналоговые возможности джойстикового порта для передачи данных о перемещении. Эта же мышка умеет эмулировать функциональность джойстика для программ без нативной поддержки пропорциональной мыши. PS/2-ные мышки пользуются последовательным протоколом для передачи содержимого внутренних счетчиков и состояния кнопок, который имеет мало общего с тем, что может воспринять Коммодор. [М]аусь — это сопрягающее устройство, которое преобразует цифровые сигналы от PS/2 мышки с одной стороны и изображает из себя мышку 1351 с другой.


Эта работа основана на оригинальной разработке Levente Hársfalvi, Serial mouse interface for Commodore («Интерфейс последовательной мышки для Коммодора»). Хотя элементная база и интерфейс мышки в этом проекте другие, замечательный труд Левенте меня вдохновлял и явился основой для разработки [М]ауса.

Железо

Железо состоит из микроконтроллера ATmega8, конденсаторов, нескольких резисторов и разъемов. Фактически взята схема Левенте и адаптирована к более современному микроконтроллеру и интерфейсу PS/2. Все собрано на маленькой самодельной печатной плате. Пины для программирования использовались только для начальной установки Fuse-битов и заливки бутлодера. Все последующие циклы программирования и отладка выполнялись через последовательный порт.

В схему включен дополнительный регулятор на 5В, потому что я не был уверен, что на все хватит номинальных 50мА, присуствующих на джойстиковом порту Ц64. Страх оказался неоправданным, питание на порт выведено прямо с шины +5В, так что можно взять и больше, да и мышки для PS/2 не такие прожорливые. Обращаться с выходом 5В все равно надо осторожно, потому что закоротив эту шину можно спалить что-нибудь в самом Коммодоре.

Тактируется АТмега встроенным RC-осциллятором на 8МГц. Предполагается, что изделие будет использоваться в комнатных условиях с более-менее постоянной температурой и температурный дрейф тактового генератора не будет оказывать существенного влияния на работу схемы. Чтобы избежать ошибок при программировании и отладке, для последовательного порта была выбрана скорость обмена 19200bps.

Протокол PS/2 и общение с мышкой

Протокол обмена через шину PS/2 и способы общения с мышкой лучше всего описаны в статьях Адама Чапвеске «The PS/2 Mouse/Keyboard Protocol». Для электрической поддержки протокола PS/2 требуются выходы с открытым коллектором. Подходящих выходов такого типа в АТмеге8 нет (TWI не в счет), зато можно изобразить все то же самое, динамически переключая направление выходов. Реализация протокола поддерживает двунаправленное общение с устройствами PS/2, работает через внешнее прерывание INT0 и прерывание таймера Timer0. Все операции чтения — неблокирующие из буфера, который заполняется в фоне. Операции записи ожидают завершения, блокируя основной поток. Этот же код может использоваться для общения с клавиатурой.

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

Мышь Commodore 1351

Утверждается, что мышь типа 1351 имеет аналоговый интерфейс с компьютером, но это лишь отчасти правда. Дело в том, что аналоговые входы C64 в действительности измеряют время, которое требуется для зарядки конденсатора (обычно — через потенциометр в аналоговом джойстике). Задача интерпретации полученного значения лежит на ПО компьютера и ПО, рассчитанное на работу с мышкой, интерпретирует изменение во времени от начала измерения до зарядки конденсатора как перемещение манипулятора по столу. Если определять момент начала замера, можно отсчитать нужное время и быстро зарядить конденсатор через небольшое фиксированное сопротивление.

Ниже приведена иллюстрация из патента США №4,886,941, наглядно демонстрирущая, что происходит при работе мышки 1351:

сигнал на входах POTX/POTY порта джойстика

Цикл замера занимает не менее 512мкс. В первые 256мкс SID разряжает конденсатор, замыкая вход компаратора на землю и просто выжидает время. Затем SID отпускает ключ, который замыкал конденсатор на землю и начинает отсчитывать время до превышения напряжения на конденсаторе порогового значения Vth. Это значение записывается во внутренний регистр и затем может быть использовано программой на компьютере. В случае аналогового джойстика, это время будет пропорционально углу поворота ручки. Мышка 1351 делает этот момент пропорциональным значению внутреннего счетчика перемещения. Вместо того, чтобы заряжать конденсатор через высокоомный потенциометр, что было бы непрактично для мышки, внутренняя схема выжидает нужный момент и быстро заряжает конденсатор через небольшое сопротивление. Задержка от начала замера до зарядки пропорциональна значению счетчика перемещения и составляет от 320 до 448мкс. Если мышь едет вправо, задержка на линии POTX будет плавно расти от 320 до 448мкс, затем прыгнет обратно на 320мкс и так далее. Если мышь поедет влево, задержка будет уменьшаться до 320мкс, затем прыгнет на 448мкс. Можно сказать, что время от начала замера до переключения выхода POTX/POTY в «1» составляет 320 + (значение-счетчика-X mod 128) мкс.

Устройство, которое изображает мышка 1351, можно также представить себе потенциометром без ограничителей. При повороте движка его сопротивление нарастает до тех пор, пока оно не достигнет максимума и не перескочит обратно на начало кольца и снова не станет минимальным. Лучше один раз увидеть: на видео показано, как изменяются сигналы на линиях POTX и POTY при различных перемещениях мышки.

1351 в деле
Цикл замера детектируется сигналом внешнего прерывания INT1, которое настроено на реакцию на отрицательный перепад электрически соединенного с ним сигнала POTX. Отрицательный перепад случается в начале замера, когда SID шунтирует конденсатор на землю. Чтобы INT1 сработал надо, чтобы сигналы были подтянуты кверху. Это достигается тем, что выходы POTX/POTY изначально устанавливаются в «1». Впоследствии ими управляет модуль Output Compare таймера 1.

Обработчик INT1 загружает регистры OCR1A/OCR1B значениями, вычисленными заранее при передаче драйвером PS/2 значений счетчиков перемещения. Также выходы OC1A/OC1B сбрасываются в «0», инициализируется и запускается таймер. На этом обработчик прерывания завершает работу. Установка в «1» выходов OC1A/OC1B, соответствующих сигналам POTY/POTX, выполняется модулем Output Compare автоматически. Происходит это в тот момент, когда выполняется равенство между значениями TCNT1 и регистров OCR1A/OCR1B соответственно.

После того, как обе линии POTX и POTY будут установлены в «1», таймер должен остановиться, а система должна перейти в режим ожидания следующего цикла. Но, поскольку один цикл измерения занимает 512мкс, а 16-битный таймер переполнится через 65536мкс, можно просто оставить таймер работающим непрерывно.

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

Кнопки мыши «соединены» с проводами FIRE/UP/DOWN на порту джойстика.


Режим эмуляции джойстика (мышь 1350)

Это более простой режим. Кажый раз, когда мышь сообщает о перемещении, эмулятор замыкает контакт, соответствующий наклону джойстика в нужном направлении, на период около 20мс. Кнопки мыши соединены с проводами FIRE и POTX соответственно. Замыкание имитируется переводом ножек контроллера из высокоимпедансного состояния в состояние выхода с активным нулем. В этом режиме используется прерывание от OC1A, его обработчик переводит все ножки обратно в состояние hi-Z.

Конфигурация

Адаптер имеет минимальный интерфейс, который состоит из единственной не предназначенной для нажимания кнопки. Обычно она используется для сброса и обновления программного обеспечения, но так же ее можно использовать для изменения конфигурации мышки без выключения C64. Для нестандартных параметров необходимо удерживать кнопки в течение нескольких секунд после старта или сброса. Расшифровка кнопок:

Каляка-маляка для VT220

Для отладки я написал код, который позволяет рисовать мышкой прямо в окне совместимого с VT220 терминала. Чтобы он не мешал нормальной работе, он запрещен по умолчанию, но может быть включен нажатием всех трех кнопок при старте.

Схема и исходники

Ссылки

—-—
Address of this page: http://sensi.org/~svo/[m]ouse/
Просьба указывать ссылку на первоисточник
Copyright © 2009 Viacheslav Slavinsky  svofski on gmail
Mon Nov 16 21:00:45 MSK 2009