nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 19 Aug 2017 08:57



Reply to topic  [ 20 posts ]  Go to page 1, 2  Next
PS2 клавиатура для старых самопальных компов 
Author Message
Banned
User avatar

Joined: 20 Mar 2005 16:41
Posts: 2155
Location: От туда
Reply with quote
Я вот подумал тут кое чего, и решил поделиться с вами.

На форуме уже пролетала мысль заюзать быстрый PIC и эмулировать КР580ВВ55 в целом. Это, конечно, самое красивое решение. Однако, скорость чипа должна быть большой, чтобы на лету брать и отдавать данные. В итоге, пока ни к чему не пришли. Я предлагаю более дешевый (но одновременно и более громоздкий) подход. Допустим, нам незачем эмулировать ВВ55, тем более, эта самая ВВ55 уже стоит в системе. Нам достаточно правильно выставлять сигналы на ее портах. А с этим справится даже АТ89С51. Но, есть засада. Как узнать, какой порт в какую сторону смотрит? Ведь выяснилось, что у Специалиста софт крутит портом как хочет. Значит, надо хранить состояние направления! Но как его получить? Вот тут и есть засада.
На самом деле, все слово состояния нам смотреть и не надо. Порт управления содержит следующие биты:
Code:
Бит    Описание
D0     Порт C (0-3): 1 вход, 0 выход
D1     Порт В: 1 вход, 0 выход
D2     Режим: 0 MODE0, 1 MODE1
D3     Порт C (4-7): 1 вход, 0 выход
D4     Порт А: 1 вход, 0 выход
D5     Режим: 0 MODE0, 1 MODE1 (при D6=0)
D6     Режим: 0 MODE0/MODE1, 1 MODE2
D7     =1
Бит    Описание
D0     Значение бита порта С
D1     \
D2      Адрес бита порта С
D3     /
D4     X
D5     X
D6     X
D7     =0

Режим нам побоку, главное - направление, а значит D4 для порта А, D1 для порта B и D3+D0 для порта С. При этом, D7 должен быть =1, т.к. есть режим побитного управления портом С. Нарисовалась следующая схема (картинка кликабельна):
Image
Полярность сигнала сброса совпадает у ВВ55 и АТ89С51, это хорошо. Так же, после сброса ВВ55 находится на входе, поэтому регистр (выполнен в виде 4х D-триггеров) устанавливается в 1. Ну а дальше, мы просто отслеживаем ситуацию, когда A0=A1=D7=1 и CS=WR=0. Сигнал WR одинаков у ВМ80 и Z80 - он стробирует во время устойчивых данных, поэтому хоть триггер и записывает при 0->1 на тактовом входе, данные все равно будут записаны (по спаду сигнала WR). Получается, 4 корпуса мелкосхем, 1 контроллер и ВВ55, которая может быть уже впаяна. Естественно, прямо все порты соединять не обязательно, только те, что используются в матрице. Саму мелкосхему так же можно запихать в какую-нибудь CPLD, но в данный момент важно чтобы было дешево и доступно.
Дополнительно, есть еще такая мысль. В нормальных условиях комп никогда не устанавливает все порты на выдачу, иначе катастрофа. А мы можем сделать так. И тогда, контроллер может отслеживать эту ситуацию как исключение и брать данные с портов. Например, для смены раскладки, зажигания лампочек или еще чего. Например, если все порты на выдачу, и при этом мы передаем данные через порт А, а через порт С стробируем (т.к. этот порт позволяет побитное управление).
Обсуждаем.


26 Jan 2009 00:55
Profile
Maniac
User avatar

Joined: 05 Oct 2006 07:45
Posts: 266
Location: Moscow
Reply with quote
Post 
А у спеца не было что-ли диодов на матрице и можно было сканировать матрицу в двух направлениях? И сканирующа линия должна была быть всегда одна?

_________________
Всем добра!


26 Jan 2009 04:54
Profile
Fanat

Joined: 10 Dec 2008 11:39
Posts: 89
Location: Белгород, Россия
Reply with quote
Post 
А может лучше не мудрить, а реализовать нормальный физический интерфейс PS/2 (событийный) и заменить подпрограммы чтения/сканирования клавиатуры? Тогда и клавиатуру можно будет использовать наиболее полно.
Перестанет работать с десяток программ, которые лезут напрямую к ВВ55 или сканируют клавиатуру напрямую, через порты - так это и не страшно, все равно эта кривизна имеет историческое, нежели практическое, значение.

_________________
С уважением, Сергей.


26 Jan 2009 08:20
Profile
Fanat

Joined: 21 Nov 2002 14:09
Posts: 88
Location: E-burg/Russia
Reply with quote
Post 
Error404 wrote:
А у спеца не было что-ли диодов на матрице и можно было сканировать матрицу в двух направлениях? И сканирующа линия должна была быть всегда одна?
Матрица 12*6 без диодов. Сканировать можно или по 6 строкам или по 12 столбцам, без разницы.
Для эмуляции контроллером это создает дополнительные трудности, но в принципе задача решаемая.


Last edited by Caro on 26 Jan 2009 09:10, edited 1 time in total.



26 Jan 2009 08:56
Profile WWW
Maniac
User avatar

Joined: 05 Nov 2007 08:08
Posts: 328
Location: Украина
Reply with quote
Post 
Quote:
Перестанет работать с десяток программ, которые лезут напрямую к ВВ55 или сканируют клавиатуру напрямую, через порты
экзотическое сканирование клавы на специалисте встречалось (по крайней мере мною) только в играх. хотя с другой стороны - ради каких программ тогда восстанавливать эти компы? :)


26 Jan 2009 09:04
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 16:41
Posts: 2155
Location: От туда
Reply with quote
Post 
shoorick wrote:
Quote:
Перестанет работать с десяток программ, которые лезут напрямую к ВВ55 или сканируют клавиатуру напрямую, через порты
экзотическое сканирование клавы на специалисте встречалось (по крайней мере мною) только в играх. хотя с другой стороны - ради каких программ тогда восстанавливать эти компы? :)

Вот именно, все должно работать в оригинале.


26 Jan 2009 11:19
Profile
Doomed

Joined: 26 May 2003 09:57
Posts: 598
Reply with quote
Post 
Насколько я помню, проблема была не в эмуляции ВВ55, а в быстрой смене выходных сигналов при смене входных (максимум 10 тактов при 2МГц - менее 5мкс). Тут скорее подойдёт статическое ОЗУ, медленно обновляемое контроллером.

Мне казалось, что проблему уже решили http://zx.pk.ru/showthread.php?t=9294

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


26 Jan 2009 14:06
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 16:41
Posts: 2155
Location: От туда
Reply with quote
Post 
b2m wrote:
Мне казалось, что проблему уже решили http://zx.pk.ru/showthread.php?t=9294

Неее... Это абсолютно не то. Это заточка под стандартный 8х7 (8х8) РК (он же Орион). Они не используют динамическое переключение направления. Там можно действительно просто подключить и не париться. А вот в Спеце такое не проканает. Я тут даже думал брутальный вариант: у меня есть мешок К176КТ1, и на них собрать (1 корпус - 4 ключа). 100% совместимость. %)

* * *

Давайте развивать тему.
Я думаю, что при правильном планировании времени, можно решить эту задачу. Например, какой самый жесткий вариант? Правильно, запись сканирующего сигнала в один порт и тут же чтение из другого(-их, это в случае со Спецом, при сканировании на 6 и чтении на 12). Известно, что М1 занимает 4 такта и на i8080 и на Z80, делаем вывод, что время между записью и чтением будет:
Code:
1234 123 1234 123
  O    W   O    R
O - Opcode
W - Write
R - Read

Т.е. 5-6 тактов, а затем надо выдать результат. В худшем случае со Спектрумом (3,5МГц) это будет 5*(1/3,5)=1,4мкс. Для той же ATMega при 16МГц это примерно 1,4/(1/16)=22 команды (я же верно понимаю, что AVR выполняет опкод каждый такт?). Поэтому, преобразование данных надо делать при записи. Т.е. юзаем 2 внешних интерупта: на чтение и на запись, при записи, отслеживаем куда и делаем табличный расчет (или быстрый математический) какие данные должны быть в регистрах чтения, согласно матрице нажатых клавиш. А при прерывании чтения тупо отдавать одну из 4х ячеек, хранящих значения порта. Работа с PS/2 настолько медленна, что она в принципе укладывается в фоновый опрос. В итоге, мы упираемся только в 1 тайминг: время реагирования на прерывание. И оба должны быть вычислены после начала на обращение (причем чтение несколько растянуто - есть время).
Теперь вопрос: каково типичное время реагирования на прерывание у разных быстрых чипов (AVR/PIC/etc..)?


26 Jan 2009 23:23
Profile
Doomed

Joined: 06 Oct 2006 06:17
Posts: 424
Location: г.Лянтор,Сургутского р-на,ХМАО
Reply with quote
Post 
HardWareMan правильной дорогой идет, только запись в порт/чтение из порта ВВ55 длиться всего 500 нс - успеваем опрашивать PS/2, перкодировать коды клавиатуры, отправить их в порт? Я если помните процедуру записи/чтения портов возложил на ПЛИС, коды хранил в ППЗУ, а опрашивал PS/2 ПИКом.
http://www.nedopc.org/nedopc/upload/8255Emul3.rar
Для операций с портами ВВ55 у меня не хватало времени реализовать их в ПИКе, я возложил их на ПЛИС. Алгоритм такой:
1. Отслеживаем обращение к ВВ55, типа прерывание по выводу /CS;
2. Если это посылка в порт байта сканирования, то по байту "бегущего нуля", номеру порта в ППЗУ находим байт ответа (появления) "бегущего нуля";
3. В фоновом режиме опрашиваем PS/2 клаву и если момент опроса совпал по времени с подготовленным байтом и еще и на пересечении нашлась имено та клавиша - выдаем байт в порт ответа ВВ55;
4. Биты не связанные с матрицей 12х6 клавиатуры (магнитофон, звук, клавиша SHIFT) принимаются/передаются напрямую.

P.S. Я как писал эмулятор только на бумаге (вернее плата уже есть), времени нет и первая цель сам Специалист MX New, а затем уже эмулятор ВВ55/эмулятор клавы...


27 Jan 2009 07:57
Profile WWW
Doomed

Joined: 26 May 2003 09:57
Posts: 598
Reply with quote
Post 
HardWareMan wrote:
у меня есть мешок К176КТ1, и на них собрать (1 корпус - 4 ключа). 100% совместимость. %)

А этот мешок не влезет в какую-нибудь ПЛИС?

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


27 Jan 2009 08:41
Profile WWW
Fanat

Joined: 21 Nov 2002 14:09
Posts: 88
Location: E-burg/Russia
Reply with quote
Post 
Посмотрел сейчас как в Мониторе Специалиста реализован опрос матрицы клавиатуры.
Для начала надо помнить что колонки матрицы сканируются 8-мю битами порта A, и 4-мя младшими битами пора C (3..0).
6 строк матрицы подключены к старшим (7..2) битам порта B.
Алгоритм интересный:
1) Порт A и 4-ре младших бита порта C включаются на чтение, а порт B на запись. При этом на выходе порта B выдаются все 0.
2a) Читается порт A и если в нем обнаруживается хотя бы один ноль (нажата одна из клавиш) то переходим к пункту 3.
2b) Читается порт C и если в нем обнаруживается хотя бы один ноль (нажата одна из клавиш) то переходим к пункту 3.
3) Порт B переключается на чтение, а порт A и младшие биты порта C на запись. При этом на выходах A и C(3..0) выдаются все 0.
4) Читается порт B и если обнаруживается хотя бы один 0 (нажата одна из клавиш) то по информации полученной в пунктах 2 и 4 вычмсляется код нажатой клавиши.
Времени между переключениями портов и чтением очень много, учитывая еще и то, что они реализованы процедурами.
Так что эмулировать такой алгоритм сканирования я думаю достаточно легко и не потрбует значительных ресурсов.
Надо будет глянуть, как сканируется клавиатура в играх.


27 Jan 2009 09:28
Profile WWW
Doomed

Joined: 06 Oct 2006 06:17
Posts: 424
Location: г.Лянтор,Сургутского р-на,ХМАО
Reply with quote
Post 
Caro wrote:
Посмотрел сейчас как в Мониторе Специалиста реализован опрос матрицы клавиатуры.
...

А сколько это занимает в тактах ВМ80 при условии,что клавиша нажата?


27 Jan 2009 09:38
Profile WWW
Maniac
User avatar

Joined: 05 Nov 2007 08:08
Posts: 328
Location: Украина
Reply with quote
Post 
Caro wrote:
Надо будет глянуть, как сканируется клавиатура в играх.
можно начинать с игры "Пещера" - там опрашивались целиком столбцы. т.е. в инструкции управление цифровыми клавишами, но реально можно было смещаться вниз, где было даже удобней играть. были игры, где опрашивались целиком строки, но я точно уже не помню какие :)


27 Jan 2009 09:49
Profile WWW
Fanat

Joined: 21 Nov 2002 14:09
Posts: 88
Location: E-burg/Russia
Reply with quote
Post 
fifan wrote:
А сколько это занимает в тактах ВМ80 при условии,что клавиша нажата?
Независимо от того, нажата она или нет, выполняется это в такой последовательности:
mov (PPI_Control),a ; запись байта в порт управления ВВ55
ret ; возврат из процедуры записи байта в порт управления
mov (PPI_A),a ;чтение порта подключенного к столбцу или строке матрицы.
Для Z80 команда ld(mov) выполняется за 13 тактов, а команда ret за 10.
Таким образом получаем не менее 23 тактов между изменением уровня входного сигнала и чтением его состояния.
Для тактовой частоты 2 Мгц это 11.5 мксек.


Last edited by Caro on 27 Jan 2009 10:47, edited 1 time in total.



27 Jan 2009 10:12
Profile WWW
Fanat

Joined: 21 Nov 2002 14:09
Posts: 88
Location: E-burg/Russia
Reply with quote
Post 
HardWareMan wrote:
каково типичное время реагирования на прерывание у разных быстрых чипов (AVR/PIC/etc..)?
Порядка 4..5 тактов.


27 Jan 2009 10:14
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 20 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.