Вход

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



Alex_LG
12.07.2019, 16:49
Практически закончил контроллер клавиатуры PS/2 для БКшки. Т.к. лень было паять кучу проводов к компу, сделал в виде внешнего модуля. При отключенном контроллере работает ВП1-014, при подключении контроллера через системный разъем автоматом отключается ВП1-014 и работает контроллер. Сделано на Меге (пока на 32 на девборде) и одной ТМ5 (нужно для захвата бита nAD1, Мега не успевает). Пока не сделал кнопку СТОП, все остальные кнопки работают, кнопки работы с верхним и нижним регистром - стандартный Shift. Бонус - автоповтор нажатой клавиши.

Для блокировки ВП1-014 пришлось перерезать дорожку /CS и в разрез вставить резистор. Вывод /CS от 014 и от 37 вывел на разъем. При подключении контроллера, от 37 используется для Меги, а на 014 подается +5В для блокировки. Так же на разъем заведен RP1. Контроллер можно поставить вместо ВП1-014.

Памяти прошивка занимает 1.5к. Количество задействованных ног - 16. Как только проект переведе на Мегу8 или что-то поменьше - выложу в открытый доступ.

http://i.piccy_.info/i9/6bb80ffcd2ab0e537771c0b068828ba8/1562938463/34621/1286315/IMG_20190712_161259_500.jpg (http://piccy_.info/view3/13281331/763c27f9a286595f913ba9f3618d93f9/)http://i.piccy_.info/a3/2019-07-12-13-34/i9-13281331/500x281-r/i.gif (http://i.piccy_.info/a3c/2019-07-12-13-34/i9-13281331/500x281-r) http://i.piccy_.info/i9/6a6368de13fe97940964f4497b872dd0/1562939372/42282/1286315/IMG_20190712_161317_500.jpg (http://piccy_.info/view3/13281357/9d7c33ef747cd32bd17e401468365306/)http://i.piccy_.info/a3/2019-07-12-13-49/i9-13281357/500x281-r/i.gif (http://i.piccy_.info/a3c/2019-07-12-13-49/i9-13281357/500x281-r)


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

Проект переведен на Мегу8. Пользуйтесь.
Контроллер можно сделать в виде внешнего блока, как написано выше, но лучше использовать внутри, т.к. некорые сигналы на системный разъем не выведены, а nRPLY нужно брать от ВП1-14. Сигнал "СТОП" заводится на выв. 15 ХТ2 для БК-0010 с двумя разъемами или выв. 1 ХТ1 для БК-0010 с тремя разъемами клавиатуры, т.е. на анод диода VD1.
Схема. М\с К155ТМ5 (для 155 серии резистор R2 можно не ставить), Atmega8-PU, конденсаторы 2 х 22пФ, кварц на 20МГц, резисторы на 10к
http://i.piccy_.info/i9/6799b70c8f01a28ad0f56bbcd6b0fd90/1564733024/24486/1286315/PS2_500.jpg (http://piccy_.info/view3/13316609/11b785110ecf4a1f7d09dc6f85dd8a78/)http://i.piccy_.info/a3/2019-08-02-08-03/i9-13316609/500x325-r/i.gif (http://i.piccy_.info/a3c/2019-08-02-08-03/i9-13316609/500x325-r)

Исходники и прошивка для Меги8 (Fuse High = 0xC9, Low = 0xEE). Есть автоповтор нажатой кнопки.
https://drive.google.com/file/d/1gOQMO9YiBlJn4xOxCEL2YTs4T7P8p7qV/view?usp=sharing

Видео работы (некоторые кнопки плохо нажимаются - старенькая клава). "СТОП" в начале видео - демонстрация работы кнопки СТОП (назначена на F10)
https://drive.google.com/file/d/1E92BunIVKSIO7vFRwn4-kLtqwtsBGn5t/view?usp=sharing

zx_
12.07.2019, 17:47
во, супер
не бросай , доделай
можно будет бк без корпуса бэкашного

Alex_LG
22.07.2019, 13:23
Перевел на Мегу8.
Есть проблема. После нескольких нажатий комп иногда уходит в ступор или выдает "СТОП". Пока не могу определить проблему, то ли я накосячил с прошивкой, то ли комп глючит (случайно дотронулся рукой к одной из РУ6 -по экрану пошел мусор, заменил, возможно есть еще глючные, надо проверять). Поэтому выкладываю для повтора и теста полный комплект. Если у кого есть возможность и желание - повторите. Пока не реализовал кнопку "СТОП", сигнал не используется. Устройство подключается к внешнему разъему. Все сигналы стандартные, дополнительно вывел на А6 сигнал nCSI - вход nCS (выв.30) от ВП1-14, А7 сигнал nCSO - выход nBS (выв.38) от ВП1-37, А8 - выход/вход RP1 (выв. 20) от ВП1-14. Необходимо впаять резистор 1кОм в сигнал nCS между ВП1-37 и ВП1-14, сделать это удобней с обратной стороны платы под ВП1-37 - разрезать дорожку и припаять резистор (фото ниже). Со стороны контроллера, на разъеме между выв. А4 и А6 подпаиваем резистор на 1-10кОм (на схеме нет), это будет блокировать ВП1-14 при подключении контроллера. Если использовать ТМ5 (7477) серии 155, т.е. к155тм5, то незадействованные входы можно оставить "висеть" в воздухе. ТМ5 используется для "защелки" бита nAD1 по активации nCS. Вместо ТМ5 можно использовать ТМ9, в общем нужен триггер или регист, способный запоминать по отрицательному фронту или по "0" на управляющем выводе. Мега, без ТМ5, не успевает считать этот бит и определить к какому регистру идет обращение. Мега работает на 16МГц (пробовал и на 20МГц), конденсаторы 22пФ.
По коду. Процедура работы с клавиатурой PS/2 взята из Интернета, там ничего сложного. Обработка клавиш подправлена под собственные нужды. Переключение РУС-ЛАТ - правый и левый АЛТ, по аналогии с клавиатурой БКшки, так же и по F1-F9 - от ПОВТ до СБР. Настройку раскладки можно сделать через таблицу vk_code в scancodes.h. Таблица представляет из себя перекодировку из кода нажатой клавиши в код в таблице кодировки БК bk_code. Обратной связи с клавиатурой не делал, т.е. индикаторами не мигает. Автоповтор пока убрал до выяснения сбоев в работе.

http://i.piccy_.info/i9/569cb71a005774b918c1a783d2fe1030/1563788791/24486/1286315/PS2_500.jpg (http://piccy_.info/view3/13298326/1e113e0504addb8305e81090b9f1525d/)http://i.piccy_.info/a3/2019-07-22-09-46/i9-13298326/500x325-r/i.gif (http://i.piccy_.info/a3c/2019-07-22-09-46/i9-13298326/500x325-r) http://i.piccy_.info/i9/7fd4b6583563c8f6379719787b8974f3/1563790890/33262/1286315/Clipboard01_500.jpg (http://piccy_.info/view3/13298393/da22169bd8f8894642b880591e4a3d37/)http://i.piccy_.info/a3/2019-07-22-10-21/i9-13298393/448x372-r/i.gif (http://i.piccy_.info/a3c/2019-07-22-10-21/i9-13298393/448x372-r)

Полній комплект (проект для WinAVR, схема в формате Eagle):
https://drive.google.com/drive/folders/1CwocgLbAX4EUza1iQBivYess9_LOPEC-?usp=sharing

krotan
22.07.2019, 17:01
Перевел на Мегу8. Есть проблема. Попробуй удалить конденсаторы на кварце, а фьюз CKOPT=0.

Alex_LG
23.07.2019, 09:59
Попробуй удалить конденсаторы на кварце, а фьюз CKOPT=0.
Не помогло.
Подключил стандартную клаву, комп работает не виснет, правда при нажатии, например 1 выскакивает 2, при повторном нажатии выскакивает 1, так с некоторыми клавишами - правильно срабатывают только на втором нажатии.
Заметил, что с кварцем на 16МГц глюк проявляется практически сразу, на 20МГц - можно неспешно что-то набрать. Похоже Мега не успевает нормально обработать клаву и времянка МПИ уходит, что приводит к зависанию компа. Наверное прийдется ставить два контроллера: один (типа Тини) будет обрабатывать клавиатуру, второй - МПИ, связать их по последовательному порту.
ЗЫ Не пойму как оно на 32 Меге работало!!! :v2_conf2:

Alex_LG
23.07.2019, 13:25
Мега успевает все красиво обработать. Вот двойное быстрое нажатие кнопоки
http://i.piccy_.info/i9/0e6b834c8d24311d71ba527247081053/1563877451/18835/1286315/rr_500.jpg (http://piccy_.info/view3/13299825/5cbef8275374d90e3a8caa196073d285/)http://i.piccy_.info/a3/2019-07-23-10-24/i9-13299825/500x266-r/i.gif (http://i.piccy_.info/a3c/2019-07-23-10-24/i9-13299825/500x266-r)

А вот, наверное, самая долгая в обработке кнопка ТАБ (зачем-то проц почти 30 раз считывает регистр кода клавиши)
http://i.piccy_.info/i9/8e5b48d67e8bda78fece1e67041968fd/1563877622/19838/1286315/tab_500.jpg (http://piccy_.info/view3/13299839/078937d913e5ab52e736d25384e10feb/)http://i.piccy_.info/a3/2019-07-23-10-27/i9-13299839/500x266-r/i.gif (http://i.piccy_.info/a3c/2019-07-23-10-27/i9-13299839/500x266-r)

Видно, что проц обращается к Меге между обработкой прерываний от клавиатуры - сигналы nCS попадают между пачек KB_CLK.
Проблема, скорее всего с вектором прерывания или чтением проца Меги. Вот "зависание" на обработке прерывания
http://i.piccy_.info/i9/95d3bbfb09ba8d7b775e8c6a74bee8a2/1563877873/19045/1286315/err1_500.jpg (http://piccy_.info/view3/13299851/7a13ecf3890c7bf7f4e635ab4ae8f165/)http://i.piccy_.info/a3/2019-07-23-10-31/i9-13299851/500x266-r/i.gif (http://i.piccy_.info/a3c/2019-07-23-10-31/i9-13299851/500x266-r)

P.S. Картинки увеличиваются - при просмотре, вверху слева есть выбор размера.

Alex_LG
23.07.2019, 16:22
nRPLY, который идет на системный разъем, идет от ПЗУшек, уровень на нем, почему-то, не больше 1.5В (возможно это проблема с моим компом). У Меги32 вектор/данные выставлялись в порт полностью, т.е. 8 бит за раз, на Меге8 байт делится между двумя портами - порт С и порт Д. Т.к. nRPLY порядка 1.5В, то проц считает его активным, поэтому может быть считывание байта до его актуализации. Подкинул nRPLY от ВП1-14 - стало намного стабильней. Но все равно появляется зависание на втором считывании, похоже что Мега подвисает, по крайней мере не выставляет nRPLY.

tank-uk
28.07.2019, 09:28
Alex_LG, вот тут https://github.com/andykarpov/ps2_cpld_kbd лежит проект клавы с сырцами заменяющий мех.клаву поправь сканкоды в меге328 и сетку в максе и клаву можно втыкать в родные разъёмы

Alex_LG
29.07.2019, 08:49
поправь сканкоды в меге328 и сетку в максе и клаву можно втыкать в родные разъёмы

Сканкоды вроде сходятся. На гитхабе проект просто заменяет механическую матрицу клавиатуры, он не подойдет. Смысл моего проекта в замене контроллера ВП1-14, а не кнопок. Клавиатура PS\2 - это, скорее, как "примочка" к контроллеру, если заменить Мегу8 на 16 (портов больше) то можно оставить родную механику.

Alex_LG
30.07.2019, 09:30
Выловил еще один глюк, причем элементарный ((((
Было

ADH_WR |= AD6;
ADH_WR |= AD7;
ADH_WR &= (CTRL_REG & (AD6|AD7)).

Вместо того, чтобы изменить 6 и 7 бит порта ADH_WR, менялся полностью байт, т.е. 0-5 биты обнулялись.
Заменил на

ADH_WR &= ~AD6;
ADH_WR &= ~AD7;
ADH_WR |= (CTRL_REG & (AD6|AD7))

Так же добавил задержку в 120мс (сигнал RP1) для того, что бы проц успевал отработать даже саму "медленную" клавишу "ТАБ" (около 30 считываний регистра кода клавиши) и при этом не возникали прерывания - эмуляция задержки на конденсаторах на ВП1-14.

Осталась одна проблема. В некоторые моменты проц почему-то считывает не регистр кода клавиши (для обычный кодов по 2 раза), а делает цикл "чтение-модификация-запись" регистра состояния, а затем, как положено, чтение регистра кода клавиши, что приводит к выводу "СТОП" и в дальнейшем к зависанию. Пытался разбираться в исходниках Монитора БКшки, но особо ничего не понял, с ВМ1 особо не знаком.

Может кто поможет разобраться с исходниками, что бы понять в какие моменты (кроме инициализации) происходит чтение-запись регистра состояния ВП1-14?

P.S. Жуть - 666 сообщение... )))))

gid
30.07.2019, 20:42
Использовать монитор БКшки для тестирования - не самая лучшая идея, нужно написать специальную тестовую программку.

В некоторые моменты проц почему-то считывает не регистр кода клавиши (для обычный кодов по 2 раза), а делает цикл "чтение-модификация-запись" регистра состояния
Это происходит по команде clr @#177660
Не знаю, какую БК 10 или 11М используете, но в 10ке это используется только в п/п инициализации драйвера клавиатуры, и в обработке прерывания по кнопке СТОП, а в мониторе 11М - этой командой злоупотребляют. Она там втыкнута к месту и не к месту. Например, в п/п получения кода нажатой клавиши, перед получением она выполняется, в обработке векторов прерывания от клавиатуры в конце, и в обработчике ошибочных ситуаций.

регистр читается дважды как на БК 10 так и на 11 в п/п приёма кода нажатой клавиши потому, что в первый раз - это чтобы сбросить бит 7 - флаг нового кода в регистре состояния (на всякий случай, чтобы гарантированно произошло прерывание от клавиатуры), и потом делается ожидание прерывания, в котором делается чтение регистра 177662 и обработка и передача принятого кода подпрограмме приёма кода нажатой клавиши.

Alex_LG
01.08.2019, 17:07
Есть прогресс, правда не все хорошо.
Думал, что вывод "СТОП" и зависание это одна проблема, но оказалось, что причина одна, а вот решения разные. "СТОП" появляется при первом считывании из регистра данный клавиатуры, а зависание - при втором.
При разработке пользуюсь докой "Однокристальный микропроцессор К1801ВМ1. Техническое описание. Версия 1.1 (January 26, 2019)" от 1801BM1@gmail.com взятой где-то здесь. Так вот. По доке, проц при чтении выставляет активный "уровень на линии nDIN, далее микропроцессор переходит в состояние ожидания данных и сигнала подтверждения nRPLY", запускается специальный таймер и "Если сигнал подтверждения nRPLY не будет получен в течение 56..64 тактов CLC, то цикл обмена прерывается и возникает программное исключение по вектору 0000048 (или 1600028 - зависит от состояния битов PSW10 и PSW11)." Однако на практике оказалось другое - если Мега8 не успевает вовремя выставить nRPLY (не пойму по какой причине, но nDIN бывает разной длины: при нормальной работе - где-то 2-3мкс, при сбоях - 1.5мкс), то проц не сразу ждет, а "передергивает" nDIN (что делает - не знаю) и только после этого уходит в ожидание на 64 такта. Т.к. Мега определяет, что nDIN уже не активный - снимает nRPLY, а он получается коротким (по доке - должен быть не менее двух тактов проца) и уже игнорирует следующий активный nDIN с ожиданием в 64 такта. Проц, естественно уже не получает nRPLY и уходит в обработку исключений, т.е. в инициализацию контроллера клавиатуры с выводом надписи "СТОП". Немного оптимизировал код и поставил задержку в 1мкс - проблема со "СТОП" ушла.

Осталось зависание. Причина та же, но вот проц не уходит в ожидание, а зависает. В принципе от него тоже избавился оптимизацией кода (все-таки переход на Мегу8 сказывается - надо байт делить между портами), но вылезла другая "бяка" - коды клавишь "O", "G" и "C" не правильно выводятся, т.е. вместо "О" выдает "/", вместо "G" - " ' ", вместо "C" - "#", правда иногда - все ОК. Анализ кодов показал, что портится бит 6 и только в кодах, где в младшем полубайте подряд идут 4, 3 и 2 единицы, т.е. 0x6F -> 0x2F, 0x67 -> 0x27, 0x63 -> 0x23. С остальными кодами вроде все хорошо. Вот как сейчас


ADL_WR=DATA_REG;
//ADH_WR |= AD6;
ADH_WR=DATA_REG_H;

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

Ну и последний вопрос. Где-то туплю. Есть код


if (sc==0x11)
{
if (ext)
{
ext=0;
lat = 2; //R_ALT=LAT
kk++;
}
else lat=4; //L_ALT=RUS
}
Этот кусок по идее переключает РУС-ЛАТ. По левому Alt (код 0x11, т.е. sc=0x11, ext=0) должен включиться режим РУС, по правому Alt (код 0xE0 0x11, т.е. sc=0x11, ext=1) - ЛАТ. По умолчанию режим ЛАТ, т.е ext=0 и lat=2. По идее при нажатии лев. Alt должен переключиться режим на РУС. Но в этот режим переключается только при втором нажатии на лев. Alt (всегда). Режим ЛАТ переключается сразу по нажатию прав. Alt.

Обновил исходники
https://drive.google.com/file/d/1q8rlT_lTPR4rhPrV2UO_Kpc9NZGcnZv4/view?usp=sharing

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

Разобрался с кодами клавиш - поменял строчки местами, т.е.


ADH_WR=DATA_REG_H;
ADL_WR=DATA_REG;

и все стало нормально работать - переходные процессы??? ))))))

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

С РУС-ЛАТ тоже разобрался.

Alex_LG
02.08.2019, 11:14
Все работает. Обновил первый пост, так же добавил видео. Пользуйтесь! )))))
Клавиша Del убирает символ справа, как и положено, Insert - вставляет пробел. Служебные кнопки верхнего ряда назначены на F1 (ПОВТ) - F10 (СТОП), Esc - АР2, Home - ВС, левый Alt - РУС, правый Alt - ЛАТ, Ctrl - СУ. Shift - работает как и принято в современном мире, CapsLock - не работает, не вижу смысла.

Terra
16.01.2020, 20:02
Чего-то у меня не заработало, подвешивает 11М. С вытащенной atmega8 запускается. МК проверял, прошивал загрузчик от ардуино - светодиодом моргал. Кварц 20МГц без конденсаторов.

Нашёл косяк с землёй, позже ещё поковыряю.

Alex_LG
17.01.2020, 14:55
Если подвешивает, значит или проверить монтаж или АТмега висит, т.к. она должна отвечать на запрос, а проц ждет ответа.
На 11 не проверял, нету (((

Terra
17.01.2020, 20:54
Накосячил - землю 8 посадил на avcc-20 вместо gnd -22. Запускается но не работает, для теста посадил диод на стоп через сопротивление на землю. Подправил время на 1000мс в атмел студио, скомпилил, залил. Не работает, похоже без лог. анализатора не обойтись.

https://pic.maxiol.com/images2/1579277809.1834883431.ps2key1.jpg
https://pic.maxiol.com/images2/1579278034.1834883431.ps2key2.jpg
https://pic.maxiol.com/images2/1579278127.1834883431.ps2key3.jpg

Alex_LG
17.01.2020, 23:19
Скорее всего да, лог анализатор нужен, проверяйте ответ от атмеги. И еще, поставьте конденсаторы на кварц 12-22пФ, даташит рекомендует)))

