ZX-Spectrum PS/2 Keyboard

How to connect USB or PS/2 keyboard to ZX-Spectum

This method using Atmega8 AVR for connecting PS/2 or USB(ps/2 compatible) keyboard to ZX-Spectum.

You should use 24MHz crystal oscillator with it.

 

Firmware

This firmware (version 2) is for Atmega8 with 24MHz crystal oscillator Download

Version 3 (24.01.2016) Download

Version 4 (26.01.2016) Download

 

NEW! Version 5.5 with sources (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)

 

Starting from version 5.3 firmware has new NumLock functions (cursor keys and space acts as Sinclair Joystik), auto switching to E mode for keys [,{,},],~

 

 

Upload it using avrdude

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

 

Connection

It is direct connection to ZX-Spectrum keyboard slot

 

kbd_atmega8

Circuit exampe

 

 

Some usefull info on connectors

Pinout PS2 - USB usb_ps2

24 thoughts on “ZX-Spectrum PS/2 Keyboard

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

  2. Да, именно так, скорее всего программно исправить можно, поправив тайминги опроса. F11, F12 работают т.к. они не участвуют в опросе, а замыкают контакты напрямую.

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

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

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

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

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

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

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

  8. Поделитесь потом успехами, 48-ая возможно и заработает, т.к. там больше портов, т.е. нет необходимости объединять биты с шины адреса.

  9. В версии 3 ускорена обработка прерываний /RDFE, поэтому возможно клавиатура заработает и в турбо режиме, если у кого-то заработала, сообщите, пожалуйста.

    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 🙁

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

  11. я тоже сделал устройство для подключения 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. С CPLD конечно вариант лучше, но дороже и сложнее, тут же решение требующее минимум усилий для повторения 🙂 хотя не на всех моделях будет работать.

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

  12. Собрал, все работает. Но иногда нажатие любой кнопки вызывает RESET. Не знаете что можно сделать, что бы этого не происходило,?

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

  13. Доброго времени суток всем!
    Получилось на EPM3064ATC44 сделать? Если да поделитесь пожалуйста со схемой и прошивкой.

Leave a Reply

Your email address will not be published. Required fields are marked *