ZX-Spectrum PS/2 Keyboard

Подключение PS/2 или USB(ps/2 совместимой) клавиатуры к ZX-Spectrum

 Текущая версия 5.5

В процессе модернизации своего ZX-Spectrum каждый постепенно приходит к тому, что у него перестают работать некоторые кнопки на стандартной клавиатуре, это может быть вызвано различными факторами. Например, перетерлись дорожки пленочной клавиатуры в местах стыковки её с платой или появились микротрещины на пленке самой клавиатуры.

Да и сама по себе ZX клавиатура весьма неудобна, и лучше бы её заменить на более современную, благо теперь вы можете совершенно без труда это сделать.

В поисках по интернету я находил много вариантов данного решения, но везде была куча обвязки у микроконтроллеров, да и сами микроконтроллеры были такими, которые либо трудно достать, либо они достаточно дорогие.

Вы уже наверное заметили моё пристрастие к МК Atmega 8 ? 🙂 Собственно на нем бы и хотелось всё это реализовать с минимальной обвязкой, а еще лучше совсем без неё.

В интернете я наткнулся на очень интересную реализацию данного решения, собственно вот здесь

покопавшись в архивах с прошивками я нашел прошивку под Atmega8, но, она почему-то не заработала… 🙁

Долго, очень долго я пытался её запустить, но ничего не получалось, при этом под Atmega48 и 168 всё было хорошо (по словам тех кто их подключал).

В итоге, я решил дизассемблировать прошивку от Atmega8 и Atmega168, порывшись в даташитах, я обнаружил, что в Atmega8 перепутаны некоторые порты (видимо прошивка делалась до кучи и не проверялась), так же для регистра TIFR пришлось переписать часть кода, т.к. его номер 0x58 и он недоступен для команд sbis и cbis. Ковыряясь дальше, я обнаружил, что на одном из входов шины адреса не был включен PullUp из-за чего в приведенной схеме автору пришлось поставить подтягивающие резисторы на все адресные пины. Проанализировав схему, я убрал подтягивающие резисторы с CLK и DATA выходов, т.к. они есть в самой клавиатуре (по заверению производителей). Так же убрал светодиод, т.к. он всё-равно внутри и некому им любоваться 🙂 Подправил работу дополнительных кнопок.

В итоге, прошивка заработала с кварцем 24МГц, причем очень даже отлично! Лучше чем родная клавиатура!

PS: так же я удалил из прошивки работу с клавиатурными скриптами, они мне не нужны, да и вообще мало кому нужны, это позволило еще больше ускорить реакцию на нажатия клавиш. В версии 2.0 удалось избавиться от самопроизвольных нажатий на кнопки BTN1, BTN2 при инициализации контроллера.

Во общем, теперь собственно о реализации.

Прошивка

Скачать прошивку (версия 2) для Atmega8 и кварца 24МГц вы можете >>>тут<<<

Версия 3 (24.01.2016) >>>тут<<<

Новая улучшенная версия 4 (26.01.2016) >>>тут<<<

 

Новая улучшенная версия 5.5  с исходниками (03.02.2016)

kbd_firmware_v5_5_m8_with_src (для ATMega8) не нужны конденсаторы на кварц

kbd_firmware_v5_5_m48_with_src (для ATMega48)

kbd_firmware_v5_5_m168p_with_src (для ATMega168p)

kbd_firmware_v5_5_m328p_with_src (для ATMega328p)

 

С версии 5.3 отключение NumLock переводит курсорные клавиши и пробел в режим Sinclair джойстика, а так же автоматически включается режим E перед нажатием клавиш {}[]~

 

Загружается стандартно с помощью avrdude и USBASP

avrdude -p atmega8 -c USBasp -U flash:w:KBD13_M8_nw_MODIFIEDv4.hex -U lfuse:w:0xCF:m -U hfuse:w:0xC7:m

Подключение

kbd_atmega8

Я подключил все пины напрямую к ZX-Spectrum, вроде всё работает хорошо, но можно для большей стабильности повесить резистор 10 КОм на (RESET) подключив резистор к VCC.

Конденсаторы на кристалл можно не вешать, т.к. включен фьюз CKOPT.

Минус питания можно подключать как к 8 пину, так и к 22, т.к. они запараллелены в МК. Так же можно брать плюс питания с 20-ой ноги для подключения других микросхем, очень удобно 🙂

 Примерная схема подключения:

Распиновки клавиатурных разъемов

usb_ps2 Pinout PS2 - USB

Если есть вопросы, пишите в комментариях.

PPS: выходы BTN1 и BTN2 можно подключать к любым кнопкам типа /RES (т.е. которые замыкаются на землю GND) в своем кворум-бк04 я подключил на них INV и кнопку которая делает тише звук.

36 Комментарии “ZX-Spectrum PS/2 Keyboard

  1. Данная схема работает на обычном спектруме. Но на турбированном работают только кнопки F11, F12, SysRq.
    Я правильно понимаю, что атмега просто не успевает поймать биты опроса клавиатуры со стороны спектрума?
    Можно ли это как-то исправить программно?

  2. К сожалению, я не являюсь автором данной прошивки, но беглый просмотр кода говорит, что обработка шины ведется в INT0_Handler, т.е. с порта D читаются биты адреса + 1 бит адреса берется с порта C, получив адрес, из таблицы берется значение и шлется в шину данных (порт B).
    Так как у вас клавиши не работают совсем (даже нет мусора), то здесь возможны 2 проблемы
    1) атмега не успевает считать/записать данные на шину и требуется задействовать WAIT (можно повесить на B.5 и поместить дерганье этого сигнала в INT0_Handler)
    2) сама атмега тормозит с кристаллом 24МГц, попробуйте заменить на другую, возможно проблема именно в чипе.

  3. Подумав еще немножко, могу сказать следующее

    1. Раз кнопки F11, F12… работают, значит опрос самой клавиатуры ps/2 происходит нормально и аппаратные прерывания от ZX не забивают таймер.
    2. Раз другие кнопки не работают совсем, значит аппаратные прерывания, хоть и работают, но не успевают выставить нужный бит на порту вывода или вообще переключиться в режим вывода, а, возможно, и не срабатывает считывание по /RDFE.

    INT0_Handler:
    in YL,PinD ; PinD -> YL получаем данные с шины адреса
    sbic PinC,0x03 ; if (PinC.3=0) skip next line (IF KA10=0)
    ori YL,0x04 ; YL or 4 (1->YL.2) добавляем недостающий бит с порта C

    ; [Y] -> r20 // берем данные из таблицы и шлем в порт B
    ldd r20,Y+0x00
    out PortB,r20 ; r20 -> PortB

    LOOP0: // держим шину данных пока /RDFE=0
    sbis PinD,0x02 ;if PinD.2=1 skip rjmp
    rjmp LOOP0

    // выставляем единицы на порту B (на шине данных все единицы)
    out PortB,CONSTFF ; 0xFF -> PortB
    reti

    Если по коду, то в YL мы получили состояние шины адреса для опроса клавиатуры, затем, из таблицы, подготовленной в таймере, получили значение для отправки в шину данных в регистр r20, который отправляем в порт B и ждем пока /RDFE не станет 0.
    Вот, где-то в этом промежутке отправки данных и выставления единиц на шине данных может быть проблема, но, чтобы понять более конкретно, нужно проверить на конкретном примере.
    К сожалению, у меня турбированного варианта нет, поэтому я оставляю это для тех у кого есть такая возможность.

  4. Еще, можно попробовать
    // set INT0
    ldi r18,0x0A ;falling edge
    поменять на rising edge, но, не знаю, поможет это или нет
    поменять нужно на
    ldi r18,0x0F ;int0/1 rising edge

    PS: если будут успехи, сообщите, пожалуйста.

  5. Увы, не помогло. Видно Атмега8 не успевает обрабатывать сигнал на такой скорости. Сейчас жду Атмегу48, попробую по этой же упрощённой схеме залить для неё прошивку и проверить, успеет ли она.

    1. Yes, it is for ZX-Spectrum, address pins on PD0,PD1,PD3-PD7,PC3, data (column) pins on PB0-PB4, PD2 is for keyboard port switching /RDFE (reading from port #FE signal). If you mean ZX-Spectrum with ULA chip, you need to add additional IC for decoding port #FE, bacause decoder is in ULA and we don’t have access inside 🙁

  6. Не могу запустить на желтом скорпионе( F11, F12, PrintScreen — работают, а вот все остальное — нет. Использую Atmega8 и 24МГц кварц, прошивка Версии 5.5. Сигнал /RDFE подключаю к КП11 на 15 ногу, он на схеме обозначен /CSK (там стоит две КП11 для сигналов KL0-KL4) Прошу хоть какой-то помощи в подключении.

  7. я тоже сделал устройство для подключения PS/2 клавиатуры на ATmega168, работающей на частоте 20MHz. Порт D подключен к KA8..KA15, порт B — KD0..KD4. По прерываниям происходит чтение скан кода от клавиатуры, а вот читать линии адреса KAn и управлять линиями KDn по прерываниям микроконтроллер уже не успевает, поэтом пришлось сделать поллинг в очень коротком основном цикле. Все работает, но полагаю, что реализация подключения на микроконтроллере принципиально не верна )) — для иммитации оригинальной кнопочной клавиатуры правильнее использовать CPLD в сочетании с микроконтроллером. Такой проект уже есть http://microsin.net/adminstuff/hardware/yet-another-sinclair-spectrum-at-keyboard-interface.html , и я в рамках освоения технологии применения CPLD планирую создать нечто подобное, но с расширением: например, включить в CPLD логику управления выбора ПЗУ Спектрума…

    1. Схема с CPLD однозначно будет на 100% иммитировать оригинальную клавиатуру и подключаться 13-тью проводками к Спектруму. Чипы MAX3064A уже заказал и жду ))

        1. Да, EPM3064ATC44 в Чип и Дипе стоит 240р. за штуку, а на Aliexpress — 70р., (20шт. за 1400р)… Сложность схемы возрастает незначительно, но можно сэкономить на микроконтроллере — взять попроще. Так что с CPLD возрастает сложность — но плюсом будет корректность работы. Сделаю для себя — обязательно поделюсь с заинтересованными лицами ))

    1. Может МК на данной частоте работает нестабильно (зашунтируйте кварц атмеги сопротивлением на 2-3МОм), или шина данных не стабильна, тут тогда нужно ставить диоды как в оригинальной схеме.

    1. Собрал устройство на макетной плате. Освоил Verilog, написал прошивку для CPLD, отлажу — и все буде готово. Останется только нарисовать схему в PCAD и развести там же плату. Плата ATmega+CPLD предполагается быть универсальной, так что мне она нужна не только для спектрумовской клавиатуры.

  8. Здесь ссылка на проект https://github.com/leonid-z/zxkeyboard
    Вчера закончил работу с макетом, прошивкой для CPLD и программой для микроконтроллера. Все работает как задумывалось.
    Буду рисовать схему, разводить и заказывать платы.
    Хотя появилась следующая задумка: PS/2 клавиатура — хорошо, а USB — лучше! В результате заказал на Aliexpress платку с SL811 — USB хост контроллером.
    P.S. Интересно — кому-нибудь такие адаптеры нужны?

    1. Очень интересный проект! Хотелось бы иметь такую разведенную платку для CPLD, можно даже пока только под PS/2. Буду следить за гитхабом.

  9. Доброго дня! Я прикупил контроллер, о котором идет речь на форуме zx-pk, но там вместо atmega48 стоит atmega8, ребята подсказали, что в этом случае лучше всего использовать вашу схему. Нет ли где-то печатной платы вашего контроллера? Я сам не смогу сделать чертеж монтажки по схеме.

  10. Privet Vsem!
    V nachale goda sdelal ya ZX97 (klon ZX81). Prilogil k nemy TZXDuino. Neskol’ko foto zdes’ — https://imgur.com/a/kYP2Q
    Potom reshil dobavit klavyaturu PS2. Nashol v internete ssylki k proektu ZX Spectrum PS2 keyboard. U menya ne bylo otdel’nogo kontrollera ATMega328P no imel Arduino Pro Mini 16MHZ s nim. Zaprogrammiroval, podklyuchil — no i PS2 ne rabotaet :/.Oshibok v montage net.
    Ya smotryu shemu ZX81 i ZX Spectrum i tak dumayu, chto klavyatury u nih odinakovye i opros toge.
    U menya est vopros: ya horosho dumayu ili net? Nado mne iskat’ samyy kontroller ATMega na vysshuyu chastotu ili ya oshibayus i nado mne brosit’ eto delo?
    Pozdrvlyayu vseh — Tadeusz.

    1. Судя по схеме ZX97 работа с клавиатурой ведется аналогично ZX-Spectrum, поэтому данный проект должен работать.
      16MHz это мало для нормальной работы контроллера, нужно минимум 24MHz

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *