Клавиатура zx spectrum plus 48k вместо мембраны
В процессе модернизации своего ZX-Spectrum каждый постепенно приходит к тому, что у него перестают работать некоторые кнопки на стандартной клавиатуре, это может быть вызвано различными факторами. Например, перетерлись дорожки пленочной клавиатуры в местах стыковки её с платой или появились микротрещины на пленке самой клавиатуры.
Да и сама по себе ZX клавиатура весьма неудобна, и лучше бы её заменить на более современную, благо теперь вы можете совершенно без труда это сделать.
В поисках по интернету я находил много вариантов данного решения, но везде была куча обвязки у микроконтроллеров, да и сами микроконтроллеры были такими, которые либо трудно достать, либо они достаточно дорогие.
Вы уже наверное заметили моё пристрастие к МК Atmega 8 ? 🙂 Собственно на нем бы и хотелось всё это реализовать с минимальной обвязкой, а еще лучше совсем без неё.
В интернете я наткнулся на очень интересную реализацию данного решения, собственно вот здесь
Долго, очень долго я пытался её запустить, но ничего не получалось, при этом под Atmega48 и 168 всё было хорошо (по словам тех кто их подключал).
В итоге, я решил дизассемблировать прошивку от Atmega8 и Atmega168, порывшись в даташитах, я обнаружил, что в Atmega8 перепутаны некоторые порты (видимо прошивка делалась до кучи и не проверялась), так же для регистра TIFR пришлось переписать часть кода, т.к. его номер 0x58 и он недоступен для команд sbis и cbis. Ковыряясь дальше, я обнаружил, что на одном из входов шины адреса не был включен PullUp из-за чего в приведенной схеме автору пришлось поставить подтягивающие резисторы на все адресные пины. Проанализировав схему, я убрал подтягивающие резисторы с CLK и DATA выходов, т.к. они есть в самой клавиатуре (по заверению производителей). Так же убрал светодиод, т.к. он всё-равно внутри и некому им любоваться 🙂 Подправил работу дополнительных кнопок.
В итоге, прошивка заработала с кварцем 24МГц, причем очень даже отлично! Лучше чем родная клавиатура!
PS: так же я удалил из прошивки работу с клавиатурными скриптами, они мне не нужны, да и вообще мало кому нужны, это позволило еще больше ускорить реакцию на нажатия клавиш. В версии 2.0 удалось избавиться от самопроизвольных нажатий на кнопки BTN1, BTN2 при инициализации контроллера.
Во общем, теперь собственно о реализации.
Новая улучшенная версия 4 (26.01.2016) >>>тут<<<
Новая улучшенная версия 5.5 с исходниками (03.02.2016)
kbd_firmware_v5_5_m8_with_src (для ATMega8) не нужны конденсаторы на кварц
С версии 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
Я подключил все пины напрямую к ZX-Spectrum, вроде всё работает хорошо, но можно для большей стабильности повесить резистор 10 КОм на (RESET) подключив резистор к VCC.
Конденсаторы на кристалл можно не вешать, т.к. включен фьюз CKOPT.
Минус питания можно подключать как к 8 пину, так и к 22, т.к. они запараллелены в МК. Так же можно брать плюс питания с 20-ой ноги для подключения других микросхем, очень удобно 🙂
Примерная схема подключения:
Распиновки клавиатурных разъемов
Если есть вопросы, пишите в комментариях.
PPS: выходы BTN1 и BTN2 можно подключать к любым кнопкам типа /RES (т.е. которые замыкаются на землю GND) в своем кворум-бк04 я подключил на них INV и кнопку которая делает тише звук.
61 thoughts to “ZX-Spectrum PS/2 Keyboard”
Здравствуйте. RDFE это куда подключается?
К порту клавиатуры, если он разведен, если нет, то сделать самостоятельно, по схеме из практически любого клона ZX
У меня схема пентагон 128 от.2014 года, брал плату у Tetroid. Там на общей гребёнке есть контакт KEY SELECT, прокурив схему, пришел к выводу, что это оно. Подключил. Не работает. Делал на arduino nano с 328 мегой на борту, кварц 16 Мгц. Не работает. Клавиатура моргает всеми светодиодами и тишина.
К сожалению, я не являюсь автором данной прошивки, но беглый просмотр кода говорит, что обработка шины ведется в INT0_Handler, т.е. с порта D читаются биты адреса + 1 бит адреса берется с порта C, получив адрес, из таблицы берется значение и шлется в шину данных (порт B).
Так как у вас клавиши не работают совсем (даже нет мусора), то здесь возможны 2 проблемы
1) атмега не успевает считать/записать данные на шину и требуется задействовать WAIT (можно повесить на B.5 и поместить дерганье этого сигнала в INT0_Handler)
2) сама атмега тормозит с кристаллом 24МГц, попробуйте заменить на другую, возможно проблема именно в чипе.
Подумав еще немножко, могу сказать следующее
; [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.
Вот, где-то в этом промежутке отправки данных и выставления единиц на шине данных может быть проблема, но, чтобы понять более конкретно, нужно проверить на конкретном примере.
К сожалению, у меня турбированного варианта нет, поэтому я оставляю это для тех у кого есть такая возможность.
Еще, можно попробовать
// set INT0
ldi r18,0x0A ;falling edge
поменять на rising edge, но, не знаю, поможет это или нет
поменять нужно на
ldi r18,0x0F ;int0/1 rising edge
PS: если будут успехи, сообщите, пожалуйста.
Увы, не помогло. Видно Атмега8 не успевает обрабатывать сигнал на такой скорости. Сейчас жду Атмегу48, попробую по этой же упрощённой схеме залить для неё прошивку и проверить, успеет ли она.
Читайте также: