rw6hrm, клавиатура посылает и такт и данные. Необходимости в выделении такта из потока данных нет. Тут вопрос весь сводится к программированию вв51.
Вид для печати
rw6hrm, клавиатура посылает и такт и данные. Необходимости в выделении такта из потока данных нет. Тут вопрос весь сводится к программированию вв51.
Первый результат получен. ВВ51 запрограммирована на нужный режим и читает данные. Насколько они корректны - еще неясно. По крайней мере RxRDY выдает сигнал, что данные приняты. Теперь надо писать обработчик.
Сломал себе мозг. Работает, но через раз. Не могу понять, почему. Если включать "на холодную", то всегда работает с ошибками. Если сбрасывать через reset, тоже всегда дает ошибки, даже если до этого работало нормально. Без ошибок работает если после небольшого прогрева передернуть по питанию. При этом все сканкоды читаются и распознаются правильно. Даже если выдернуть клавиатуру из разъема и снова воткнуть. Но стоит нажать ресет - и снова прут ошибки. Плохо то, что сброс по питанию помогает не всегда.
Вложение 61651
Правильный MAKE 'Q' Внизу состояние выхода RxRDY, от которого работает прерывание процессора.
Вложение 61652
Правильный BREAK 'Q'
Вложение 61653
Вложение 61654
А это то же самое с ошибкой контроля четности
Подключена ВВ51 просто. RxC и RxD к клавиатуре, RxRDY на вход INT процессора, /CS к A15, /WR и /RD/ к /IOWR и /IORD системного контроллера, вход /C/D к A0/, на CLK идет 2,4576 с ГФ24. Настроена ВВ51 на работу асинхронный режим с внешней синхронизацией. Вход SYNDET подтянут к +5. Для отображения сканкодов используется LCD 2004а, подключенный напрямую к шине данных.
Вопрос: где может быть косяк? Почему так нестабильно запускается ВВ51?
Разгрыз я этот орешек. Клавиатура работает, сканкоды читаются. Осталось попробовать настроить отправку команд на клаву. Но теперь немного подробностей о том, с чем пришлось столкнуться. Как я уже говорил, представленный выше код работал нестабильно. Более того. Когда я попробовал менять ВВ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, зачем обвеска на передачу? RxC и TxC и так вместе спаяны. Осталось только какой-нибудь выход незадействованный подключить на clock клавиатуры. Они там вроде все с ОК, сложностей быть не должно.
Вот пока пример программы для считывания скан кодов.
Написано на 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, пару транзисторов для ОК и пару инверторов для красоты.
Вложение 61797
В данном случае при нажатии клавиши Q происходит сброс клавиатуры с подтверждением.
Позже обещаю выложить схему подключения и программки на ассемблере. (Хотя скажу честно, кодер из меня тот еще, не будем уточнять. Так что если вдруг кто желает помочь с написанием драйвера, буду только рад и помогу отладить на своем железе.)
Если клавиатура правильная и поддерживает набор 3, то можно довольно гибко настроить её. Например, отключить брейк-коды для большинства клавиш, оставив их только для шифтов и т.п. В этом случае написание драйвера существенно упростится, хотя и неудобно будет в играх.