Terra
30.01.2020, 19:23
Что-то у меня вообще от МК сигналов нет...как бы ещё это дело проверить?
https://pic.maxiol.com/thumbs2/1580401017.1834878048.ps2bk.png (https://pic.maxiol.com/?v=1580401017.1834878048.ps2bk.png&dp=2)

Alex_LG
30.01.2020, 21:13
Фьюзы правильно прошили?

Terra
30.01.2020, 22:35
вроде правильно https://pic.maxiol.com/thumbs2/1580412596.1834878048.20200131222351.png (https://pic.maxiol.com/?v=1580412596.1834878048.20200131222351.png&dp=2)

Alex_LG
31.01.2020, 13:45
У Вас с точностью до наоборот!!!!
Fuse High = 0xC9, Low = 0xEE

- - - Добавлено - - -
Всегда пользуюсь этим калькулятором фьюзов http://www.engbedded.com/fusecalc/

Terra
03.02.2020, 12:18
Что-то у меня МК сдох нет ничего на выходах прошил фьюзы по умолчанию High = 0xD9, Low = 0xE1 и попробовал
https://radiokot.ru/forum/viewtopic.php?f=62&t=106200 и
http://www.getchip.net/posts/022-testovaya-proshivka-dlya-avr-mikrokontrollerov-proverka-rabotosposobnosti-portov/
ноль реакции на выходах(

Alex_LG
03.02.2020, 13:58
МК живой, просто Вы фьюзы перепутали и у вас отключился последовательный порт программирования.
Еще раз предложу калькулятор фьюзов, по нему и проверьте http://www.engbedded.com/fusecalc/

Terra
03.02.2020, 19:00
TL866 работает как параллельный программатор, фьюзы и программа перешивается без проблем. С Low = 0xE1 , High = 0xD9 идёт работа от внутреннего генератора на 1 МГц в тестовых прошивках, я правильно понимаю? Даже если я его залочу от последовательного программирования, выходы должны работать.
https://pic.maxiol.com/thumbs2/1580745403.788076507.20200204185408.png (https://pic.maxiol.com/?v=1580745403.788076507.20200204185408.png&dp=2)

Alex_LG
03.02.2020, 23:10
Вроде все верно

Terra
15.02.2020, 00:28
Разобрался что проект в WinAVR. Перешил лог анализатор под Saleae Logic. С клавиатуры сигналы Clock и Data видны.
А можно поправить исходник и фьюзы для Atmega168, у меня хватило понимания только на это:

TIMSK0 = (1<<TOIE1); // TIMSK = (1<<TOIE1); atmega8 ... TIMSK0 = (1<<TOIE1); atmega168
MCUCR |= (1<<ISC01)|(1<<ISC11);
EIMSK |= (1<<INT0)|(1<<INT1); //GICR |= (1<<INT0)|(1<<INT1); atmega8
EIFR |= (1<<INTF0)|(1<<INTF1); //GIFR |= (1<<INTF0)|(1<<INTF1); atmega8

Alex_LG
17.02.2020, 14:10
А можно поправить исходник и фьюзы для Atmega168, у меня хватило понимания только на это:
Вроде все правильно.

max232cpe
13.02.2022, 18:39
проэкт ещё живой?
Подскажите если в бк0010 физически отсутвует вп1-014 (любители драг металла её выдрали с платы) с данным контролёром включится?

Alex_LG
15.02.2022, 22:50
Да, проект как раз заменяет 014, но только в паре с пс/2 клавиатурой.
Проект дальше не развивался, нет необходимости - перевод на меньшие или старшие модели особо не имеет смысла, разве что полностью эмулировать 014 (опрос матрицы родной клавиатурв) на более старших АВРках...