Вместо введения:
Не помню, когда точно, но скорее всего это был 92-93й год. Мне было тогда 12-13 лет. Жили мы, как бы сказать, очень не очень. Нас было четверо детей, я из них самый старший. Отец — неработающий инвалид, а мама — единственная, кто тянул всю семью, работая с образованием 8 классов деревенской школы. Денег не то чтобы не хватало, а их ВООБЩЕ не было.
Но электроникой и компьютерами я уже тогда бредил. И вот в один прекрасный день у меня появился КОМПЬЮТЕР!!! Мама совершила какое-то чудо и вопреки всему купила мне его. Сказать, что я был рад — это все равно что ничего не сказать. Сейчас уже не помню точную модель, какой-то клон 48К Спектрума, но с 99% вероятностью это был «Ленинград». Вот так началось моё знакомство с компьютерами, играми и программированием.
Кстати, в само программирование меня подтолкнуло то, что в один прекрасный день мой Спектрум тупо перестал загружаться с магнитофона. Игры кончились, надо было что-то делать. Я взял в руки печатный справочник, который шел в комплекте, и начал набивать оттуда программки вручную. Некоторые были с ошибками — и это, кстати, огромный плюс! Приходилось включать мозги, разбираться в логике и эти ошибки исправлять. Вот так постепенно я освоил Бейсик, ну а потом догнал и ассемблер… и понеслось.
Так было до момента, пока мне не купили Денди. На долгие годы я забыл про Спектрум, ибо потом в руки мне попалась неисправная Сега, которую я смог отремонтировать! Тогда мне было лет шестнадцать, и моё инженерное эго после этого выросло примерно до размеров Вселенной (хотя неисправным там оказался всего лишь копеечный стабилизатор 7805 😊).
Дальше, уже в годы студенчества, у меня опять появился клон ZX 48. Не помню, честно говоря, какой, да и не суть. На нем я даже игру свою написал — «Сапера», полностью на ассемблере, со своим RLE-упаковщиком для заставки. Но это был недолгий возврат. Я тогда подкопил денег и купил свой первый нормальный ПК с 486-м процессором. Ну и, собственно, где-то года с 2002-го я Спектрума уже не касался.
Скриншоты моего сапера:
Воскрешение «Пентагона» из пепла
Все изменил случай. Как-то на моей предыдущей работе, где я был руководителем участка по ремонту электроники, среди кучи старых электронных плат-доноров я увидел плату с подозрительно знакомыми очертаниями. Нет, это был не «Ленинград», сие чудо было «Пентагоном-128» 1991 года. И тут внутри прямо что-то ёкнуло. Решил — восстановлю во что бы то ни стало!
При первом осмотре выяснилось, что на плату подали высокое напряжение. Судя по испарившимся дорожкам, туда прилетело все 220 вольт. Сгорело вообще всё. Не осталось ни одной исправной микросхемы.
И началась знатная эпопея с восстановлением. Какие-то микросхемы удавалось находить в залежах доноров, какие-то (например, ПЗУ и Z80) заказывал у друзей из Поднебесной. В общем, долго ли, коротко ли — «Пентагон» заработал! Не сразу, конечно. При восстановлении я и сам косячил, и… да в общем много чего было. Дошло даже до того, что я купил готовый конструктор «Пентагона» версии 2014 года на сайте kit8bit для самостоятельной сборки. Чисто чтобы под рукой был рабочий эталон, с которым можно визуально сравнивать сигналы. Короче, потихоньку восстановил я своего «Пентагона». Процесс его доводки идет до сих пор, но компьютер уже полностью работоспособен.
Вот как он выглядит сейчас:
Постановка задачи и рождение ТЗ
Ну и когда я впервые получил живой компьютер, который включается и работает, возникло первое неудобство — клавиатура. Родной-то нет. Решилось всё поначалу просто — небольшая платка, 40 тактовых кнопок, и вуаля. Но, думаю, предельно ясно, что играть на этом — то еще «удовольствие».
Поэтому на основе Ардуинки и аналогового коммутатора MT8816 была сделана небольшая плата, которая привязала нормальную клавиатуру PS/2 к «Пентагону». Но это решение было временным. Вообще, я не любитель плат Arduino, поэтому постепенно в моей голове оформилось полноценное ТЗ: нужна универсальная плата, которая могла бы опрашивать клавиатуру и одновременно два джойстика.
Джойстики были выбраны от Сеги. Что требовалось от устройства: во-первых, опрос клавиатуры и передача нажатий в «Пентагон». Во-вторых, одновременный опрос двух джойстиков, нажатия кнопок которых должны так же через MT8816 эмулировать нажатия кнопок. Опрос клавиатуры и джойстиков должен быть параллельным и не мешать друг другу. И самое главное — клавиши джойстиков можно переназначать, и настройки должны оставаться в памяти после выключения питания.
Скажу сразу: да, я знаю, что есть уже куча всяких готовых интерфейсных плат, но мне интересно сделать самому!
Аппаратная архитектура и плата расширения
В итоге всё вылилось в отдельное устройство. За основу взят МК ATmega8, OLED-дисплей 128х64 c I2C-интерфейсом, две микросхемы PCF8574 для опроса сеговских джойстиков и два сдвиговых регистра 74HC595 для передачи команд от МК к матрице ключей MT8816. Расширители портов PCF — это жизненно важная необходимость, без них бы точно не обошлось, так как под джойстики понадобилось бы слишком много ног процессора, которых у ATmega8 просто нет. А вот без сдвиговых регистров 595 как раз можно было бы обойтись. Одна из самых первых версий устройства отлично работала и без них. Но в итоге я решил их поставить чисто для того, чтобы плату было легче разводить, да и полно их у меня и стоят они копейки 😊
🛠 Маленький нюанс по поводу разъема Kempston
Внимательный инженер при взгляде на принципиальную схему моего контроллера спросит: «Зачем на плате выведен отдельный разъем Kempston, если в схеме есть матрица MT8816, симулирующая нажатия кнопок?»
Дело в том, что оригинальный «Пентагон-128» образца 1991 года из коробки не имел встроенного Kempston-интерфейса (там были только Sinclair-джойстики, дублирующие цифровые клавиши 6-0). Чтобы исправить это историческое недоразумение, я разработал для своего компьютера собственную плату расширения. Ну как разработал… Точнее будет сказать — собрал из нескольких разных проектов (в том числе и на основе реализации из Пентагона 2014 года) свою версию платы расширения.
На ней разместились процессор Z80, музыкальный сопроцессор AY-3-8910 и сам Kempston-адаптер на мелкой логике, который слушает системную шину и порт #1F (31 в десятичной системе). Поскольку Kempston-джойстик опрашивается процессором напрямую через шину данных D0…D4, транслировать его сигналы в стандартную матрицу клавиатуры не имеет физического смысла. Именно поэтому для него на плате контроллера выведен отдельный разъем.
Но самое интересное — как это реализовано аппаратно. Чтобы не плодить лишние транзисторные ключи, я задействовал свободные каналы всё той же микросхемы аналогового коммутатора MT8816! Она отлично справляется и с этой задачей: одна из её ножек жестко посажена на «землю» (GND), а выводы каналов уходят на этот разъем. При нажатии кнопки направления на сеговском паде ATmega8 просто дает команду MT8816, и та коммутирует нужную линию Kempston на землю. А дальше этот сигнал по шлейфу улетает прямиком на плату расширения к логике порта #1F.
Ну и вот собственно как бы сказать рабочий прототип контроллера:
Логика работы устройства и структура меню
При подаче питания первые пять секунд на экране высвечивается всякая полезная информация (что это за устройство, кто автор — vic80, и версия прошивки). Клавиатура и джойстики в это время уже вовсю работают.
Потом появляется информация о настройках джойстиков: номер джойстика и имя его пресета. Всего в памяти контроллера можно хранить двадцать пресетов. На каждый из джойстиков можно назначить любой из них. Далее уже можно конфигурировать джойстики под себя. Для перехода в режим конфигурации нажимаем клавишу F5. Появляется надпись JOY SETTINGS. Для выбора опции используем клавиши на самой клавитуре PS/2: Вверх, Вниз, Влево, Вправо. Переход на следующее подменю — ENTER.
Логика меню устроена так:
Для начала выбираем, что мы хотим: выбрать, либо конфигурировать пресет (SELECT/EDIT).
-
Если выбираем SELECT:
-
Далее выбираем номер джойстика для установки пресета (JOY 1 / JOY 2).
-
Далее выбираем номер пресета — на экране будут циклически появляться их номера и текстовые названия.
-
-
Если выбираем EDIT:
-
Редактирование имени пресета: Как только выбрали пресет, предлагается изменить его название. В нижней строчке появляется мигающий курсор. Менять название можно просто вводя его с клавиатуры, а можно листая стрелками Вверх/Вниз (изменяя текущий символ) и Влево/Вправо (изменяя положение курсора в строке). ENTER — окончание редактирования имени пресета и переход на следующее подменю.
-
Маппинг кнопок: В следующем подменю уже предлагается настроить конкретную кнопку геймпада. Да, кстати, совсем забыл упомянуть: программа полноценно работает с 6-кнопочным джойстиком, поэтому кнопок для редактирования будет предложено аж двенадцать (с учетом Start и Mode). Как программа будет работать с трехкнопочным джойстиком — сам не знаю, просто нечем проверить.
-
Двойной ввод: В этом подменю, листая кнопками управления, выбираем, какую кнопку в пресете хотим отредактировать. Допустим, выбираем key A. Кстати, на экране сразу же отображается, какая функция на эту кнопку уже возложена. Выбрали, нажимаем ENTER, и существующее значение начинает мигать. Ввод сделан хитро — либо нажатием на нужную клавишу на клавиатуре, либо листая стрелками Вверх/Вниз выбираем то значение, которое хотим привязать на данную кнопку джойстика. Зачем такой двойной выбор? Да просто потому, что нажатие направлений Кемпстона мы с обычной клавиатуры сымитировать не можем. Ну и, помимо этого, на кнопку пада можно назначить системные команды RESET и кнопку MAGIC. На самом деле это своего рода артефакт — в какой-то версии я убирал возможность выбора этих значений, но потом почему-то оставил… Даже не знаю зачем, пусть будет.
-
Технический нюанс: Капканы софта и защита EEPROM (BOD)
Поскольку память программ микроконтроллера оптимизирована до предела и занята на 96%, в коде нет функции автоматической инициализации EEPROM дефолтными значениями при первом включении — на это банально не хватило флеша. Поэтому все таблицы пресетов и имена для OLED-экрана хранятся в отдельном файле конфигурации.
В процессе отладки на реальном железе я столкнулся с классической проблемой старых AVR — при выключении питания Спектрума в памяти EEPROM периодически портились случайные байты. Причина физическая: при плавном разряде конденсаторов БП контроллер перед «смертью» сходил с ума и успевал выполнить случайный мусор вместо инструкций.
Решилось это активацией аппаратного детектора просадки напряжения (Brown-out Detector) на уровень 4.0V. И тут я наступил на легендарные грабли популярных графических оболочек вроде AVR8 Burn-O-Mat (GUI для avrdude) и eXtreme Burner, о которых хочу предостеречь всех, кто захочет повторить проект:
-
Перепутанные поля в Hex-редакторе: В программе Burn-O-Mat подписи полей hfuse и lfuse перепутаны местами! Из-за этого ручной ввод значений из даташита по текстовым меткам может намертво окирпичить чип. В то же время программа eXtreme Burner зеркально инвертирует биты при чтении/записи.
-
Ловушка тактирования: На вкладке Oscillator Options в Burn-O-Mat пункт «brown out detection enabled» принудительно сбрасывает биты SUT в 00. Для ATmega8 в связке с внешним кварцем это означает моментальное переключение в режим External Clock (внешний генератор). Контроллер засыпает и перестает отвечать по SPI. (Если вы так же попались — оживить чип можно, подав тактовый сигнал, например, с 6-й ножки CLK процессора Z80 самого Спектрума на 9-ю ногу ATmega8, либо воспользовавшись параллельным программатором вроде XGecu T48, который у меня, к счастью, есть).
Каноничные и безопасные фьюзы проекта для прямой прошивки через консоль avrdude напрямую:
-U lfuse:w:0xC1:m -U hfuse:w:0xFC:m
(Режим Slowly Rising Power, задержка запуска 64 мс для стабилизации питания и надежной раскачки кварца 16 МГц, плюс активный BOD 4.0V для железобетонной защиты памяти).
Для удобства я составил таблицу-шпаргалку под разный софт:
|
Метод прошивки / Программа |
Значение Low Fuse |
Значение High Fuse |
|
Каноничные биты (AVRDUDE / консоль напрямую) |
0xC1 |
0xFC (или 0xD0) |
|
eXtreme Burner — AVR (инвертированное чтение) |
0x3F |
0xC1 |
|
AVR8 Burn-O-Mat (перепутаны поля hfuse/lfuse) |
В поле hfuse: C1 |
В поле lfuse: 3F |
Ссылки на проект и файлы
Проект предоставляется полностью бесплатно для личного использования (DIY) по принципу «As Is» (Как есть). Скомпилированная прошивка монолитна и полностью готова к работе, но сам исходный код Си закрыт и публиковаться не будет — это мое осознанное решение как автора, прошу отнестись к этому с пониманием. Если шаришь в коде — разрабатывай сам, а мой продукт, будь добр, не трогай 😊
Все файлы, схемы в PDF/PNG, готовый Gerber-архив платы в ZIP-формате для заказа на заводе, а также файлы прошивки (.hex для Flash и обязательный стартовый .eep для EEPROM) я выложил в свой репозиторий:
👉 Ссылка на GitHub: https://github.com/vic80-designs/vic80_zx_keyboard
Буду рад ответить на технические вопросы по схемотехнике в комментариях!
ссылка на оригинал статьи https://habr.com/ru/articles/1046011/