Важная информация

User Tag List

Страница 5 из 5 ПерваяПервая 12345
Показано с 41 по 48 из 48

Тема: Контроллер PS/2 клавиатуры на КР580ВВ51А (i8251a) ?

  1. #41
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    rw6hrm, клавиатура посылает и такт и данные. Необходимости в выделении такта из потока данных нет. Тут вопрос весь сводится к программированию вв51.

  2. #42
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Первый результат получен. ВВ51 запрограммирована на нужный режим и читает данные. Насколько они корректны - еще неясно. По крайней мере RxRDY выдает сигнал, что данные приняты. Теперь надо писать обработчик.

  3. #43
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сломал себе мозг. Работает, но через раз. Не могу понять, почему. Если включать "на холодную", то всегда работает с ошибками. Если сбрасывать через reset, тоже всегда дает ошибки, даже если до этого работало нормально. Без ошибок работает если после небольшого прогрева передернуть по питанию. При этом все сканкоды читаются и распознаются правильно. Даже если выдернуть клавиатуру из разъема и снова воткнуть. Но стоит нажать ресет - и снова прут ошибки. Плохо то, что сброс по питанию помогает не всегда.

    Нажмите на изображение для увеличения. 

Название:	goodmake.PNG 
Просмотров:	120 
Размер:	18.3 Кб 
ID:	61651
    Правильный MAKE 'Q' Внизу состояние выхода RxRDY, от которого работает прерывание процессора.

    Нажмите на изображение для увеличения. 

Название:	goodbreak.jpg 
Просмотров:	109 
Размер:	19.1 Кб 
ID:	61652
    Правильный BREAK 'Q'

    Нажмите на изображение для увеличения. 

Название:	nogoodmake.PNG 
Просмотров:	122 
Размер:	17.6 Кб 
ID:	61653
    Нажмите на изображение для увеличения. 

Название:	nogoodbreak.PNG 
Просмотров:	120 
Размер:	18.6 Кб 
ID:	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?
    Последний раз редактировалось Xrust; 24.07.2017 в 07:30.

  4. #44
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Разгрыз я этот орешек. Клавиатура работает, сканкоды читаются. Осталось попробовать настроить отправку команд на клаву. Но теперь немного подробностей о том, с чем пришлось столкнуться. Как я уже говорил, представленный выше код работал нестабильно. Более того. Когда я попробовал менять ВВ51 выяснилось, что только одна единственная микросхема работала с ним после "прогрева". Остальные всегда принимали данные с ошибками и никак не хотели синхронизироваться. Что я еще испробовал? Инвертировать импульсы, сдвигать их одновибратором. Потом я подумал, а почему я стремлюсь использовать синхронный режим? Да просто потому, что кто-то где-то ляпнул, что интерфейс PS/2 на него похож. На самом деле все наоборот. Синхронный режим заточен под передачу массивов данных, а у нас одиночные байты. Значит с этой точки зрения асинхронный режим больше подходит. А откуда мы возьмем тактовую частоту на RxC? Правильно, с клавиатуры. При этом на внутреннем делителе устанавливаем коэффициент 1:1, длина - 8бит, контроль четности - нечет или odd parity, стоп байт - 1. Код этой команды - 05Dh. С такой настройкой все заработало!

  5. #45
    Veteran Аватар для rw6hrm
    Регистрация
    10.07.2005
    Адрес
    Ставрополь
    Сообщений
    1,151
    Спасибо Благодарностей отдано 
    35
    Спасибо Благодарностей получено 
    57
    Поблагодарили
    31 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ...а я сразу удивился выбору синхронного режима, но скромно решил промолчать и подождать Суммируя с получением 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.

  6. #46
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    rw6hrm, зачем обвеска на передачу? RxC и TxC и так вместе спаяны. Осталось только какой-нибудь выход незадействованный подключить на clock клавиатуры. Они там вроде все с ОК, сложностей быть не должно.

  7. #46
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #47
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот пока пример программы для считывания скан кодов.
    Написано на 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

  9. #48
    Master
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    904
    Спасибо Благодарностей отдано 
    200
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Передача команд тоже получилась. Понадобилось задействовать выходы /DTR и /RTS, пару транзисторов для ОК и пару инверторов для красоты.

    Нажмите на изображение для увеличения. 

Название:	keyrst.jpg 
Просмотров:	142 
Размер:	18.6 Кб 
ID:	61797

    В данном случае при нажатии клавиши Q происходит сброс клавиатуры с подтверждением.
    Позже обещаю выложить схему подключения и программки на ассемблере. (Хотя скажу честно, кодер из меня тот еще, не будем уточнять. Так что если вдруг кто желает помочь с написанием драйвера, буду только рад и помогу отладить на своем железе.)

    Если клавиатура правильная и поддерживает набор 3, то можно довольно гибко настроить её. Например, отключить брейк-коды для большинства клавиш, оставив их только для шифтов и т.п. В этом случае написание драйвера существенно упростится, хотя и неудобно будет в играх.
    Последний раз редактировалось Xrust; 24.07.2017 в 20:34.

Страница 5 из 5 ПерваяПервая 12345

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 27
    Последнее: 14.08.2018, 04:48
  2. Ответов: 28
    Последнее: 06.06.2018, 15:28
  3. БезWaitовый контроллер клавиатуры
    от caro в разделе Устройства ввода
    Ответов: 68
    Последнее: 01.07.2015, 05:42
  4. контроллер писишной клавиатуры
    от sevol в разделе Устройства ввода
    Ответов: 10
    Последнее: 18.02.2011, 09:38

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •