PDA

Просмотр полной версии : Протокол PS/2



CityAceE
13.10.2023, 20:20
Хочу в своём эмуляторе задействовать PS/2 клавиатуру, подключенную к GPIO пинам Raspberry Pi. Подключается элементарнейше 4-мя проводами:



+5В
CLOCK
DATA
GND


Но так как Raspberry Pi рассчитана на сигналы 3.3В, а клавиатура выдаёт 5В, которые запросто могут спалить GPIO, то сигналы CLOCK и DATA подключаются через делители, выполненные на резисторах:

https://pic.maxiol.com/images2/1697217970.780858384.raspips2kbd.png



/*
* kbdtest.c basic PS/2 keyboard input test
*
* Test operation of a PS/2 keyboard wired to P1 on
* the Raspberry Pi.
*
* PS/2 CLK line goes to P1-16 through voltage divider
* PS/2 DATA line goes to P1-18 through voltage divider
* PS/2 5 VDC line goes to P1-2 or P1-4
* PS/2 GND line goes to P1-6
*
* You MUST use a voltage divider between the PS/2 CLK
* or DATA lines and the RasPi P1 connector! The RasPi
* cannot handle 5 VDC logic signals. If you don't
* divide the PS/2 signals down to 3.3 VDC, you will
* damage the RasPi!
*
* Building this code will yield a kernel.img file. Copy
* this file to the root directory in a RasPi boot SD card,
* install the card into your RasPi, power it up, and the
* video display should show the test results.
*
* Note that you will have to set the display parameters
* in your SD card's config.txt file to match those of
* the console display parameters. For example, if your
* console library is built to use 800 x 600 pixel display,
* you will need to edit your SD card's config.txt to
* show a framebuffer_width of 800 and a framebuffer_height
* of 600.
*
* Karl Lunt 7 Aug 2015
*/





/*
* ps2kbd.c PS/2 keyboard support for the Raspberry Pi
*
* This code is based on the work by Paul Stoffregen, L. Abraham Smith,
* and others. I've retained Paul's copyright notice below.
*
* This code assumes a connection to the Raspberry Pi's expansion
* connector (P1). Two connections are required, one for the
* DATA signal and one for the CLK signal.
*
* WARNING! The Raspberry Pi GPIO inputs are NOT 5 VDC tolerant!
* You can use the 5 VDC supply on the RasPi to drive your keyboard,
* but you MUST use voltage dividers on the CLK and DATA lines when
* you wire them to your RasPi, or you will damage your RasPi.
*
* Here is a diagram for suitable voltage dividers:
*
* KBD DATA <---------[ 2.2K ]------+-------[ 3.3K ]---------> GND
* |
* +------------------------> RasPi GPIO
*
* KBD CLK <---------[ 2.2K ]------+-------[ 3.3K ]---------> GND
* |
* +------------------------> RasPi GPIO
*
* Karl Lunt (10 Aug 2015)
*/

