rw6hrm, клавиатура посылает и такт и данные. Необходимости в выделении такта из потока данных нет. Тут вопрос весь сводится к программированию вв51.
rw6hrm, клавиатура посылает и такт и данные. Необходимости в выделении такта из потока данных нет. Тут вопрос весь сводится к программированию вв51.
Первый результат получен. ВВ51 запрограммирована на нужный режим и читает данные. Насколько они корректны - еще неясно. По крайней мере RxRDY выдает сигнал, что данные приняты. Теперь надо писать обработчик.
Сломал себе мозг. Работает, но через раз. Не могу понять, почему. Если включать "на холодную", то всегда работает с ошибками. Если сбрасывать через reset, тоже всегда дает ошибки, даже если до этого работало нормально. Без ошибок работает если после небольшого прогрева передернуть по питанию. При этом все сканкоды читаются и распознаются правильно. Даже если выдернуть клавиатуру из разъема и снова воткнуть. Но стоит нажать ресет - и снова прут ошибки. Плохо то, что сброс по питанию помогает не всегда.
Правильный MAKE 'Q' Внизу состояние выхода RxRDY, от которого работает прерывание процессора.
Правильный BREAK 'Q'
А это то же самое с ошибкой контроля четности
Подключена ВВ51 просто. RxC и RxD к клавиатуре, RxRDY на вход INT процессора, /CS к A15, /WR и /RD/ к /IOWR и /IORD системного контроллера, вход /C/D к A0/, на CLK идет 2,4576 с ГФ24. Настроена ВВ51 на работу асинхронный режим с внешней синхронизацией. Вход SYNDET подтянут к +5. Для отображения сканкодов используется LCD 2004а, подключенный напрямую к шине данных.
Вопрос: где может быть косяк? Почему так нестабильно запускается ВВ51?
Последний раз редактировалось Xrust; 24.07.2017 в 07:30.
Разгрыз я этот орешек. Клавиатура работает, сканкоды читаются. Осталось попробовать настроить отправку команд на клаву. Но теперь немного подробностей о том, с чем пришлось столкнуться. Как я уже говорил, представленный выше код работал нестабильно. Более того. Когда я попробовал менять ВВ51 выяснилось, что только одна единственная микросхема работала с ним после "прогрева". Остальные всегда принимали данные с ошибками и никак не хотели синхронизироваться. Что я еще испробовал? Инвертировать импульсы, сдвигать их одновибратором. Потом я подумал, а почему я стремлюсь использовать синхронный режим? Да просто потому, что кто-то где-то ляпнул, что интерфейс PS/2 на него похож. На самом деле все наоборот. Синхронный режим заточен под передачу массивов данных, а у нас одиночные байты. Значит с этой точки зрения асинхронный режим больше подходит. А откуда мы возьмем тактовую частоту на RxC? Правильно, с клавиатуры. При этом на внутреннем делителе устанавливаем коэффициент 1:1, длина - 8бит, контроль четности - нечет или odd parity, стоп байт - 1. Код этой команды - 05Dh. С такой настройкой все заработало!
...а я сразу удивился выбору синхронного режима, но скромно решил промолчать и подождать Суммируя с получением INT из RxRDY получаем на выходе сканкод со стробом. Далее таблично получаем ASCII-код.
А вот для обратного - передачи инфы в клаву - кмк ВВ51 уже будет не хватать. Во-первых небольшая обвеска понадобится для тактовой на передачу, во вторых, чтобы переключить клаву в режим приёма, нужно подсадить CLOCK на 100мкс на массу, и затем делать передачу в клаву, http://ru.osdev.wikia.com/wiki/%D0%A...ost-to-dev.jpg. Боюсь, что ВВ51 на такой выкрутас не способен... Либо делать просадку внешней схемой, суммируя "проволочным ИЛИ" её выход с тактовым сигналом.
Последний раз редактировалось rw6hrm; 22.07.2017 в 21:03.
rw6hrm, зачем обвеска на передачу? RxC и TxC и так вместе спаяны. Осталось только какой-нибудь выход незадействованный подключить на clock клавиатуры. Они там вроде все с ОК, сложностей быть не должно.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Вот пока пример программы для считывания скан кодов.
Написано на fasmg. За качество не ругайте.
Код:include "8085.inc" ;----Програма чтения ps/2 клавиатуры с-------------------------- ;---использованием ВВ51 и обработчиком--------------------- ;---прерываний------------------------------------------------------------------ init: di lxi sp,ramtop call initlcd call initusart ei main: hlt jp main nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop hextab: db '0123456789ABCDEF' nop nop nop nop nop nop nop nop ;----процедура обработки прерываний------------------------------------------------- int: di push psw push d push h in dusart call hexout mvi a,068h out dlcd call delay mvi a,20h out dlcd call delay pop h pop d pop psw ei ret ;---Установка ВВ51 в исходное состояние--------------------------------- initusart: xra a out cusart out cusart out cusart mvi a,ir ;Сброс out cusart mvi a,ps2 ;Установка режима работы порта out cusart mvi a,rxe out cusart ;Запись команды call delay in dusart call hexout call delay ret ;-Установка LCD2004b в исходное состояние------------------------ initlcd: mvi a,0ffh call delaya ;ожидание mvi a,0ffh call delaya ;ожидание mvi a,lcdinit ; out clcd call delay mvi a,lcdinit ; out clcd ;инициализация call delay ;------------------------------------------------------------------------------------------------- mvi a,lcd8bit ; out clcd ;режим 8бит call delay ;-------------------------------------------------------------------------------------------------- mvi a,lcdon ; out clcd ;включение call delay ;--------------------------------------------------------------------------------------------------- mvi a,lcdcls ; out clcd ;очистка mvi a,d5ms call delaya ;---------------------------------------------------------------------------------------------------- mvi a,06h ; out clcd ;режим call delay ;---------------------------------------------------------------------------------------------------- mvi a,070h ; p out dlcd call delay mvi a,073h ; s out dlcd call delay mvi a,02Fh ; / out dlcd call delay mvi a,032h ; 2 out dlcd call delay mvi a,020h ; out dlcd call delay ret ;----печать HEX байта из аккумулятора-------------------------------------------------------- hexout: push psw ; сохраняем аккумулятор rrc ; сдвиг на 4 разряда rrc rrc rrc call lhout ; выводим старшие разряды pop psw ; восстанавливаем значение call lhout ; выводим младшие разряды ret lhout: lxi d,hextab ; загружаем адрес таблицы ani 0Fh ; оставляем младший полубайт mov l,a ; загружаем в L dad d ; получаем адрес символа в HL mov a,m ; загружаем символ из таблицы out dlcd ; выводим символ call delay ret ;-----------задержка 100us------------------------------------------------------------------------------- delay: mvi a,0Fh delay1: dcr a nop nop jnz delay1 ret ;-----------задержка а*100us---------------------------------------------------------------------------- delaya: mov c,a ;в а содержится время задержки call delay mov a,c dcr a jnz delaya ret ;------------------Константы и указатели-------------------------------------------------------- ramtop= 87FFh ; d5ms= 030h ;задержка 5ms ;---Адреса регистров УСАПП---------------------------------------------------------------------- dusart= 00h ; регистр данных cusart= 01h ; регистр команд ;---Режимы УСАПП-------------------------------------------------------------------------------------- v9600= 04Eh ;1/16_8_no_1 v2400= 04Fh ;1/64_8_no_1 ps2= 05Dh ;1/1_8_odd_1 ;---Команды УСАПП------------------------------------------------------------------------------------ txen= 01h ; Передатчик включен dtr= 02h ; Устройство готово rxe= 04h ; Приемник включен sbrk= 08h ; Прерывание передачи er= 10h ; Сброс ошибок приема rts= 20h ; Передача разрешена ir= 40h ; Программный сброс eh= 80h ; Режим Hunt ;---Регистр состояния УСАПП----------------------------------------------------------------------- txrdy= 01h ; Передатчик готов rxrdy= 02h ; Приемник готов txe= 04h ; Передача закончена pe= 08h ; Ошибка четности oe= 10h ; Ошибка переполнения fe= 20h ; Ошибка формата syndet= 40h ; Синхросимвол найден dsr= 80h ; Передатчик терминала готов ;------Адреса регистров LCD---------------------------------------------------------------------------- clcd= 80h ;регистр команд dlcd= 81h ;регистр данных ;------Команды LCD---------------------------------------------------------------------------------------- lcdon= 0Ch lcdoff= 08h lcdcls= 01h lcd8bit= 038h lcdhome= 02h lcdinit= 030h
Передача команд тоже получилась. Понадобилось задействовать выходы /DTR и /RTS, пару транзисторов для ОК и пару инверторов для красоты.
В данном случае при нажатии клавиши Q происходит сброс клавиатуры с подтверждением.
Позже обещаю выложить схему подключения и программки на ассемблере. (Хотя скажу честно, кодер из меня тот еще, не будем уточнять. Так что если вдруг кто желает помочь с написанием драйвера, буду только рад и помогу отладить на своем железе.)
Если клавиатура правильная и поддерживает набор 3, то можно довольно гибко настроить её. Например, отключить брейк-коды для большинства клавиш, оставив их только для шифтов и т.п. В этом случае написание драйвера существенно упростится, хотя и неудобно будет в играх.
Последний раз редактировалось Xrust; 24.07.2017 в 20:34.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)