PDA

Просмотр полной версии : PS/2 клавиатура на базе Arduino Nano



Voxel
27.08.2019, 11:51
Вроде не нашел темы по замене клавиатуры для 86РК в теме про РК.

Прикупил на али Arduino Nano ТАКУЮ (https://ru.aliexpress.com/item/32341832857.html?spm=a2g0o.productlist.0.0.61d941d aWp6z9L&algo_pvid=b33c8a2d-063c-4dbf-96c9-239928a91ae4&algo_expid=b33c8a2d-063c-4dbf-96c9-239928a91ae4-0&btsid=e35bd331-6c5f-41d3-a0b8-7a158350c6ed&ws_ab_test=searchweb0_0,searchweb201602_5,searchwe b201603_52). Знаю что можно использовать схему Caro на Atmega48, как я понимаю и на 168/328 соответственно.
Вопрос такой можно использовать готовую плату, не сдувая с нее чип? И как получить прошивку под 168/328 желательно с описанием, что делать? А то РК ни как не могу до ума довести без клавиатуры.

SoftLight
27.08.2019, 12:19
Я про РК мало что знаю, но вот (https://hackaday.io/project/166917-tek-v2) парни такую ардуинку к разным клонам спека подключают.

https://cdn.hackaday.io/images/3783661564783343657.png

HardWareMan
27.08.2019, 12:50
Я про РК мало что знаю, но вот (https://hackaday.io/project/166917-tek-v2) парни такую ардуинку к разным клонам спека подключают.
А безвейтово им, стало быть, слабо?

Eltaron
27.08.2019, 16:32
А безвейтово им, стало быть, слабо?
Так там 16 МГц всего. Они пишут, что время реакции должно составлять ~680 нс. Получается, при их 16 МГц это 10.9 тактов AVR-ки.
Вот было бы 11 - уложились бы:

4 такта уйдет на вход в прерывание
3 на JMP по вектору
1 такт на чтение шины адреса
2 такта на взятие из памяти байта данных, соответствующего прочтенному адресу
1 такт на вывод байта на шину данных

А так всегда есть вероятность, что проц полезет читать шину в те 6 нс, когда данные ещё не готовы.

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

Но это в случае спектрума, а для РК86 вейт, по-моему, не нужен, даже если на Си прошивку писать.

Alex_LG
27.08.2019, 17:58
4 такта уйдет на вход в прерывание
3 на JMP по вектору

А зачем такие сложности!? Просто проверяем ULA.RD в цикле и переходим на обработку запроса, команда SBIS выполняется от 1 до 3 тактов, а обработку PS\2 вешаем на прерывание...

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


Так там 16 МГц всего.

Меги спокойно работают и на 20МГц ;)

Eltaron
27.08.2019, 18:27
А зачем такие сложности!?
Меги спокойно работают и на 20МГц ;)
Речь про конкретный девайс и конкретный подход его авторов.

С прерыванием на PS/2 плохо то, что тогда вся логика конвертации кодов и подготовки 256-байтной таблицы будет прямо в прерывании. Понятно, что шина медленная, пакеты редкие и т.д. Но однажды мы всё же проигнорим очередной опрос, и игра словит ложное отпускание кнопки. Лучше уж wait.

Alex_LG
28.08.2019, 10:07
прерыванием на PS/2 плохо то, что тогда вся логика конвертации кодов и подготовки 256-байтной таблицы будет прямо в прерывании. Понятно, что шина медленная, пакеты редкие и т.д. Но однажды мы всё же проигнорим очередной опрос, и игра словит ложное отпускание кнопки. Лучше уж wait.

Прерываение нормально, если делать его только на перепад синхросигнала, т.е. "упал" клок в "0" - записали бит данных и дальше "слушаем" ULA.RD.
Таблицу клавиш строим заранее, т.е. строим таблицу где коду клавиши ПС/2 соответствует маска на ШД (в данном случае для Спека). Для хранения маски нажатых клавиш используется всего 8 ячеек,т.е. не так уж и много. При активном ULA.RD считываем ША и выводим нужную ячейку на ШД. Ничего не пропускаем и ни каких ложных срабатываний. Это теория, надо пробывать...
Заканчивает, тема не про Спек! :)))))

Eltaron
28.08.2019, 11:57
Для хранения маски нажатых клавиш используется всего 8 ячеек,т.е. не так уж и много.
А что если опрашивается, допустим, порт 0xFCFE? Будем в самом критичном к таймингам месте бегать по ячейкам и AND-ить их? Предварительная подготовка полной таблицы сэкономит нам время и на этом, и на вычислении адреса - мы просто разместим её в памяти так, чтобы младший байт адреса ячейки совпадал со старшим байтом адреса порта.

Alex_LG
28.08.2019, 12:33
А что если опрашивается, допустим, порт 0xFCFE? Будем в самом критичном к таймингам месте бегать по ячейкам и AND-ить их?

Не знаю что это за порт, в стандартной конфигурации такого нет. Из ША используются только А8-А15, сканируется матрица клавиатуры "0" по одной из этих линий, так, что и портов только 8, соответсвенно и 8 ячеек для хранения маски нажатых клавиш. Операция И или ИЛИ (для создания маски нескольких нажатых клавиш по одному порту) - это не столь важно и не критично, даже если Спек прочитает состояние одной из ячеек без нажатой клавиши (момент когда еще по ПС\2 не полностью считан код и в ячейке предыдущее состояние) это ни к чему не приведет, ведь и с обычной клавиатурой Спека не всегда клавиши жмутся в нужный момент и одновременно...

Eltaron
28.08.2019, 13:04
Не знаю что это за порт, в стандартной конфигурации такого нет.
Ага, порта нет, а диоды на линиях адреса у клавиатурной матрицы зачем-то есть :) Вот, на любом спектруме
10 PRINT AT 0,0; IN 64766;" ": GO TO 10
И понажимать CS...V и A...G

Так, знаете, мы дойдем до того, что PRESS ANY KEY TO CONTINUE через IN 254 делать тоже нельзя. Это ж 0 на всех A8..A15, катастрофа!

У 86РК тоже диоды на матрице, так что не офтоп :)

Alex_LG
28.08.2019, 13:51
Так, знаете, мы дойдем до того, что PRESS ANY KEY TO CONTINUE через IN 254 делать тоже нельзя. Это ж 0 на всех A8..A15, катастрофа!

Если подходить с этой точки зрения, то согласен на 256 ячеек )))
Но это все равно не повлияет на быстродействие, скорость выбора, что из 0-й ячейки, что из 255-й - одинакова.
Если примерятся к РК86, то тогда проще, наверное, сразу эмулировать ВВ55+клавиатура, и выводов будет меньше задействовано и скорости хватит...

P.S. Вообще-то я не вижу смысла заменять у РК86 (в т.ч. и на Спеке, тем более на клонах без УЛА) механическую клаву на контроллер ПС\2 - различных кнопок в продаже полно, даже аутентичные можно найти из разломаных терминалов, матрица заводится на стандартную ВВ55, в коих дефицита нет! Не знаю, но в этом есть какой-то свой шарм!
:v2_dizzy_coder: