Re: Адаптер клавиатуры с интерфейсом PS/2
А под 328 может кто-нибудь скомпилировать? Пытался сегодня Microchip Studio поставить, но при инсталляции ошибка вылетает, пока не разобрался. Или может какой еще компилятор попроще посоветуете?
Персональный компьютер "Агат" - технические беседы (является частью agatcomp.su / agatcomp.ru) Как зарегистрироваться?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
ПЭВМ "Агат" 7-9: Форум → Клавиатура, пульты, магнитофонный вход → Адаптер клавиатуры с интерфейсом PS/2
А под 328 может кто-нибудь скомпилировать? Пытался сегодня Microchip Studio поставить, но при инсталляции ошибка вылетает, пока не разобрался. Или может какой еще компилятор попроще посоветуете?
А под 328 может кто-нибудь скомпилировать?
ATmega8 имеет ощутимые отличия от ATmega328. Т.е. для того, чтобы пересобрать проект под ATmega328, потребуется изучить разницу между этими контроллерами, внести изменения в программу и только тогда пересобрать.
ATmega8 имеет ощутимые отличия от ATmega328.
У меня есть несколько 8, только они AU. Плату делать неохота, как и тащиться в магазин за PU, поэтому была идея, поставить в arduino pro mini 8 вместо 328, а потом подумал, что может проще перекомпилировать. Да и вообще было бы удобнее, готовая плата, мелкая, в клавиатуру влезет. Но если отличия ощутимые, пошел за феном.
А для чего нужен транзистор?
Транзистор замыкает линию сброса на землю, т.е. создаёт логический ноль. Необязательно ставить именно такой, можно использовать любой подходящий биполярный или полевой. Например, можно использовать "цифровой" биполярник PDTC114, насколько я помню, его можно просто установить вместо того, что по схеме, не меняя распиновки. Можно использовать хоть КТ315, только в цепь базы нужно добавить резистор для ограничения тока.
Сейчас подумал, что вопрос неоднозначный и его можно трактовать по-другому. Например, зачем вообще транзистор, если можно прицепить сброс напрямую на контроллер. Можно, конечно, но так как я не мог заранее предсказать, какой будет коммутироваться ток по этой линии, не хотелось перегружать контроллер. К примеру, по цепи сброса часто ставят конденсатор довольно большой ёмкости (до 100,0мкФ) и при разряде такого конденсатора протекает весьма ощутимый ток. Уже не помню точно свои рассуждения, но при разработке схем предпочитаю не жадничать, когда речь идёт о надёжности...
ЛА8, которая стоит в клавиатуре дает 2*16=32 мА, выход микроконтроллера дает 40 мА, считаю надежность обеспеченной.
Дело хозяйское. Только про инверсию не нужно забывать.
Кстати, 40мА - это на один вывод или суммарно на все?
В даташите не нашел, в интернете пишут 40 мА на выход для 5В и 50 мА для 3.3В.
Агат с процессорной платой на ресет берет 4мА, по схеме еще в контроллерах дисководов по 1 входу подключены к ресету. Есть вероятность, что какая-нибудь плата расширения будет весьма вольно обращаться с этим сигналом, но она невелика.
Про линию сброса: я как-то пытался поймать осциллографом момент пуска процессора, для чего один вход вешал на линию сброса, а вторым смотрел шину данных. И оказалось, что с такой цепью сброса это гиблое дело: конденсатор плавно заряжается, плюс еще шум от питания добавляется, поэтому поймать момент пуска процессора нереально.
Было бы лучше этот кондер оттуда убрать.
Этот конденсатор был установлен в самом начале, на этапе отладки, потом он стал не нужен. В сообщении 105 я писал не о нём.
Кондёр на сброс ставят тогда, когда в даташите на проц указывают, что есть триггер Шмитта на входе.
А у агата РЕСЕТ - это линия, тянущаяся через весь комп и ТШ где-то есть, где-то нету. И, кстати, в клавиатуре там не просто ла8, а 531ла8, что как бы намекает, что не всё так просто. Хотя до этой ла8 как раз именно конденсатор и стоит.
А транзистор воткнуть для чёткого фронта наверняка (заодно и мегу сбережет, если что) - вопрос ни о чём, этих n-p-n -транзисторов вагон на любой дохлой материнке. Ищите, например, маркировку 1AM или t04. Не знаю что это за марки, но втыкаются куда угодно, где нужен "какой нибудь n-p-n".
И, кстати, в клавиатуре там не просто ла8, а 531ла8, что как бы намекает, что не всё так просто. Хотя до этой ла8 как раз именно конденсатор и стоит.
Живой клавиатуры у меня нет, на схеме написано 155. Конденсатор там в RS-цепочке стоит, время задает, второй раз его задавать смысла уже нет. У АГАТа ресет ничем не отличается от любой другой информационной шины, а емкость на ней считается злом. По идее схема сброса должна была стоять около процессора, а процессор формировать сигнал сброса для периферии. Тут это перенесли в клавиатуру, чтобы не плодить кнопок на корпусе, ну почему бы и нет. Подобрать и впаять транзистор мне не сложно, сложнее понять зачем.
> Подобрать и впаять транзистор мне не сложно, сложнее понять зачем.
Ну Алекс уже объяснил зачем он его ставил, но я бы тоже этот транзистор оставил, потому что сигнал разбегается на разные слоты, мы имеем дело с разными конфигурациями, в т.ч. разной степени дохлости. Я помню как то был у меня на виду контроллер дисковода-140ки, который формировал общий сброс в момент включения мотора :) ХЗ что там было, но такой вот глюк. Ну и просто случайно зацепиться какой нибудь измерительной техникой за ресет и коротнуть куда нибудь - вполне возможно (а на сисплате не только +5, там и +12 найдётся). Так что я этот транзистор рассматриваю как некий барьер для меги от неприятных сюрпризов. Остальные линии у неё сразу идут в ТТЛ-входы, и случайно их зацепить уже заметно сложнее, так что по ним защита менее важна.
Кстати, в Apple ][ на платах ревизии 0 цепи, генерирующей сброс при включении, вообще не было. Поэтому, когда создавался контроллер дисковода, видимо, чтобы обеспечить совместимость с самыми ранними платами, туда был добавлен свой собственный формирователь сигнала сброса.
И похоже, что при разработке Агата этот формирователь пытались сохранить: у Мымрина на схеме контроллера НГМД есть одновибратор D3.1, выход которого никуда не идет и загадочный провод 31, который нигде не начинается и идет на элементы D13.4, D17.3. Выход последнего подключен к линии сброса. Возможно, это схема какого-то совсем раннего варианта контроллера, который мог генерировать сброс сам.
загадочный провод 31
А у первого одновибратора не только выход, вообще ничего не подключено, но зачем он на схеме остается загадкой.
Да, я его перепутал с проводом 41. Но, кстати, было бы логичнее, если бы R1 подключался к проводу 41. Тогда было бы понятно, что на входе A8 ПЗУ D1.
А уж подключение 12 ноги D13.4 к питанию напрямую, а 13 ноги тоже к питанию, но через резистор логичным совсем не выглядит. Нет смысла тратить два логических элемента, чтобы всегда подавать "1" на линию сброса.
Вот если бы провод 31 начинался от выхода D3.1, то как раз получился бы формирователь сигнала сброса, который был в контроллере Apple Disk ][.
у Мымрина на схеме контроллера НГМД есть одновибратор D3.1, выход которого никуда не идет
тут похоже нарисовано, откуда эти ноги (выводы) растут.
http://agatcomp.ru/Reading/fl140k/FD140/SHUG_105.jpg
И у Мымрина:
тут похоже нарисовано, откуда эти ноги (выводы) растут.
http://agatcomp.ru/Reading/fl140k/FD140/SHUG_105.jpg
Да, точно, D3.1 к сбросу не относился. А сброс делался просто при зарядке кондера C2 :)
Ни РЕГ ни УПР сами по себе в системник не передаются. Они влияют только на поведение самой клавиатуры.
Т.е. они меняют отдельные биты в кодах, выдаваемых при нажатии других клавиш. Кроме того УПР разрешает кнопку СБР.
Можно чуть подробнее - что там именно меняется?
Делал переходник и программатор на ардуинах. На форуме где-то есть, в моей теме по ремонту. Там исходники, по ним легко понять логику работы клавиатуры.
Почитал, глянул исходники, но ассемблер я не умею... так и не изучил... поэтому разобрать довольно сложно. Посему - по мере возникновения вопросов буду их задавать, надеюсь, не затруднит немного вспомнить, как оно сделано, и подсказать.
Что же до Атмеги - я и хотел собрать ваш переходник, однако же мега8 стоит каких-то совершенно конских денег (400+ рублей), а СТМок некоторое количество имеется в запасе.
По ходу чтения этой темы пара вопросов назрела:
Мне по описанию клавиатуры показалось, что это она выдает тактовый сигнал на сдвиговый регистр, а по сообщениям - у вас SPI в режиме SLAVE, то есть источником тактовых импульсов все-таки является Агат?
Нашел тут же ровно ту же проблему со светодиодами, что и у меня (0xFC) - PS/2 клаве как ответить, что байт 0xFA приняли? Бит ACK передать там вроде негде - тактирования не хватает. Передать байт подтверждения сначала, а потом состояние диодов?
Почитал, глянул исходники, но ассемблер я не умею...
Не то ..
Вот по клаве (базовая функциональность, не доделал, поскольку купил родную клавиатуру)
http://forum.agatcomp.ru//viewtopic.php?pid=4345#p4345
Это по прошивке
http://forum.agatcomp.ru//viewtopic.php?pid=4253#p4253
> Можно чуть подробнее - что там именно меняется?
Я на всяк случай (тут уже был прецендент) уточню: вы насколько глубоко и по какой литературе изучали порт клавиатуры агата ?
Он описан в документации на комп и в Мымрине (книжка такая красненькая по Агату), всё это есть на сайте.
Схемы клавиатуры (родной) есть в Мымрине, а может и на сайте тоже.
Если совсем ни сколько, то на пальцах: системник присылает клавиатуре тактовую частоту, клавиатура прислыает байт (т.е. строго 8 бит, старший всегда высокий) на каждое нажатие буквенно-цифровой кнопки (в нынешнее время это называют "SPI"). Был там даже сигнал !CS (от системника к клавиатуре), но про него все дружно забыли (включая агатовских разработчиков).
Так как тактирование идёт постоянно, то системник именно по факту пришедшего старшего бита считает последующие 7 бит ожидаемым байтом. Т.е. если от клавиатуры идут нули (т.е. выход просто висит в низком уровне) то системник считает, что ничего не поступает. Старший бит поступает первым. Клок классический: стробом считается raise. Но я могу ошибаться :)
Если при нажатии буквенно-цифровой кнопки был нажат УПР или РЕГ, то для некоторых (не всех!) кнопок будут меняться некоторые старшие биты. Закон замены не сложный, но ниже объясню, почему вам он не важен. РУС-ЛАТ передаётся по отдельному проводу и выглядит чрезвычайно просто: если LAT - высокий уровень, если РУС - низкий. Сам РУС/ЛАТ переключается как угодно; в реальной агатовской клавиатуре - сочетанием кнопок РЕГ + ЛАТ и РЕГ + РУС. Но на PS/2 можете повесить его на какую хотите комбинацию.
Чисто жестово (для тех, кто вслепую умеет фигачить на агатовской клавиатуре) ближе всего будет так: РЕГ == Shift, РУС == LCtrl, LAT == RCtrl.
УПР-СБР - сигнал выдаётся как низкий при нажатии этих обоих кнопок. И не выдаётся если одну из них или обе отпустить. Но также он выдаётся одновибиратором при включении питания компа. Выдаёт его мощный элемент с ОК, вроде бы 155ла8. Т.е. никаких таких конденсаторов на этой линии быть не должно, нужен нормальный прямоугольник c неплохим током нуля.
Поскольку для правильного повторения агатовской клавиатуры нужна именно агатовская клавиатура (с соответствующей гравировкой кнопок), то ps/2, хотя бы даже с русскими буквами, есть частичная эмуляция.
Знаю, что не все это понимают (иногда даже те, кто вроде бы знает устройство Агата), поэтому объясняю на примере: если вы на Агате нажали кнопку с гравировкой "J/Й" и у вас включен режим РУС, то на дисплее появится буква "Й". А если включен режим LAT, то появится буква "J", но при этом клавиатура передаст один и тот же код, потому что была нажата одна и та же клавиша ! И только драйвер клавиатуры сопоставит включенный "РУС" с полученным сканкодом и сформирует сооветствующий код для последующих процедур. Причем разные драйвера в разных ОС будут делать это по разному (а в некоторых игрушках переключатель РУС/ЛАТ не будет учитываться совсем (весьма часто) или будет учитываться вообще безотносительно нажатия других кнопок (редко, но такое тоже бывает)).
Теперь вопрос: какая кнопка на PS/2 клавиатуре будет соответствовать этой самой агатовской клавише "J/Й" ?
Поскольку этот вопрос не имеет хорошего однозначного ответа, то уже давно существует таблица соответствий сканкодов ps/2-клавиатуры и сканкодов Агата в зависимости от нажатых на PS/2 всем знакомых Shift, Ctrl и режима QWERTY/JCUKEN, который как-то пытается решить описанную проблему. Таблица использовалась как в эмуляторах так и в PS/2-адаптере, который построен на основе атмеги. Можете её же использовать для stm-версии. С использованием этой таблицы можете забыть об особенностях работы агатовских РЕГ и УПР, теперь вам нужно будет учитывать нажатия Shift и Ctrl и, в завимости от их комбинации, брать нужную колонку в таблице.
Она находится в архиве исходников ps/2 -адаптера, файл ps2agatKBD-8-tables.inc, внутри него таблица table_p2a, перед таблицей развёрнутый комментарий о её содержимом.
Поясню только, что ".dw" == "define word" == (u_int16_t) - тут в младшем байте сканкод ps/2, а в старшем - второй байт, если сканкод двухбайтовый. Ну а ".db" == "define byte" == (u_int8_t) - т.е. обычный байт, который улетает на системник агата. Шесть байт через запятую - версии кода в зависимости от .... ну я уже писал выше.
вы насколько глубоко и по какой литературе изучали порт клавиатуры агата ?
На самом деле, достаточно поверхностно. Мымрина не читал. Схему родной клавиатуры смотрел.
системник присылает клавиатуре тактовую частоту, клавиатура прислыает байт (т.е. строго 8 бит, старший всегда высокий) на каждое нажатие буквенно-цифровой кнопки (в нынешнее время это называют "SPI").
Это из руководства было понятно, но не нашел там упоминания, что системник посылает тактовую частоту.
Из описания, показалось, что клава "SPI-MASTER". Разберемся)
если LAT - высокий уровень, если РУС - низкий.
Очень полезно - ибо пришлось бы методом тыка определить.
УПР-СБР - сигнал выдаётся как низкий при нажатии этих обоих кнопок. И не выдаётся если одну из них или обе отпустить. Но также он выдаётся одновибиратором при включении питания компа. Выдаёт его мощный элемент с ОК, вроде бы 155ла8. Т.е. никаких таких конденсаторов на этой линии быть не должно, нужен нормальный прямоугольник c неплохим током нуля.
Из схемы клавы комбинация очевидна. На контроллере адаптера - выход с открытым коллектором, который по даташиту достаточно высокотоковый, да еще и не имеет внутри подтяжки.
С конденсатором хотелось чисто запустить, хотя бы картинку видеть. Из-за этого может некорректно работать видео?
Использовать кнопку возможно? Нажимать для сброса после подачи питания.
Знаю, что не все это понимают (иногда даже те, кто вроде бы знает устройство Агата), поэтому объясняю на примере
Передаются скан-коды, как и вообще в большинстве клавиатур - это понятно. Но вы сказали, что некоторые биты при нажатии "управляющих" клавиш все-таки меняются.
давно существует таблица соответствий сканкодов ps/2-клавиатуры и сканкодов Агата
Очень радует. Но видимо пока отложится, до корректного запуска.
> С конденсатором хотелось чисто запустить, хотя бы картинку видеть. Из-за этого может некорректно работать видео?
Вряд ли, в ДК ресет вроде бы не заходит.
Он идёт на проц, на таймер и на слоты. Вроде так.
С кнопкой, обычно, нормально работает.
С кондёром не пробовал.
> Передаются скан-коды, как и вообще в большинстве клавиатур - это понятно. Но вы сказали, что некоторые биты при нажатии "управляющих" клавиш все-таки меняются.
Меняются от УПР и РЕГ. Но не меняются от РУС/ЛАТ.
Я не помню точно, как именно, но вроде бы правила такие:
- Кнопки со сканами [$80..$AF] - не зависят от УПР и РЕГ (стрелки, РЕД, ВВОД, пробел и функциональные);
- Сканы [$B0..$BF] - зависят от РЕГ (сбрасывается D3 - становятся [$A0..$AF], это пунктуация и цифры);
- Сканы [$C0..$DF] - if УПР (если нажат - сбрасывается D6 - становятся [$80..$9F]), elif РЕГ (если нажат, устанавливается D5 - становятся [$E0..$FF]). Это буквы и приравненные к ним символы (@ [\]^_).
Из последнего правила, в частности, следует любопытное: УПР-@ получает сканкод $80. При отбрасывании старшего бита, который всегда высокий, получается число 0, что несколько непривычно для нынешних систем, где символ вроде бы не может иметь кода 0 (обозначающего, обычно, конец строки или отсутствие символа).
Но это всё хорошо для агатовской гравировки кнопок. Потому что из этого, например, следует, что РЕГ-0 == Пробел, что для PS/2-клавиатуры будет весьма внезапно (на ней Shift-0 == ")"). Из-за этого и возникла ранее упомянутая таблица.
На Агате не было понятия "сканкод", потому что на ранних компах был урезанный знакогенератор (старший бит не имел значения) и код от клавиатуры соответствовал знакогенератору. Т.е. что на кнопке нарисовано, то и выводилось на экран. РЕГ переключал алфавит (РЕГ отпущен - латиница, РЕГ нажат - русский).
Но потом появились версии Агата с расширенным (или полным) знакогенератором, со строчными буквами и в поздних ОС, для совместимости, начались интересные подходы. Например, при РУС/ЛАТ в режиме LAT, без РЕГ, вводятся заглавные латинские, а в режиме РУС - строчные русские. Это всё зависит от драйвера клавиатуры и слово "сканкод" уже становится полезным.
На "Авито" появилось объявление о продаже плат для адаптера PS/2. Так как продавец не посчитал нужным не только согласовать это с авторами (со мной, как с автором разработки и базовой прошивки и с Володей, как с автором "боевой" прошивки), но и даже просто поставить в известность о таком "бизнесе", произошла небольшая, слегка неприятная, история.
Вот ссылка на "Барахолку" zx-pk.com, где я её рассказал: https://zx-pk.com/forum/viewtopic.php?p=215708#p215708
Забавно, конечно. Не представляю себе этого странного человека, который такое купит. Эту схему можно собрать даже навесом без платы - если на попробовать. А если хочешь пользоваться долго и самому, то заказать её или изготовить, даже просто лаком или на макетке или крючком из ножовочного полотна (если травить не хочется) - дело примерно на пару часов. Даже на одном слое, без сверления отверстий получится. Все варианты будут не хуже серийной (эстетика будет зависить от аккуратности, но надёжность в любом случае будет высока). Мне бы лень было даже ждать посылку, невзирая на цену. Да и не пришло бы в голову искать на авито такую экзотическую мелочёвку.
Если же для этого мистера X ни один из способов не доступен в силу отсутствия навыков, то что он с Агатом-то будет делать ? Разве что он его купил в упаковке с пятилетней гарантией...
ПЭВМ "Агат" 7-9: Форум → Клавиатура, пульты, магнитофонный вход → Адаптер клавиатуры с интерфейсом PS/2
Форум работает на PunBB, при поддержке Informer Technologies, Inc