/*


Протокол обмена простейший:

https://pic.maxiol.com/images2/1697218083.780858384.ps2kb.png

Смотрим на сигнал CLOCK и по его спаду получаем последовательно биты с сигнала DATA. Всё просто и элементарно.

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

А потом я отыскал таки готовую, скомпилированную программу, которая работает с таким типом подключения. Там изображение сбито, но оно изменяется с каждой нажатой клавишей. То есть гарантированно подключение верное и программа на клавиатуру реагирует. Бился я бился с драйвером, какие-то данные из DATA я получаю, но они нестабильные и хаотичные. Но совершенно точно это реакция на нажатие клавиш. Перед тем как пойти спать до меня таки дошло, что я ошибочно полагал (по аналогии с геймпадом NES!), что это я должен передавать сигнал CLOCK, в ответ на который клавиатура будет слать мне данные. Но на деле оба сигнала должна выдавать клавиатура. С этим я и лёг спать, рассчитывая, что теперь-то уж я точно всё сделаю. На следующий день снова ничего не получилось. И даже как-то хуже стало. Вообще пропала какая-либо реакция. Я решил запустить ту же самую программу, которая выступала индикатором правильности подключения. Но и она перестала что-либо выдавать. Причём я ничего не переподключал, ничего не менял и вообще никаких изменений не делал. И вот вчера оно работало, а сегодня при тех же условиях перестало. Первая мысль - сгорели порты GPIO. Проверил - порты исправны: принимают и передают данные, как и раньше. Прозвонил схему - всё везде ОК. Клавиатуру втыкал в два разных устройства - в обоих работает без нареканий и гарантированно в режиме PS/2. Перепаял схему, всё заизолировал и проверил - всё ОК. Нашёл другую программу, собрал её из исходников - клавиатуру она не видит. Подключил клавиатуру на другие пины, пересобрал программу - ноль эмоций. Проверил питание клавиатуры - 5В без просадок. В общем, всё по отдельности работает, а вместе не хочет. Хотя вчера работало, а сегодня уже не работает. Я думал, что может я своими экспериментами порты как-то пожёг. Но опять же на тех же портах на Rasberry Pi другие устройства работают, а клавиатура тоже работает с другими устройствами. Не могу гарантировать, но мне кажется, что почему-то CLOCK не тикает. Осциллографа у меня нет, поэтому проверить не могу.

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

Если что, вот здесь описание и программа, которой я тестировал (в конце статьи есть архив с исходниками, и в недрах в одной из папок лежит скомпилированный кернель): http://www.deater.net/weave/vmwprod/hardware/pi-ps2/
Вот здесь bare-metal OS с поддержкой такого типа подключения: https://github.com/deater/vmwos/tree/master (я смог собрать и запустить, но клавиатуру она не видит)
А вот короткий исходник на Си, которым можно быстро скомпилировать и опробовать: https://github.com/deater/vmw-meter/tree/master/pi-ps2 (клавиатуру не видит ни на этих пинах, ни на других)

Прошу любой помощи!

HardWareMan
13.10.2023, 21:53
Если только принимаешь то надо да, оба слушать. Если хочешь помигать лампочками, то надо передавать. Для этого зажимается CLK в 0 на некоторое время и после этого передаётся команда управления лампочками. Не вижу никакой сложности с управлением, а тебе надо подключить LA и посмотреть, что именно происходит на интерфейсе. Может у тебя драйвер не в критикал тайминге работает и теряет биты?

PS Я подключал PS/2 клаву к порту джойстика сеги и работал с ней в командной строке лет 15+ назад. Никаких проблем с этим интерфейсом вообще не видел.

CityAceE
13.10.2023, 22:02
а тебе надо подключить LA и посмотреть, что именно происходит на интерфейсе
Вот нет его у меня! И поэтому приходится вслепую что-то налаживать.


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

HardWareMan
13.10.2023, 22:05
Вместо LA можно и осциллографом. Благо, частоты не большие и можно триггером выделять посылку и в ждущем режиме записывать. Осциллографом даже лучше: можно проконтроллировать логические уровни, вдруг что-то не так?

Serg6845
13.10.2023, 22:09
Прошу любой помощи!

пара моментов -
- CLK и DATA со стороны клавиатуры надо подтянуть к +5В
- иногда попадаются клавы которым строго необходима инициализация со стороны хоста, иначе не работает

ALS
13.10.2023, 22:30
Вот нет его у меня! И поэтому приходится вслепую что-то налаживать.Я тут подсуетился... (https://www.avito.ru/moskva/audio_i_video/logicheskiy_analizator_cypress_cy7c68013a_-_56pvxc_1115463701)

UncleDim
13.10.2023, 22:35
- CLK и DATA со стороны клавиатуры надо подтянуть к +5В
можно и к 3.3 (и никаких делителей!), наверняка заработает
и вдоль ом по 300..500, на всякий

HardWareMan
13.10.2023, 22:37
Я тут подсуетился... (https://www.avito.ru/moskva/audio_i_video/logicheskiy_analizator_cypress_cy7c68013a_-_56pvxc_1115463701)
Да, для данной и ещё кучи задач его идеально будет.

CityAceE
13.10.2023, 22:55
пара моментов
Спасибо за предположения!

Из предложенного могу попробовать инициализацию клавиатуры. А что она из себя представляет? Не попадалась такая информация. Буду гуглить. Но к вопросу смогу вернуться только через неделю.

Смущает, что работало же ведь и без инициализации, и без подтяжки. И за ночь перестало. Я бы мог ещё поверить, что или Raspberry Pi какие-то параметры запоминает в недрах SoC, или клавиатура. Так ведь нет же.


Я тут подсуетился...
Спасибо! Заказал, правда в другом месте - чуть дороже, но с доставкой. Но ещё предстоит разобраться как с ним работать - никогда прежде не сталкивался.

UncleDim
13.10.2023, 23:20
Смущает, что работало же ведь
Подтяжка в клавиатуре слабенькая (10..20к) и м.б. не особо стабильная, в результате до малины после делителя вместо нормальной единицы доходят невнятные крохи.
вообще я бы попробовал клаву просто от 3.3в запитать, народ пишет - частенько они прекрасно работают при таком питании.

Xrust
14.10.2023, 00:03
CityAceE, современные клавиатуры двустандартные: PS/2 - USB. Режим работы определяется по напряжениям на линиях DATA и CLOCK. Если подтяжка недостаточная, переключится в USB.

CityAceE
14.10.2023, 04:37
никогда прежде не сталкивался.
Пока ещё не изучал работу ЛА, но есть предположение, что его работу я организовал у себя программно. 50 раз в секунду выводил на экран содержимое нужных мне портов. Это оно?


я бы попробовал клаву просто от 3.3в запитать, народ пишет - частенько они прекрасно работают при таком питании.
Была такая мысль. Геймпад от NES же заработал. Но пробовать не стал, так как смутило то, что нигде про такое упоминание мне лично не встретилось.


Если подтяжка недостаточная, переключится в USB.
И такое предположение делал, что клавиатура почему-то в режим PS/2 не входит. А что необходимо сделать, чтобы подтяжка стала достаточной?

Как вообще правильно сделать схему подключения 5-ти вольтовой клавиатуры к 3.3 вольтовому устройству? У меня есть три штучки вот таких конвертеров (https://market.yandex.ru/product--em-912-preobrazovatel-interfeisov-rs232-ttl/101807273836). Может быть через них можно сигналы грамотно согласовать, а не через делители на резисторах?
https://avatars.mds.yandex.net/get-marketpic/1525232/pic8468a05d735bfde0f8fc227f723285f0/orig

HardWareMan
14.10.2023, 07:09
Пока ещё не изучал работу ЛА, но есть предположение, что его работу я организовал у себя программно. 50 раз в секунду выводил на экран содержимое нужных мне портов. Это оно?
Оно, но ты же понимаешь, что ты так ничего кроме почти статичных уровней не увидишь? Теорема Котельникова и всё такое.


И такое предположение делал, что клавиатура почему-то в режим PS/2 не входит. А что необходимо сделать, чтобы подтяжка стала достаточной?
Нормально подтянуть к 5в со стороны клавиатуры, до делителя в малинку.

UncleDim
14.10.2023, 07:38
Нормально подтянуть к 5в со стороны клавиатуры, до делителя в малинку.
малина в 0 так не притянет, если возникнет желание светодиоды позажигать

HardWareMan
14.10.2023, 07:59
малина в 0 так не притянет, если возникнет желание светодиоды позажигать
Диоды спасут гиганта мысли. Ну или полноценный шифтер.

UncleDim
14.10.2023, 08:04
HardWareMan, пары полевиков достаточно (подтяжки, полагаю, можно и в малинке включить)
по типовой схеме согласователя i2c в практически любой видеокарте

HardWareMan
14.10.2023, 08:10
HardWareMan, пары полевиков достаточно (подтяжки, полагаю, можно и в малинке включить)
по типовой схеме согласователя i2c в практически любой ведеокарте
Т.е., ты не читаешь тему полностью? Хорошо, я повторю: автоматические PS2/USB определяют тип интерфейса при включени по напряжению подтяжки. 5В - PS/2, 3,3В - USB. Это те самые клавиатуры, которые работают вот с такими пассивными переходниками:
https://i.ibb.co.com/VV7bc4v/Ps2-to-Usb.jpg

UncleDim
14.10.2023, 08:20
я повторю: автоматические PS2/USB
а у ТС какая? usb с переходником? пока ни слова про это не прозвучало.
(приложил схемку выше. всё там нормально будет с автоопределением)

HardWareMan
14.10.2023, 08:27
а у ТС какая? usb с переходником? пока ни слова про это не прозвучало.
Я лично видел PS/2 клавы, которые не комплектуются переходником, но могут работать с USB. Для них отдельно продавался вот такой переходник:
https://i.ibb.co.com/gZsW5z5/s-l1600.png

UncleDim
14.10.2023, 08:56
могут работать с USB.
вообще усб-девайсы тянут при старте одну из линий к _своим_ 3В, усб-хост - к земле (слабенько), так что насчет алгоритма автоопределения еще вопрос, как оно там на самом деле..

HardWareMan
14.10.2023, 09:20
вообще усб-девайсы тянут при старте одну из линий к _своим_ 3В, усб-хост - к земле (слабенько), так что насчет алгоритма автоопределения еще вопрос, как оно там на самом деле..
Мало ли чего там прописано в стандартах, но существование клавиатур (и несколько моделей мышек) которые автодетектят интерфейс - факт доказанный. Как и методы детекта этого самого интерфейса. До них были клавы с физическим переключателем PS/2-USB на пузе. Такую я тоже видел.

Serg6845
14.10.2023, 09:38
Спасибо за предположения!

Из предложенного могу попробовать инициализацию клавиатуры. А что она из себя представляет?

послать ей reset как минимум. но если работало - скорее это не тот случай.


Не попадалась такая информация.

вот например https://www.eecg.utoronto.ca/~jayar/ece241_08F/AudioVideoCores/ps2/ps2.html#ifdesc



Смущает, что работало же ведь и без инициализации, и без подтяжки. И за ночь перестало.

уровень какой-нибудь на пределе например. но тут уже осциллограф нужен.



Спасибо! Заказал, правда в другом месте - чуть дороже, но с доставкой. Но ещё предстоит разобраться как с ним работать - никогда прежде не сталкивался.

да что с ним разбираться - достаточно поставить PulseView (https://sigrok.org/wiki/Downloads) - и вперед...
12 мегавыборок/сек 16 бит или 24 мегавыборки/сек 8 бит.

- - - Добавлено - - -



Как вообще правильно сделать схему подключения 5-ти вольтовой клавиатуры к 3.3 вольтовому устройству? У меня есть три штучки вот таких конвертеров (https://market.yandex.ru/product--em-912-preobrazovatel-interfeisov-rs232-ttl/101807273836). Может быть через них можно сигналы грамотно согласовать, а не через делители на резисторах?


не, такие не пойдут. тут не RS232. тут нужен например вот такой: https://kulibin.su/catalog/radiodetali/arduino-moduli/dvunapravlennyy-preobrazovatel-urovnya-signala-na-txs0102-2-bit.html
или на полевиках как уже ответили - если не лениво их паять.

- - - Добавлено - - -


Диоды спасут гиганта мысли. Ну или полноценный шифтер.

диоды не спасут. через них 5В полезет куда не надо.

- - - Добавлено - - -


Я лично видел PS/2 клавы, которые не комплектуются переходником, но могут работать с USB. Для них отдельно продавался вот такой переходник:
https://i.ibb.co.com/gZsW5z5/s-l1600.png

он точно пассивный? это может быть полноценный USB-PS2 переходник с которым будет работать любая PS/2 клава.

ALS
14.10.2023, 09:49
Думаю, будет проще найти на авито AT-клавиатуру и переходник с DIN на PS/2.

HardWareMan
14.10.2023, 09:59
он точно пассивный? это может быть полноценный USB-PS2 переходник с которым будет работать любая PS/2 клава.
Точно. Я его прозванивал в своё время. Да и по цене он сильно отличался от "универсального".

- - - Добавлено - - -

Что-то типа такого получалось:
https://i.ibb.co.com/jZPBL3J/usb-and-ps2.jpg

UncleDim
14.10.2023, 10:19
существование клавиатур (и несколько моделей мышек) которые автодетектят интерфейс - факт доказанный
С этим не спорю, у самого такая мыша имеется.

Как и методы детекта этого самого интерфейса
А вот тут возражу. Только что припаял 3.3-вольтовую 1117 к своему профику (отпаивать не буду, потом еще пригодится)) и 10k-подтяжки ps/2 интерфейса перенес на 3.3в. Подключил ту самую мышь - вуаля, 0xAA 0x00 при старте в классическом ps/2 стиле. На линиях 4.5в (мышь перетягивает), Ок, допаиваю к подтяжкам по килоому в параллель, на линиях уже 3.7В - поведение не меняется, 0хАА 0х00.
Что-то мне не верится, что вот просто так по напряжению мышь перейдет в usb, как-то слишком уж тупо для этого интерфейса.
ЗЫ. Вот по _отсутствию_ подтяжек - да, вполне возможно.

Xrust
14.10.2023, 10:44
Алгоритм простой: если одна линия притянута к +, а вторая 0, (не помню точно какая из них конкретно), то это USB. Если обе к +, то это PS/2. Ну и правильно
HardWareMan говорит, подтягивать нужно со стороны клавы.
С другой стороны, зачем вообще мучиться с подключением PS/2 к малине? Она же отлично работает с USB. Это мы от бедности и глупости с PS/2 заморачиваемся.

Serg6845
14.10.2023, 12:35
С другой стороны, зачем вообще мучиться с подключением PS/2 к малине? Она же отлично работает с USB. Это мы от бедности и глупости с PS/2 заморачиваемся.

если я правильно понял - то для вот этого: https://zx-pk.ru/threads/35288-emulyator-pk-spetsialist-quot-speciarmlist-quot.html
а писать на асме под голое железо USB стек - не, увольте... а вот PS/2 - как два пальца.

Rio444
14.10.2023, 13:14
Тема настолько разжевана-пережевана.
Просто подтянуть Data и Clock к +3,3 вольт через резистор 2..3 кОм.
Никаких делителей со стороны малинки не нужно.
Напрямую подключить выводы к Clock и Data.
Со стороны клавиатуры подтяжка к +5 теоретически может быть. Сейчас проверил свою древнюю Mitsumi, сопротивление на контактах от Data и Clock к Vcc порядка несколько мегаОм, т.е. никакой подтяжки нет.
Если боязно, померьте на своей. Либо можно поставить диоды шоттки от Data и Clock на +3,3В.
Букварь, где всё в одном месте https://sarfti.ru/wp-content/uploads/2014/05/pavlov-v.a.-klaviatura-i-manipulyatory.pdf
Если поможет могу дать работающий код, но он для AVR.

P.S. Уже выкладывал https://zx-pk.ru/threads/35030-variatsiya-bezvejtovogo-kontrollera-ps-2-klaviatury-dlya-spectrum-kompaktnyj-variant.html

HardWareMan
14.10.2023, 16:19
Хотя, наверное про подтяжки как детект вместо уровней - правы. Вот схема физического уровня USB:
https://i.ibb.co.com/DD31fLm/image-9.jpg
USB хост тянет обе линии вниз 15к, а устройство для детекта хостом должно потянуть вверх одну из линий к VCC 1,5к. Этим задаётся скорость Low/Full. А USB2 HIGH это уже логическая шняга через дескриптор. А вот PS/2 всегда тянет к VCC по понятной причине. Я думаю, что хорошей подтяжки к 3.3в будет достаточно.

PS: UncleDim, как я уже и говорил, диоды спасут, если поставить катодом к клавиатуре, а подтянуть к +5в после них у самой клавы. Однако, это будет односторонняя связь и если захочется поморгать лампочками, то надо делать полноценный шифтер или пробовать запустить клаву на 3.3в. Как уже сказали выше, есть ненулевая вероятность, что всё заработает нормально.

CityAceE
14.10.2023, 18:14
а у ТС какая? usb с переходником?
Да, я именно такую подключал.


зачем вообще мучиться с подключением PS/2 к малине? Она же отлично работает с USB.
Я пишу на bare-metal ассемблере. Организовать USB-стек в этом стиле слишком сложно. Примеров нет. А знающие люди отговаривают от такого. В этом плане PS/2 - это именно то, что надо.

SegaBoy
14.10.2023, 22:03
CityAceE, только что проверил на двух клавиатурах - одна со штекером PS/2, вторая с USB через зелёный переходник (что тут выше на фото мелькал) - обе работают от 3,3в. Для проверки подключал к Raspberry Pi Pico - у неё gpio как раз трёхвольтовые.

CityAceE
15.10.2023, 09:31
SegaBoy, огромное спасибо за этот тест! Через неделю обязательно попробую так же, и надеюсь, что взлетит.

CityAceE
23.10.2023, 14:06
Попробовал подключить всё напрямую, запитав всё от 3.3V. Моя клавиатура, увы, не взлетела.

Но взлетела вот при таком подключении:

https://pic.maxiol.com/images2/1698058584.780858384.schemaps2kb.jpg

Проверил работу своим новеньким осциллографом:

https://pic.maxiol.com/thumbs2/1698058655.780858384.4.png (https://pic.maxiol.com/?v=1698058655.780858384.4.png&dp=2)

Смутило высокое напряжение на сигналах. Померил на всякий случай тестером - результат тот же, около 4V.

Боюсь, что такой вариант рано или поздно сожжёт GPIO. Или нет? Что можно изменить, чтобы всё стало полностью безопасно?

UncleDim
23.10.2023, 14:29
Что можно изменить
например параллельно r11 r12 поставить диоды катодами к 3в

zebest
23.10.2023, 14:33
https://i.ibb.co/YhrcStW/keyb.jpg
Так уж точно будет полностью безопасно, осталось найти эти BAT54S - уж очень они мелкие. Есть схемы и с полевыми транзисторами, и просто со стабилитронами, но эта классическая.

SegaBoy
23.10.2023, 16:11
Попробовал подключить всё напрямую, запитав всё от 3.3V. Моя клавиатура, увы, не взлетела.
CityAceE, при питании от 3.3 схема подключения такая же использовалась, с подтяжкой к питанию?

Я подключал так:

USB-клавиатура BTC 5139U - VCC, CLK, DAT, GND - напрямую к Pi Pico (у Pico питание 3.3в, gpio - 3.3в). Линии CLK и DAT подтянул к питанию 3.3в через резисторы 4.7к (те что валялись под рукой, наверное и другие подошли бы). Без подтяжки именно эта клавиатура не хотела работать.

PS/2-клавиатура CHERRY ML4400 - VCC, CLK, DAT, GND - точно так же напрямую к Pi Pico. Линии CLK и DAT можно к питанию не подтягивать, работает и без этого (наверное достаточно внутренней подтяжки в клавиатуре).

Rio444
23.10.2023, 16:12
Резисторы по 120 Ом не нужны.
Достаточно диодов к +3,3В.
Вместо шоттки можно использовать советские германиевые, типа Д9, Д310.

CityAceE
23.10.2023, 17:04
при питании от 3.3 схема подключения такая же использовалась, с подтяжкой к питанию?
Просто напрямую. Не завелась.


Линии CLK и DAT подтянул к питанию 3.3в через резисторы 4.7к
Попробовал и так тоже. Результат аналогичный.

Пока мест работает только один вариант. Этот вариант везде тулят, когда хотят подключить клавиатуру PS/2 к Arduino. Но пользоваться я им в таком виде боюсь, так как опасаюсь спалить GPIO 4-мя вольтами. Или оно там куда-то лишнее сливается и это не сильно страшно? Я просто вообще полный ноль в понимании схемотехники.

Попробовал на всякий случай по этой схеме клавиатуру запитать 3.3V вместо 5V. Тоже не заработало. Исключал и сопротивления на 120 Ом при питании 3.3V - тот же результат.
https://pic.maxiol.com/images2/1698058584.780858384.schemaps2kb.jpg

AlexG
23.10.2023, 18:16
Я просто вообще полный ноль в понимании схемотехники.

Хоровиц и Хилл 3-х томник в помощь. Интересное чтиво. на русском

SegaBoy
23.10.2023, 18:57
Проверил ещё на двух PS/2-клавиатурах - LENOVO LXH-JME2207P и COMPAQ RT235BTWRU. Обе работают от 3.3в и без подтяжки к питанию.

Нашёл ещё AT-клавиатуру - BTC-5339R - тоже работает от 3.3в и без подтяжки.

CityAceE
23.10.2023, 19:41
параллельно r11 r12 поставить диоды катодами к 3в
Заменил сопротивления по 120 Ом, на сопротивления по 1 КОм. Поставил параллельно сопротивлениям на 2 КОм диоды 1n5817 катодами (край, помеченный полоской) к 3.3V. Напряжение 4 с лишним вольт никак не уменьшилось. Осцилограф показывает 4.31V и 4.19V двух на каналах.

Программного всё работает. Но насколько сейчас GPIO в безопасности?


Проверил ещё
Значит, у меня просто моя единственная клава такая капризная. Я бы без проблем купил бы ещё одну, но боюсь, что она окажется такой же. Есть ещё одна древняя, но там прямо реальный PS/2 разъём, к которому у меня пока нет ответной части (заказал, жду пока).

Serg6845
23.10.2023, 20:28
Заменил сопротивления по 120 Ом, на сопротивления по 1 КОм. Поставил параллельно сопротивлениям на 2 КОм диоды 1n5817 катодами (край, помеченный полоской) к 3.3V. Напряжение 4 с лишним вольт никак не уменьшилось. Осцилограф показывает 4.31V и 4.19V двух на каналах.


странно. или диоды не 5817 или осциллограф не то кажет. мне уровни на картинке с осциллографа странными показались. а если осциллограф зацепить за 3.3В - что он покажет (по сравнению с мультиметром)?

tnt23
23.10.2023, 20:48
Есть еще такая старинная апнота от фрискейла - "USB and PS/2 Multimedia Keyboard Interface"

https://www.nxp.com/docs/en/reference-manual/DRM014.pdf

Rio444
23.10.2023, 21:35
диоды 1n5817 катодами (край, помеченный полоской) к 3.3V.Измерьте пожалуйста напряжение на диодах обычным мультиметром (при включенной схеме).

На них при токе 1А должно падать около 0,55В. В Вашем случае ток - порядка миллиампер. Напряжение порядка 0,4 вольта.

У Вас или 3,3 не 3,3 а выше, или диоды не 1N581x https://static.chipdip.ru/lib/943/DOC019943263.pdf

CityAceE
23.10.2023, 21:46
мне уровни на картинке с осциллографа странными показались.
Переснял:
https://pic.maxiol.com/thumbs2/1698086692.780858384.6.png (https://pic.maxiol.com/?v=1698086692.780858384.6.png&dp=2)


а если осциллограф зацепить за 3.3В - что он покажет (по сравнению с мультиметром)?
Второй канал зацепил на 3.3V:
https://pic.maxiol.com/thumbs2/1698086746.780858384.5.png (https://pic.maxiol.com/?v=1698086746.780858384.5.png&dp=2)


У Вас или 3,3 не 3,3 а выше, или диоды не 1N581x
Дешёвый китайский тестер показывает 3.33V.
А диоды прямо вот эти покупал: https://www.chipdip.ru/product/1n5817-sunmate

Замерил тем же тестером напряжение на GPIO при подключенной схеме - 3.5V


Есть еще такая старинная апнота от фрискейла
Access Denied
You don't have permission to access "http://www.nxp.com/docs/en/reference-manual/DRM014.pdf" on this server.
Reference #18.84341060.1698086050.78ca1b8

Freiwind
23.10.2023, 22:22
Тут. (https://www.moparisthebest.com/downloads/DRM014.pdf)

vegapiratradio
23.10.2023, 22:23
Access Denied
You don't have permission to access "http://www.nxp.com/docs/en/reference-manual/DRM014.pdf" on this server.
Reference #18.84341060.1698086050.78ca1b8
vpn

Serg6845
23.10.2023, 23:22
Дешёвый китайский тестер показывает 3.33V.
А диоды прямо вот эти покупал: https://www.chipdip.ru/product/1n5817-sunmate

Замерил тем же тестером напряжение на GPIO при подключенной схеме - 3.5V

нормально. уж питание +0.3В должен переварить без проблем.


Access Denied
You don't have permission to access "http://www.nxp.com/docs/en/reference-manual/DRM014.pdf" on this server.
Reference #18.84341060.1698086050.78ca1b8

гуглится по имени файла на счет раз. вторая или третья ссылка, которая не на nxp.

HardWareMan
24.10.2023, 07:56
Попробовал подключить всё напрямую, запитав всё от 3.3V. Моя клавиатура, увы, не взлетела.

Но взлетела вот при таком подключении:

https://pic.maxiol.com/images2/1698058584.780858384.schemaps2kb.jpg
Боюсь, что такой вариант рано или поздно сожжёт GPIO. Или нет? Что можно изменить, чтобы всё стало полностью безопасно?

Я думаю, это достаточно безопасно. Скорее всего по входу GPIO есть кламп и 120 ом тут нормально ограничивают ток. Но если хочется прям совсем красоты, то бери автоматический шифтер.

- - - Добавлено - - -


Переснял:
https://pic.maxiol.com/thumbs2/1698086692.780858384.6.png (https://pic.maxiol.com/?v=1698086692.780858384.6.png&dp=2)


Второй канал зацепил на 3.3V:
https://pic.maxiol.com/thumbs2/1698086746.780858384.5.png (https://pic.maxiol.com/?v=1698086746.780858384.5.png&dp=2)


Дешёвый китайский тестер показывает 3.33V.
А диоды прямо вот эти покупал: https://www.chipdip.ru/product/1n5817-sunmate

Замерил тем же тестером напряжение на GPIO при подключенной схеме - 3.5V


Access Denied
You don't have permission to access "http://www.nxp.com/docs/en/reference-manual/DRM014.pdf" on this server.
Reference #18.84341060.1698086050.78ca1b8

Там поди бан по GeoIP. Вот тебе зеркало: https://cloud.mail.ru/public/KPxz/EzN6b2FZS

UncleDim
24.10.2023, 09:40
HardWareMan, клампа в пико нет.

Sandro
24.10.2023, 10:36
HardWareMan, клампа в пико нет.

Специального сильноточного диода -- может и нет, а вот схема защиты от статики должна быть, иначе бы они мёрли, как мухи. Тем более, что она нужна по стаендартам JEDEC, а на тех, кто не соблюдает стандарты, в промышленности смотрят очень косо.
Другое дело, что она не рассчитана на протекание постоянного тока. Так что -- как повезёт.

Rio444
24.10.2023, 11:43
Скорее всего по входу GPIO есть кламп и 120 ом тут нормально ограничивают ток
Нормально ограничивают ток сами резисторы подтяжки.
На стороне клавиатуры нет прямого выхода логического уровня.
Там точно так же стоят резисторы подтяжки к +5В (от 4,7К) и выход в виде открытого коллектора (либо открытого стока).
Даже если замкнуть GPIO на GND, максимальный ток от источника 5 вольт будет 5/4,7 = 1,06 мА.
Поэтому резисторы 120 Ом не нужны. Они только ухудшают характеристики устройства. Повышают уровень лог. 0.

https://pic.maxiol.com/images2/1698136899.781442571..png

HardWareMan
24.10.2023, 14:14
HardWareMan, клампа в пико нет.
Ну, значит навесить снаружи, как уже советовали.

- - - Добавлено - - -

Твоя картинка:

https://pic.maxiol.com/images2/1698136899.781442571..png
Твоя приаттаченная миниатюра:
https://i.ibb.co.com/xFJqRQg/1653989641-16476230.jpg

- - - Добавлено - - -

Rio444, для понимания, как выглядит твой пост у меня:
https://i.ibb.co.com/FwYnjfv/image.png

CityAceE
24.10.2023, 14:32
Твоя картинка
Похоже у СуперМакса сервер прилёг.

UncleDim
24.10.2023, 14:39
Там точно так же стоят резисторы подтяжки к +5В (от 4,7К)
на универсальной-то? usb-ps/2 т.е.
подтяжки там явно не в виде резисторов.

Rio444
24.10.2023, 15:41
Твоя приаттаченная миниатюра:
У меня картинка в полный рост.
Вот на другом хостинге:
https://i.ibb.co/8zdmQfS/1698136899-781442571.png (https://ibb.co/q0WD2cP)

- - - Добавлено - - -


на универсальной-то? usb-ps/2 т.е.
подтяжки там явно не в виде резисторов.
Не в этом суть. Если со стороны клавиатуры вообще нет никакой подтяжки, то подтяжка только со стороны девайса и напряжение в принципе не будет превышать 3,3 вольт.
Суть в том, что со стороны клавиатуры нет прямых выходов логической единицы, там только выходы с открытым коллектором (или стоком).

Не знаю, как ещё объяснить. У клавиатуры выходы не как у 74hc04, а как у 74hc06.
Т.е. без внешней подтяжки, с клавиатуры никакое напряжение, отличное от 0, выйти не может. Либо 0 (сток открыт), либо Hi-Z (сток закрыт).


Со стороны клавиатуры примерно такая схема:
https://hades.mech.northwestern.edu/images/3/34/Ps2_circuit.PNG
Резисторов к +5 вольт может не быть.

UncleDim
24.10.2023, 15:53
Rio444, в usb режиме наверное все же может) но да, не более 3.3в опять же

HardWareMan
24.10.2023, 21:39
Похоже у СуперМакса сервер прилёг.
Кстати, заработало.

- - - Добавлено - - -


Со стороны клавиатуры примерно такая схема:
https://hades.mech.northwestern.edu/images/3/34/Ps2_circuit.PNG
Резисторов к +5 вольт может не быть.
Потому что ОК, ибо двунаправленность.

Rio444
24.10.2023, 22:27
Потому что ОК, ибо двунаправленность.
Рад, что теперь понятно https://san2.ru/smiles/good.gif

Тот же принцип, кстати, используется на шине i2c, только там устройств может быть больше двух. И подтяжка всегда одна.

CityAceE
25.10.2023, 11:52
Получил, наконец, переходники и купил ещё одну PS/2 клавиатуру. Протестировал ещё раз все возможные варианты подключения и внёс их в таблицу:

https://pic.maxiol.com/images2/1698223162.780858384.keyboards.png

Все три клавиатуры исправно работают по схеме с питанием от 5V.
Клавиатура, которая работает исключительно как PS/2, завелась от делителя напряжения, с которым ранее работала клавиатура SWEN, а потом вдруг перестала.
Напрямую без подтяжек от 3.3В не завелась ни одна клавиатура.
С дополнительной подтяжкой к 3.3В через сопротивление на 4.7К также не завелась ни одна из них. Но! Клавиатура Defender повела себя странно. При подаче напряжения при таком варианте подключения она начала мигать одновременно всеми светодиодами с правильной периодичностью, но при этом сама не работала. Я на горячую убрал сопротивления. После этого светодиоды погасли и клавиатура завелась. И работала она вплоть до выключения питания. А потом всё по-новой. На всякий случай проделал то же самое с другой USB-клавиатурой, но там такой фокус не прокатил. Пробовал ставить сопротивления только на DATA и только CLOCK - тоже не заработало.

Ваши предположения, как можно заставить работать Defender от 3.3В без перетыкивания сопротивлений?

UPD: Увеличил сопротивления до 10К и клавиатура Defender завелась!

https://pic.maxiol.com/thumbs2/1698224935.780858384.7.png (https://pic.maxiol.com/?v=1698224935.780858384.7.png&dp=2)

Остальные не завелись.

rw6hrm
25.10.2023, 18:16
Оффтоп - Понимаю, что у меня был пик, а не малинка, но http://rw6hrm.qrz.ru/adapter.htm на всякий случай.

CityAceE
25.10.2023, 21:03
Понимаю, что у меня был пик, а не малинка
Спасибо! Нашёл в исходниках полезную для себя информацию.

CityAceE
27.10.2023, 11:08
Добрался до реализации программной части интерфейса PS/2. Относительно быстро реализовал чтение единичного кода с клавиатуры. Любопытно, что во многих исходниках игнорируется какая-либо проверка не только стартового и стопового битов, но и бита чётности. Но у себя я для надёжности все три бита проверяю на корректность. Не обошлось и без проблем, конечно.

Клавиатура у меня опрашивается 50 раз в секунду, в общем цикле без всяких прерываний и прочих штук-дрюк. Вот просто опрашиваю, и жду какое-то время нажата (или отпущена) кнопка/и или нет. Вот с этим "каким-то временем" и возникла загвоздка. Поясняю.

В процессе работы эмулятора я сбрасываю CLOCK, тем самым запрещая передачу данных с клавиатуры. Потом, когда начинается опрос клавиатуры, я поднимаю CLOCK и начинаю в цикле ждать данных. Сигналом прихода данных является сброшенный клавиатурой сигнал CLOCK. И вот у меня возникла проблема с этим временем ожидания. Время, которое проходит между поднятием CLOCK и началом передачи данных сильно варьирует! Данные могут начать приходить почти моментально, а может пройти довольно много времени. От чего это зависит, я так и не понял, но предполагаю, что данные с клавиатуры всего идут с определённой частотой. Таким образом, если ставить длительное время, то конечно, всё гарантированно прочитается, но при этом эмулятор на это время стоит, как вкопанный, и только ждёт клавиатуру. А в подавляющем большинстве случаев кнопки не нажимаются и это время я просто теряю впустую. Если ставить короткое время ожидания, то клавиши срабатывают через раз. Опытным путём с помощью осциллографа подобрал оптимальное время ожидания, примерно похожее на время передачи одного байта данных. Всё оформил и начал начал экспериментировать. Убедился, что нажатие на клавишу отрабатывается стабильно. Но до меня не сразу дошло, как читать второй байт данных, так как везде в описаниях протокола речь идёт исключительно о чтении одного байта. В исходниках подсмотрел, что чтение одного байта оформляют просто процедурой, а чтобы прочитать второй байт, эту процедуру просто вызывают нужное количество раз. Но у меня так тоже сразу не взлетело. Изначально второй байт у меня вообще никак не приходил. Я получал либо ошибку, либо ничего вообще не получал. Разобрался, что между передачей нужно выждать определённое время. Если время будет коротким, то ничего не прочитается, а если длинным, то все данные теряются, даже если предварительно передача была запрещена. Хотя и не должны, судя по описанию! Опять же, экспериментальным путём, выяснил, что повлиять на скорость следования второго и последующего байтов никак нельзя - это время жёстко задано клавиатурой и всегда одинаковое. В моём случае - это 3.8 mS. Можно сбрасывать CLOCK на какое-то время после приёма первого байта, а потом снова его поднимать, а можно сразу без опускания ожидать второго байта - время между двумя байтами всегда будет одним и тем же. А если чуть переборщить с опущенным CLOCK'ом и вовремя его не поднять, что второй байт будет потерян.

В итоге эти 3.8 mS с небольшим запасом я и взял в качестве времени ожидания поступления данных при получении одного байта. И если поставить две процедуры чтения друг за другом, то по времени всё выстраивается, как того хочет моя клавиатура.

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

Не знаю насколько всё правильно я реализовал. Подозреваю, что с другой клавиатурой и на другой плате всё будет работать иначе. Если будут какие-то советы, то с удовольствием приму их.

А вообще, я конечно, немного обескуражен скоростью данного интерфейса - как всё слишком медленно. И чем больше одновременно нажатых или отпущенных кнопок, тем ещё медленнее. Понимаю, что интерфейс устаревший и уже практически ушёл на покой, но тем не менее. С матричной клавиатурой по скорости он и рядом не стоял, конечно. Хотя внутри любой клавиатуры и так матрица. И даже геймпад NES опрашивается куда быстрее.

Следующим этапом у меня с нуля организовать чтение/запись SD-карты. А это, наверное, будет посложнее. Напоминаю, что пишу всё на ассемблере для процессоров ARM.

i8088
28.10.2023, 15:40
Понимаю, что интерфейс устаревший и уже практически ушёл на покой, но тем не менее.
Только недавно в организации, которую мы обслуживаем, покупали новый компьютер HP (обычный desktop), он
комплектовался USB мышью и клавиатурой, но в кейсе была штатно установлена планка с двумя PS2 разъемами,
провода от нее подкючались к специальному разъему на материнке, помеченному как PS2.

max232cpe
28.10.2023, 15:59
Только недавно в организации, которую мы обслуживаем, покупали новый компьютер HP (обычный desktop), он
комплектовался USB мышью и клавиатурой, но в кейсе была штатно установлена планка с двумя PS2 разъемами,
провода от нее подкючались к специальному разъему на материнке, помеченному как PS2.

Брендовые машины и некоторые сервера до сих пор имеют ps/2 и даже порты флопа с сд-ромами. Хотя и меньше их стало.

i8088
28.10.2023, 16:03
Брендовые машины и некоторые сервера до сих пор имеют ps/2 и даже порты флопа с сд-ромами. Хотя и меньше их стало.
Да, я еще видел плату от HP на DDR4 с двумя COM и LPT (один из COM и LPT нужно подключать через выкидыш).
Плата бытовая, не серверная.

max232cpe
28.10.2023, 16:17
Да, я еще видел плату от HP на DDR4 с двумя COM и LPT (один из COM и LPT нужно подключать через выкидыш).
Плата бытовая, не серверная.

lpt и com порты даже на обычном ширпотребе встречаются и по сей день.

Rio444
28.10.2023, 16:49
Клавиатура у меня опрашивается 50 раз в секундуЗачем такие сложности?

По стандарту клавиатура должна работать в режиме опроса, но на деле очень много клавиатур так не работают или работают неправильно.

Клавиатура должна сама отправлять данные когда захочет. В этом режиме 100% клавиатур работают правильно.

Выше давал ссылку на код для AVR.
Продублирую нужные фрагмент кода:




// External Interrupt 0 service routine //Отрицательный фронт AT Clock ЧИТАЕМ ИЛИ ПИШЕМ
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
delay_us(3); //Задержка, чтобы установился сигнал Data
if(at_read) //Если читаем из AT
{
if (at_bitcount == 11) //проверяем старт-бит
{
at_even_parity = 0; //Обнуляем бит четности
if (ADATA) at_error = YES; //нет старт-бита? Значит что-то пошло не так
}
else if(at_bitcount > 2) //Перекидываем значащие биты в буфер
{
at_shift_reg = at_shift_reg >> 1;
if (ADATA)
{
at_shift_reg = at_shift_reg | 0x80;
at_even_parity = !at_even_parity;
}
}
else if (at_bitcount == 2) //Если бит чётности (odd parity)
{
if(at_even_parity==ADATA) at_error = YES; //Если бит чётности = биту НЕчётности (взаимная инверсия), то ошибка!
}
else //Если стоп-бит
{
if (ADATA==0) at_error = YES; //нет стоп-бита? Значит что-то пошло не так
else //Если байт принят и всё в порядке,
{
at_buff = at_shift_reg;
at_new_data = YES; //Буфер символа не пуст
at_bitcount = 12; //Взводим счётчик битов (ниже он будет уменьшен на 1 и станет = 11)
ACLK_OUT = NULL; //Опускаем Clock - подтверждение клавиатуре в приёме (не обязательное)
}
}
}
else //Если пишем в AT
{
if (at_bitcount >3) //Отправляем биты в AT
{
if(at_shift_reg & 1)
{
ADATA_OUT = ONE;
at_even_parity = !at_even_parity;
}
else ADATA_OUT = NULL;
at_shift_reg = at_shift_reg >> 1;
}
else if(at_bitcount == 3) //Отправляем бит чётности
{
ADATA_OUT = at_even_parity; //У нас ADATA_OUT инвертировано, но и even_parity инвертировано относительно odd parity (которое и отсылается)
}
else if(at_bitcount == 2) //Отправляем стоп-бит = 1. И, одновременно, включаем порт на приём
{
ADATA_OUT = ONE;
}
else // Иначе at_bitcount == 1, других вариантов быть не может))))
{
if (ADATA) at_error = YES; //нет ACK (подтверждение от клавиатуры)? Значит что-то пошло не так
at_read = 1; //Переводим в режим чтения
at_bitcount = 12; //Взводим счетчик битов
}
}
at_bitcount--; //Уменьшаем на 1 счётчик битов. Причём не зависимо от того, принимаем или передаём.
}




void at_write (char a) //Пишем байт в AT
{
ACLK_OUT = NULL; //Тянем Clock на землю

GIMSK=0; // Вырубаем прерывания от AT Clock
GIFR=1<<INTF0; //Сбрасываем флаг прерывания от AT Clock (если он уже оказался установлен)

delay_us(100); //Ждём 100мкс (это минимум).
ADATA_OUT = NULL; //Тянем Data на землю

//Готовим данные (это даёт небольшую паузу):
at_shift_reg = a; //Заталкиваем в сдвиговый регистр AT передаваемый байт
at_read = NO; // Сбрасываем режим чтения, значит будет запись в AT
at_bitcount = 11; // Взводим счётчик битов
at_error = NO; //Сбрасываем ошибку работы с AT (если она была)

at_even_parity = 0; //Обнуляем бит четности

ACLK_OUT = OFF; //отпускаем Clock

GIMSK=(1<<INT0); // Включаем прерывание для Clock AT
}

//типовая процедура пропуска подтверждения операции записи в АТ клаву
//(простейшее ожидание и проверка ответа "0xFA")
void FAskip() //Возвращает at_error (если ошибка = 1, иначе = 0)
{
while (!(at_new_data | at_error)); //Пока буфер символа пуст и нет ошибки приёма, ждём (в это время могут выполняться прерывания).
if (at_buff != 0xFA) at_error = YES; //проверяем ответ
at_new_data = NO;
}

void at_init() //Инициализация AT клавиатуры
{
at_write (0xFF); // Сбрасываем клавиатуру
FAskip(); // Пропускаем от клавиатуры символ - подтверждение приёма. ////Если произошла ошибка, выход из процедуры
ACLK_OUT = OFF;
while (!(at_new_data | at_error)); //Пока нет новых данных (и нет ошибки AT), ждём (в это время могут выполняться прерывания)
at_new_data = NO;
if(at_buff != 0xAA) at_error = YES;
}

UncleDim
28.10.2023, 16:57
без всяких прерываний и прочих штук-дрюк - только клавиатурой и придется заниматься))

CityAceE
28.10.2023, 19:45
Зачем такие сложности?
На самом деле ничего сложного. Делаю свои дела, когда доходит до обновления экрана, опрашиваю и клавиатуру: разрешаю передачу, проверяю, запрещаю передачу. Запрет не передачу описан во всех мануалах, которые я читал. Я так планировал сделать с самого начала, но были сомнения, а подтверждение такого подхода нашёл в исходниках, ссылку на которые дал rw6hrm.


Клавиатура должна сама отправлять данные когда захочет. В этом режиме 100% клавиатур работают правильно.
ОК.А если программа не готова принять эти данные, то что?


Продублирую нужные фрагмент кода:
Приблизительно так и делают все остальные программы. Так же сделано и у меня.


только клавиатурой и придется заниматься))
Сейчас вхолостую тратится 3.8 mS при опросе клавиатуры 50 раз в секунду. Итого из 1 секунды работы эмулятора тратится 0.000190 сек на обработку клавиатуру. Проверено совместно с эмулятором, это время не является критичным для его работы.

Rio444
28.10.2023, 22:03
ОК.А если программа не готова принять эти данные, то что?Что может помешать?
Приём через прерывание и занимает совсем немного времени на обработку.
Каждый бит принимается по отдельности. Между битами процессор может заниматься другими делами.


На самом деле ничего сложного.Сложности для клавиатуры. Некоторые клавиатуры даже не тестируют на правильную работу в таком режиме.

UncleDim
28.10.2023, 22:04
Итого из 1 секунды работы эмулятора тратится 0.000190 сек
урежь осетра-то. раз в тыщу)

CityAceE
29.10.2023, 20:55
урежь осетра-то. раз в тыщу)
Речь про миллисекунды (mS), а не про микросекунды (µS, чаще обозначают как uS).

В общем, всё сделал. Всё работает. Ничего не тормозит.

https://youtu.be/gZHQHBIwrBk

UncleDim
30.10.2023, 00:43
Речь про миллисекунды (mS)
про то и речь. 3.8mS*50=0.19S

CityAceE
30.10.2023, 10:50
про то и речь. 3.8mS*50=0.19S
Да, согласен, затупил. Сильно долго получается, конечно. Нужно будет что-то с этим делать.


Каждый бит принимается по отдельности. Между битами процессор может заниматься другими делами.
Попробую потом подумать, как запустить опрос клавиатуры между делом, то есть по частям, между эмуляцией команд процессора, но без использования прерываний. Есть пара идей по этому поводу. А пока устал я от клавиатуры. Сейчас всё работает, времени на опрос, даже такой жирный, хватает, поэтому займусь реализацией других вещей.

CityAceE
01.11.2023, 19:45
Продолжаю возиться с PS/2 клавиатурой, постепенно переделывая всё, чтобы она опрашивалась между делом. А пока доделал полный опрос своим тормозным способом и полностью всё привязал к клавиатуре Специалиста в своём эмуляторе. И вот в процессе тестирования столкнулся с забавным фактом. При очередном тестировании обнаружил, что Exolon отказывается одновременно идти вправо, прыгать и стрелять. Сразу отсёк свою ошибку в эмуляции клавиатуры, так как от геймпада Dendy всё управляется корректно, а процедура эмуляции одна и та же. Тест Рюмика тоже показывает, что кнопка Вправо, одновременно нажатая с чем-то ещё, блокирует Пробел. Переопределил курсорные клавиши на NumPad и там тоже всё работает бегает, прыгает и стреляет как положено. Забеспокоился, что я что-то накосячил с очередью, которая копится при одновременном нажатии и отпускании кнопок. У меня даже мыслей не было, что я мог сделать не так. Но подключив эту клавиатуру к PC обнаружилось, что она там ведёт себя точно так же, в то время как остальные клавиатуры спокойно обрабатывают такие комбинации, в том числе и в тесте Рюмика и в Exolon'е, запущенными под Emu80. Я и до этого знал, что не все клавиатуры одинаково полезны, но вот сегодня столкнулся с этим сам.

goodboy
01.11.2023, 20:53
Я и до этого знал, что не все клавиатуры одинаково полезны, но вот сегодня столкнулся с этим сам.
https://key-test.ru

CityAceE
03.11.2023, 10:50
Чтобы уже раз и навсегда решить проблему подключения любой PS/2-клавиатуры к Raspberry Pi и ничего при этом не сжечь, купил вот такую штуку:

https://pic.maxiol.com/thumbs2/1698997091.780858384.dip.jpg (https://pic.maxiol.com/?v=1698997091.780858384.dip.jpg&dp=2)

Это TXS0102DCUR - преобразователь логического уровня (VOLT-LEVEL TRANSLATOR)



Этот двухбитный неинвертирующий преобразователь является двунаправленным преобразователем уровня напряжения и может использоваться для обеспечения совместимости цифрового переключения между системами со смешанным напряжением. Он использует две отдельные настраиваемые шины питания: порты A поддерживают рабочее напряжение от 1,65 В до 3,6 В при отслеживании питания VCCA, а порты B поддерживают рабочее напряжение от 2,3 В до 5,5 В при отслеживании питания VCCB. Это позволяет поддерживать как более низкие, так и более высокие уровни логических сигналов, обеспечивая при этом возможность двунаправленной трансляции между любыми узлами напряжения 1,8 В, 2,5 В, 3,3 В и 5 В.

Когда на входе разрешения выхода (OE) низкий уровень, все входы/выходы переводятся в состояние с высоким импедансом, что значительно снижает потребление тока покоя источника питания.

Чтобы обеспечить состояние высокого импеданса во время включения или выключения питания, OE должен быть подключен к GND через понижающий резистор; минимальное значение резистора определяется возможностью источника тока драйвера.



https://pic.maxiol.com/images2/1698997224.780858384.tab.png

Подключил так:
VCCA - 3.3V
A1 и A2 - GPIO Raspberry Pi
VCCB - 5V
B1 и B2 - DATA и CLOCK клавиатуры
GND - Raspberry Pi и клавиатура

Ну и, как обычно, ничего не работает.
На B1 высокий уровень от клавиатуры, но на A1 и A2 низкий. Оба питания на плату подаются.

Пробовал воткнуть сопротивление на 10 кОм между OE и GND, но тоже безрезультатно.

Что исключить нерабочий чип, протестировал и второй экземпляр, но ничего не поменялось.

Что я делаю не так? Или все-таки дело в резисторе и его просто нужно подобрать? Если да, то какого примерно номинала ставить?

Eltaron
03.11.2023, 11:08
Пробовал воткнуть сопротивление на 10 кОм между OE и GND, но тоже безрезультатно.
А куда вообще OE подключен?

- - - Добавлено - - -

Искал даташит, в картинках нашел подключение к PS/2. Качество шакальное (из кэша гугла), но оригинал не открывается, от нас он, видимо, забанен

79720

CityAceE
03.11.2023, 11:11
А куда вообще OE подключен?
Сейчас в воздухе болтается.


Искал даташит, в картинках нашел подключение к PS/2.
Я такой тоже, находил, конечно. Но данная схема вообще не понять для чего. Все контакты между собой так или иначе соединены, и только два входа есть DATA и CLOCK. А где ещё два выхода?

Eltaron
03.11.2023, 11:38
Я такой тоже, находил, конечно. Но данная схема вообще не понять для чего. Все контакты между собой так или иначе соединены, и только два входа есть DATA и CLOCK. А где ещё два выхода?
PS2 CLK (пин 4) и PS2 DATA (пин 5) со стороны клавы, CLK (пин 1) и DATA (8) - со стороны GPIO. Соединены в смысле, что на CLK/DATA идет только питание через резистор? Это подтяжка. Судя по большим номерам компонент (U5, R22), это кусок какой-то большой схемы, поэтому не стали заморачиваться рисованием дополнительных, красиво подписанных отводов от 1 и 8 ног. CADы же как работают, достаточно использовать то же название сигнала в другой части схемы, как автоматически создается новая сеть и при разводке платы эти контакты придется соединить в любом случае.

- - - Добавлено - - -


PS2 CLK (пин 4) и PS2 DATA (пин 5) со стороны клавы, CLK (пин 1) и DATA (8) - со стороны GPIO.
Хотя судя по тому, что CLK и DATA подтянуты к 5 вольтам, а не к 3.3, то может и наоборот. Да уж, увидеть бы эту схему целиком.
Но в любом случае интересно, что там на OE. На плате преобразователя есть резистор, может там OE уже к высокому уровню подтянут? Если нет, надо подтянуть, без OE ничего работать не будет точно.

CityAceE
03.11.2023, 11:42
Если нет, надо подтянуть, без OE ничего работать не будет точно.
Да, уже прочитал в datasheet:



8.3.4 Enable and Disable

The TXS0102 has an OE input that is used to disable the device by setting OE low, which places all I/Os in the
Hi-Z state. The disable time (tdis) indicates the delay between the time when OE goes low and when the outputs
are disabled (Hi-Z). The enable time (ten) indicates the amount of time the user must allow for the one-shot
circuitry to become operational after OE is taken high.

8.3.5 Pullup or Pulldown Resistors on I/O Lines

Each A-port I/O has an internal 10-kΩ pullup resistor to VCCA, and each B-port I/O has an internal 10-kΩ pullup
resistor to VCCB. If a smaller value of pullup resistor is required, an external resistor must be added from the I/O
to VCCA or VCCB (in parallel with the internal 10-kΩ resistors). Adding lower value pull-up resistors will effect VOL
levels, however. The internal pull-ups of the TXS0102 are disabled when the OE pin is low.

8.4 Device Functional Modes

The TXS0102 device has two functional modes, enabled and disabled. To disable the device set the OE input
low, which places all I/Os in a high impedance state. Setting the OE input high will enable the device.


Соединение OE c +3.3V через тот же резистор на 10 кОм также не приводит к положительному результату, хотя вижу, что какое-то неосмысленное шевеление на A1 и A2 всё-таки появилось. Видимо, нужен другой номинал сопротивления. Вот только не понимаю увеличивать его нужно или, наоборот уменьшат. По логике вроде выходит, что уменьшать. А до скольки?

Eltaron
03.11.2023, 12:28
Соединение OE c +3.3V через тот же резистор на 10 кОм также не приводит к положительному результату, хотя вижу, что какое-то неосмысленное шевеление на A1 и A2 всё-таки появилось. Видимо, нужен другой номинал сопротивления. Вот только не понимаю увеличивать его нужно или, наоборот уменьшат. По логике вроде выходит, что уменьшать. А до скольки?
Зависит от того, чем занимается резистор на плате конвертера (подтягивает ли он OE, и если да, то куда), но 10 кОм - это явно перебор. Если у RPi GPIO по-умолчанию настроены как вход, то уменьшать сопротивление можно даже до нуля. Если как выход, то по красоте OE нужно тоже завести на GPIO и включать его самостоятельно после того, как GPIO-пины, к которым цепляется клава, будут проинициализированы. Хотя на деле наверняка и в этом случае можно OE прямо повесить на 3.3, и ничего не сгорит, тем более, что до сих пор ничего не сгорело :)

Вон, как в Карабасе Про сделано, например

CityAceE
03.11.2023, 13:29
Завелись все три имеющиеся у меня клавиатуры, после соединения OE и 3.3V через сопротивление на 4.7 кОм. Хотя народ OE и напрямую к 3.3V подключает, а на это ему эксперты отвечают:



Its fine to have the OE connected to Vccb as the OE is overvoltage tolerant.


Вот и в Карабасе тоже напрямую подключено. Пожалуй, и я тоже себе так сделаю. А если вдруг сгорит, то у меня ещё есть.

CityAceE
03.11.2023, 14:46
Ну и в итоге работает сносно у меня только одна клавиатура, на которой я тренировался. Остальные две теряют символы, если ожесточенно долить по клавишам. Вот что значит жёстко настроил тайминиги на один конкретный экземпляр. В общем-то, именно такого поведения я и ожидал. Буду всё переделывать, конечно.