И задумал я куда-нибудь старичка пристроить (подарить, продать), т. к. выбрасывать жалко. Но мешала задуманному одна неприятность: у материнки не срабатывало включение от кнопки питания, и что бы я ни делал, начиная от проверки проводов и заканчивая прозвонкой транзисторов на плате, проблему найти так и не смог. Отдавать в ремонт спецам — ремонт окажется дороже всего компа.
Думал я, думал и нашёл способ запустить моего бедолагу. Выдернул батарею BIOS-а, от чего комп испугался и сразу стартанул при следующем появлении питания! А дальше — почти в каждом BIOS-е есть запуск ПК от любой кнопки клавиатуры или кнопки POWER на клавиатуре. Казалось бы, проблема решена. Ан нет, есть нюансы. С USB-клавиатур запуск не срабатывал. Плюс не хотелось пугать нового хозяина, компьютер должен стартовать от привычной кнопки питания на корпусе.
Пришлось решать проблему по-своему, а наработками спешу поделиться с вами.
Содержание статьи / Table Of Contents
↑ ХОД МЫСЛЕЙ МОИХ
У нас есть материнская плата, которая отказывается запускаться, PS/2 порт для клавиатуры, знания в области микроконтроллеров и любопытство.А что если, собрать схемку, которая с одной стороны, слушает кнопку питания на корпусе, а с другой отправляет код нажатия кнопки POWER на клавиатуре прямо в PS/2 порт? Должно сработать!
Полез я гулять по Интернету, искал статьи, описывающие протоколы работы PS/2 порта клавиатуры, и выяснил, что протокол достаточно простой и очень похож на двухпроводной протокол I2C или TWI, а команды отправляются пачками в основном в одну сторону.
Распиновка гнезда PS/2 на материнской плате
Пример посылки одного байта
Существуют два стандарта клавиатур, старая ХТ и новая АТ, какая из них у меня на компьютере, я точно не знал. Получается, клавиатура отправляет сперва стартовый бит 0, после пишет 8 битов младшим битом вперёд, далее отправляет бит чётности и стоповый бит. Всего 11 битов на пакет. Однако, клавиатура отправляет минимум 3 таких пакета. Первый, это код нажатой кнопки, затем, код отпускания кнопки 0xF0, а дальше код отпущенной кнопки.
Пример отправки пакетов при нажатии кнопки «J»
Не все кнопки содержат в себе всего 1 байт кода, есть и по 2, 6 и даже 8 байт! Например, безобидная кнопка PAUSE, шлёт пулемётную очередь из 8 байтов: 0xE1, 0×14, 0×77, 0xE1, 0xF0, 0×14, 0xF0, 0×77.
Изучив особенности протокола, я собрал быстро макетную плату с микроконтроллером посередине и дисплеем сверху, дабы попытаться принять команды от PS/2 клавиатуры и узнать что да как с протоколом по таймингам. К сожалению, я принимал только абракадабру.
Всё-таки без осциллографа не обойтись, подумал я и давай применять свой опыт из предыдущей статьи про модуль к проектору в использовании аудиокарты компьютера в качестве осциллографа. У аудиокарты стереовход, т.е. у меня есть самодельный двулучевой осциллограф до 16 кГц!
И начал я разбирать свою PS/2 клавиатуру. Следуя по дорожкам, нашёл контакты, отвечающие за кнопку POWER на платке клавиатуры. Припаял два провода к ножкам DATA и CLOCK, а другой конец проводов пустил на аудиоштекер типа «джек», который засунул в синий разъём аудиокарты этого же компьютера. Включил компьютер, поставил на запись канал линейного входа, и начал перебирать кнопки клавиатуры.
Заранее отмечу, мне нужна была последовательность команд кнопки POWER, а она в свою очередь выключает испытуемый компьютер, я откусил провод CLOCK идущий от платы клавиатуры к материнской плате и спокойно смотрел, что да как она передаёт в никуда.
Мне снова повезло: частота передачи сигнала от клавиатуры составила около 15 кГц, что является почти потолком пропускной способности аудиокарты. Это видно на рисунке ниже: края импульсов гладкие как мыло, но понять что к чему можно.
Как видно, сверху линия данных DATA, снизу линия тактов CLOCK. Проведя вертикали, можно выудить биты: 0 00000111 0 1. Тут идёт первый стартовый бит 0, после 8 битов кода кнопки, бит чётности 0 и стоповый бит 1. Т.е. клавиатура отправила код 0xE0, он же 224.
Затем следовала вторая часть кода кнопки.
Здесь уже был отправлен код 11101100, т.е. 0×37. Сложив их вместе, получаем 0xE0, 0×37. Сравнив с таблицей кодов я окончательно понял, как всё работает.
Дело за малым. Написать программку для мелкого микроконтроллера Tiny13 (smd, 8 ног), которых у меня накопилось как семечек, и всё это спаять вместе по невероятно сложной схеме!
↑ ПРОГРАММА
Не стал я особо заморачиваться над кодом, выдернул из исходников предыдущих своих проектов функцию отправки байта по I2C и немного допилил её, добавив проверку бита чётности. Вывел управление на одну кнопку, при нажатии которой, происходит отправка трёх байтов на PS/2 порт и всё это дело прошил в микроконтроллер.↑ ПРАКТИКА
Лень было мне травить такую микроплату, сделал всё в воздухе. Для максимального удобства при работе с кнопкой питания, припаял контроллер сразу к штырькам, которые отвечают за кнопку питания компьютера. Пришлось перерезать дорожку от этой ножки, чтобы логика материнской платы не мешала контроллеру.Может возникнуть вопрос, почему я не применил готовую платку от клавиатуры и начала писать программу и паять весь этот огород? Я хотел оставить гнездо PS/2 свободным для подключения клавиатуры.
Мой контроллер при нажатии на кнопку питания отправит материнской плате команду на запуск и больше никак не будет взаимодействовать с PS/2. Тогда как плата из клавиатуры отвечала бы на команды от ПК и в одном разъёме две клавиатуры, скорее всего, «поругались» бы.
↑ ФАЙЛЫ
🎁 Прошивка для заливки (hex) 543 b ⇣ 18🎁 Программа в CodeVision AVR 3.12 (исходники) 32.02 Kb ⇣ 17
🎁 Проект для опытов в Proteus v8.4 SP0 19.15 Kb ⇣ 14
🎁 «Осциллограмма» в mp3-файле (открывать в любом аудиоредакторе) 259.18 Kb ⇣ 16
↑ ЗАКЛЮЧЕНИЕ
Собрал всё в корпус и подключил переднюю кнопку на родные штырьки от фронтальной панели. Теперь мою старую компьютерную систему можно включать и выключать как положено — кнопкой на корпусе и без проблем использовать любую PS/2 клавиатуру.Ремонт удался, цель достигнута, плюс масса исследовательского материала!
Всем спасибо за внимание!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.