IBM PC XT собственной конструкции
2 поста
Продолжаем. Первая часть здесь.
VGA.
Пришло время делать полноценную видеокарту. Как я уже писал выше, в начальном плане было сделать минимальную конфигурацию 640х480 с какой-то одной глубиной цвета. Однако, погружение в эту тему привело к понимаю того, что делать минимальную карту не очень логично. Дело в том, что настоящая VGA карта поддерживала целый пакет различных видеорежимов (что-то около 16) и могла налету переключаться между ними. На практике отсутствие такой возможности привело бы к тому, что очень много программ не смогли бы нормально работать.
Пришлось изучить конструкцию оригинальной карты. Эта схема тоже легко находится в Интернете в виде подробного pdf-файла. Там все довольно сложно. По сути, второй компьютер. Было бы странно надеяться, что я смогу как-то оптимизировать и упростить схему после десятилетий работы над ней множества инженеров.
Оставалось два варианта: использовать какую-то ПЛИС, чтобы синтезировать все в ней, или применить один из видеоконтроллеров, на которых строились видеокарты где-то в 90-х годах. Я выбрал второй вариант.
Лучшим кандидатом для применения показался TVGA9000i. У Сергея Киселева имеется уже проверенная очень популярная реализация под этот видеоконтроллер. Поэтому я знал, что если у меня что-то и не получится, то только из-за кривизны рук.
На первом этапе как обычно нужно было купить комплектующие. Я потратил какое-то время на изучение вопроса и пришел к выводу, что проще всего купить готовую видеокарту и получить весь комплект запчастей сразу. Их довольно активно продают на разных барахолках. Все БУшные разумеется. Есть конечно риск, что будет что-то неисправно, но такой риск есть всегда. Все микросхемы уже давно не производят и новых почти нет.
Вариантов покупки видеокарты есть масса, я в итоге купил за примерно 600 рублей + пересылка, что мне кажется довольно удачно. Приехал вот такая карта:
Видны следы активной эксплуатации и немного ржавчины.
Был конечно соблазн просто припаять ее как есть, но получилось бы очень некрасиво без разъема. Да и план был другой. В общем, взял фен и паяльник и разобрал почти полностью.
Для переноса на мою материнку следовало решить главную проблему: как припаять видеоконтроллер? Обычно для таких микросхем используют всякие переходники DIP – QFP, но найти такой на 160 ног мне не удалось.
Пришлось рисовать проект печатной платы и заказывать изготовление у китайцев. Вышло дороже чем сама микросхема, но вариантов не оставалось. По одной их не делают, прислали сразу 5 штук. Дальше пара вечеров и на материнке появилась видеокарта:
Что касается самой схемы, то тут тоже есть немного адаптации. Прежде всего, традиционно для всей конструкции удален ROM. Код драйвера загружается как все предыдущие в оперативную память при старте из STC.
Тут не обошлось без особенностей. Дело в том, что этот видеоконтроллер универсальный. Поддерживает 8- и 16-битные системы. Поэтому у него очень экзотическое подключение ROM. Микросхема ROM находится для процессора как бы за видеочипом, который выполняет для нее роль буфера и перекоммутирует выводы на 8- и 16-битный вариант разъема. А сам код размещен в микросхеме ROM так, чтобы оптимизировать этот процесс. Если кратко, то все четные и нечетные байты кода размещены не по порядку, а в разных страницах памяти. Соответственно, чтобы переселить этот код в RAM, пришлось пересобрать его, т.е. расположить байты по порядку. Я использовал код ROM от Сергея Киселева, чтобы быть уверенным, что он запустится на XT. Хотя на многих форумах написано, что у него используется обычное ROM как от заводской карты. Сама схема к Сергею имеет мало отношения. Подключение скорее стандартное по даташиту для варианта без собственного ROM.
Еще пришлось добавить кварцевый генератор на 14.31818 МГц. Это стандартный сигнал OSC разъема ISA – основной тактовый сигнал всей системы, от которого я отказался, чтобы ускорить процессор. Но здесь он используется для синтезирования различных частот.
При первой попытке карта вообще не завелась. Через пару дней я догадался прогреть феном все контакты и картинка появилась. Но очень печальная. Вот такая:
На решение этой проблемы ушла еще пара дней. Изображение пошло, но символы были очень сильно искажены. Можно даже сказать разрушены, хотя атрибуты (цвет и т.п.) шли нормально. После некоторых экспериментов я понял, что нормально работают простые видеорежимы типа MDA или CGA, а VGA рассыпается. Все дело в интенсивной работе с памятью. Фактически я уперся в предел для навесного монтажа. Сигналы RAS/CAS не могли нормально дойти до памяти. Я переложил прочие жгуты подальше от памяти, чтобы было меньше помех, а для сигналов RAS/CAS сделал две коротких витых пары и пропустил сигналы по ним. Это, если кому-то непонятно, специальные сигналы для передачи адреса в память. Они по сути имеют частоту выше всех прочих. Стало отлично. Вот так получилось:
Что особенно радует – это удивительно чистая картинка. Словно это настоящий ПК с настоящей видеокартой. Никогда еще мои самоделки не давали такой результат.
Из плохих новостей – компьютер перестал быть стабильным. Загружался даже не через раз, один раз из десяти наверно. И глючил при запуске программ. Но достаточно было вынуть CF-карту и все начинало работать. Другими словами, шина данных была перегружена потребителями.
Я добавил второй буфер на шину данных (74HC245N) и второй буфер на шину адреса, который сделал из трех 74HC245N, работающих в прозрачном режиме.
После того, как все было сделано примерно как задумано в IBM, видеокарта совсем плохо стала работать.
Снова изучение осциллограмм и вывод: Неправильные буферы каким-то чудом компенсировали другую проблему. Оказалось, что разгон CPU привел к тому, что он просто проскакивал мимо сигнала готовности видеокарты. Когда Trident при чтении видеопамяти снимал сигнал готовности, чтобы CPU подождал данные, CPU уже пролетал ту фазу, на которой он проверяет этот сигнал. В результате задержка игнорировалась, видеокарта еще не отдавала байт на шину данных, и CPU читал резисторы подтяжки – FF.
Пришлось делать контроллер, который синхронизирует шину и процессор. Точнее синтезировать его в EPM3064, о которой будет рассказано в следующей главе. Для стабильной работы потребовалось сделать паузу на пять тактов. Компьютер начал работать нормально.
Загрузил его первым сложным тестом – знаменитый Принц Персии. На максималках.
USB
В поисках ответов на разные вопросы в Интернете, я наткнулся на интересный модуль для XT.
Это самый настоящий адаптер для USB-флешек. Конечно, в начале 80-х ничего подобного не существовало даже в проекте, но почему бы не добавить эту удобную штуку? Однако, они продаются по какой-то безумной цене в районе 2,5 тыс, что совершенно отбивает желание покупать. Сердцем модуля является CH375, который можно купить на макетной плате всего за 150 рублей с доставкой:
Разница двух модулей по сути только в том, что нет разъема ISA с буфером и декодера портов, чтобы XT мог общаться с модулем. И нет ROM, панельку которого видно на картинке. Но эта ROM требуется только чтобы обеспечить возможность загрузки системы с флешки. Для простой работы с флешкой как с переносным носителем информации драйвер можно разместить как обычно в sys-файле и загружать его вместе с DOS.
В оригинальном модуле декодер реализован в бюджетной ПЛИС ATF16V8. Такой у меня не было, и программатора тогда не было тоже, поэтому я заменил ее на EPM3064, которая уже упоминалась в предыдущем разделе. Она значительно более мощная. Поэтому кроме поддержки USB в нее можно перенести часть мелкой логики от других узлов – к этому моменту место на материнской плате начало заканчиваться. Кроме того, пришлось переделать разъем IDE под HDD, чтобы освободить место, которое переходник закрывал собой. Раньше я хотел сделать его так, чтобы CF-карту можно было легко вынуть и использовать как флешку, но теперь это стало неактуально и можно было освободить пространство под картой.
Микросхема буфера данных расположена под модулем, не видно на картинке.
Получилось вот так:
Модуль USB запустился удивительно сразу без отладки. Пришлось только разобраться в синтаксисе файла config.sys, который подключает драйвера к MS-DOS. В системе появился диск D. А вот с самой флешкой пришлось повозиться. MS-DOS не умеет работать с большими накопителями. Даже самая маленькая моя флешка на 8 Гбайт – это слишком много для FAT16. В итоге получилась флешка на 512 МБ, которая отлично читается в XT. 7,5 ГБ осталось в тени.
Вообще, флешка получилась заметно тормознутой. Тестовый файл размером 650 кБ читается или записывается ровно одну минуту. Получается, скорость флешки всего около 10 кБ/сек, хотя в теории должно было получиться примерно в 5-6 раз быстрее.
С флешки удалось запустить знаменитый Wolfenstein 3D. Вообще, игра просит для VGA 286 процессор и не запускается. А в версии для CGA на экране почти ничего не разобрать.
Однако, житель Интернета по имени @kingcrimson234 поправил исходный код игры так, чтобы она не требовала 286-й процессор. По его словам изменения были крайне незначительными. С его правками Wolfenstein запустился полноценно в VGA.
Играть с FPS в районе 1 – 2 все равно почти невозможно. Но забавно это видеть.
Ну и мой любимый Retal. Когда-то эта игра была у меня на дискетке всегда с собой. Я играл в нее в институте, в компьютерном классе кафедры на 286-х ПК. В прошлый раз это было в 1994 году. И вот теперь опять. Работает, кстати отлично, без тормозов. В самом начале, когда я только все планировал, я именно эту игру хотел увидеть как конечную цель. Получилось.
COM-порт.
COM-порта в начальном плане не было. Я не смог придумать, что в него подключать, поэтому и не стал конструировать. Однако, когда проект зашел достаточно далеко, мне захотелось иметь мышку. Стандартный аксессуар для любого нормального компьютера. А в годы зарождения ПК мышки подключались обычно через COM-порт.
Первая проблема тут – это сама мышка. Конечно, есть варианты всяких конверторов, превращающих современную USB-мышь в старинную, а еще можно было заморочиться и сделать эмуляцию через тот же контроллер клавиатуры (ESP32) и использовать bluetooth’ную мышку. Но решил пойти по классике.
Прежде всего, удалось купить новенькую настоящую COM-мышку с шариком. Нашел в одном единственном магазине на Яндексе. Видимо товар совершенно не ходовой. Когда достал ее из упаковки – чуть не прослезился. Ровно такие же мышки я гонял по коврикам 30 лет назад.
С контроллером порта вышло сложнее. Вообще, это не особенно сложное устройство. Существует несколько вариантов микросхем, которые реализуют полный функционал. Я приобрел 16С550 в dip корпусе на 40 выводов. Этот чип полностью обеспечивает всю работу интерфейса RS-232 в смысле логики, но вот дальше сложнее. Нельзя просто использовать RXD и TXD соединив их проводками с разъемом по типу UART’a. В RS-232 двуполярные сигналы. Конкретно в XT были уровни +-12 вольт. Между контроллером и разъемом стоял буфер, который брал эти напряжения с разъема ISA (т.е. по сути с блока питания XT) и модулировал их сигналами контроллера. У того же Сергея Киселева для com-порта используется буфер GD75232 или аналогичный, к которому нужно подключать +- 12 вольт. У меня же в схеме есть только +5 вольт.
Пришлось погружаться в теорию устройства мышек наших предков. Как оказалось, питание для мозгов мышки берется из сигнальных линий. Точнее с линии TXD, которая должна быть в логической единице RS-232, а это -12 Вольт. Этот сигнал подключен к земле мышки, а ее плюс – это земля компьютера.
Т.к. для питания мышки по даташиту от ее чипа нужны просто 5 Вольт, то я их подал прямо на разъем в нужной полярности вместо сигнала TXD. Осталось два сигнала RTS и RXD. Первый делает сброс мышки, а по второму она асинхронно выкидывает байты о своем перемещении. Их только нужно инвертировать оба и можно подключать к контроллеру COM-порта. Никакие буферы напряжений в таком варианте не нужны. А на плате как раз были два свободных инвертора.
Так и сделал, все сразу заработало. С драйвером проблем не возникло. Получился конечно не совсем COM-порт, а скорее разъем для комовской мышки, но это в общем-то и было целью.
Вот так, если кто-то не знал, выглядит курсор мышки в DOSе, точнее в файл-мененджере. Полупрозрачный оранжевый прямоугольник.
В остальном мышка работает как обычно в Windows. Чувствительность довольно хорошая хотя и без коврика. Никаких тормозов не ощущается.
UMB
UMB - Upper Memory Block.
В адресном пространстве процессора 8088 после основных 640 кБ остаются пустые окна (или промежутки), которые не заняты каким-то ROM, драйверами или видео. Их не очень много и они могут быть изрядно фрагментированы, но они есть. Возникает соблазн использовать их для дополнительного RAM, что и было в свое время реализовано и названо UMB. В эту память переносились код DOS и драйвера, освобождая место для пользовательского кода в основной памяти. Потому что как оказалось, 640 кБ хватает не всем. Были такие специальные модули с памятью, которые вставлялись в слот ISA.
В моем случае оставалось 143 кБ бесполезной памяти (СС000 - EFFFF). Плюс, они уже «покрыты» физической RAM и могли бы быть очень просто переданы DOS как верхняя память.
Нужно было только добавить схему, которая разрешит процессору читать и писать эту область памяти. Потому что ранее я ее заблокировал, чтобы программы не могли повредить код BIOS.
Эту схему я синтезировал в GAL16V8B – микросхема программируемой логики из тех времен. Очень в тему получилось:
Просто так новые килобайты в системе не появляются, нужен специальный драйвер. Тут выяснилось, что установленная у меня ОС MS-DOS 4.01 даже с драйвером очень плохо (неэффективно) работает с UMB. Отличная причина сделать апгрейд. Перешел на MS-DOS 6.22.
Вот здесь видно, что получилось:
В строке Upper драйвер UMB нашел всего 144 кБ верхней памяти (147472 / 1024), 13 кБ сразу заняты драйверами и самой ОС – это значит, что в основной памяти эти килобайты освободились для пользовательских программ. Еще 130 кБ доступно для использования. Очень не дурно, надо сказать. Дополнительные килобайты в основной памяти позволили запустить Wolfenstein с мышкой. Раньше приходилось загружаться без драйвера мышки, иначе не хватало RAM.
В этом месте я решил остановиться, хотя хотелось добавить еще RTC (часы на батарейке) и звуковую карту. Но подумал, что лучше не загромождать конструкцию. Места уже не было, требовался второй этаж. А мне хотелось получить ноутбучный плоский формат.
В итоге получилось так:
Здесь видно, что я припаял на свободное место переходника разъем под вторую CF-карту. Сейчас там стоит две карты на 250 МБ каждая. Соответственно в системе два HDD.
Ну и самое интересное:
Корпус.
Оставить такой компьютер без корпуса было бы неправильно. Поэтому корпус был в плане с самого начала. Пришло время его делать.
Сам корпус я сделал из отдельных стенок, вырезанных из листового пластика, соединенных винтами через уголки, напечатанные на 3-D принтере. На том же принтере напечатаны элементы для установки эмулятора гибкого диска, элементов управления, индикации и разъемов. Сейчас я думаю, что проще было напечатать весь корпус целиком – вышло бы аккуратнее и не сильно дороже, но уже как сделал, так и будет.
Windows.
MS-DOS 6.22 – это конечно хорошо, но настоящий компьютер в современном смысле должен быть на винде или что-то типа того.
Для процессора 8088 доступны только самые первые версии Windows. Точнее его предел – это версия 3.0. Дальше уже нужен процессор 80286.
Windows 3.x устанавливается как дополнение к MS-DOS. После загрузки надо ввести команду win и Windows запустится. (Ну или сразу сделать это в автозапуске.)
Тормозит конечно, но работает. Торможения в основном на графических моментах типа перетаскивания окон или других элементов. Можно в карты поиграть.
Вся история заняла чуть меньше чем полтора года. Компьютер теперь в моем личном музее самоделок. Какой-то пользы от него я не вижу, но было интересно сделать.
Этот пост является упрощенной версией моей статьи на Хабре. Здесь, на Пикабу, очень сильно меньше технических деталей. Схема, если кому-то интересно, вот здесь: Схема
К сериям микросхем типа HC / ALS прошу не придираться. На схеме показана только логика. Паял то, что было проще купить. Главное, что оно работает.
Теперь думаю не замахнуться ли мне на ПК на базе 286-го процессора?
Можно ли самостоятельно спаять настоящий компьютер? Не ZX-Spectrum или что-то подобное, а вот прямо настоящий PC? Может быть я немного ошибаюсь, но компьютер (само железо) для большинства пользователей – это что-то на грани магии. Оно как-то работает, но что там внутри происходит – не понятно, да и не очень важно.
В общем, где-то в конце 2024 года решил я сделать компьютер. Понятно, что не такой как в магазине – это все-таки не тот уровень, куда с паяльником лезут, а что-то попроще, но по-настоящему.
Вообще история PC началась в 1981 году, когда IBM предложила миру свою модель 5150 или IBM PC. В тот момент это не было какой-то особенной революцией, многие компании пытались предложить рынку массовый персональный компьютер, но IBM случайно угадала баланс между стоимостью, производительностью и авторскими правами. Последний пункт оказался чуть ли не самым главным, т.к. позволил всем желающим клонировать PC в формате собственных версий. IBM наверно было обидно, что их идеи приносят деньги всем желающим, но для судьбы архитектуры это оказалось ключевым моментом. Рынок быстро наполнился компьютерами и программами к ним.
Та модель 5150 была не такой уж прикольной. Для игр даже Spectrum был точно поинтереснее. Но IBM продвигала PC прежде всего как инструмент для бизнеса. В минимальной конфигурации это был довольно унылый компьютер с магнитофоном в качестве постоянной памяти. Поэтому очень быстро вышла модель 5160 – IBM PC/XT. Вот это уже был настоящий компьютер в современном понимании. Сама основа осталась почти без изменений, но в комплекте уже сразу шли накопитель на гибких дисках и жесткий диск. И усиленный блок питания, чтобы питать их. Видеокарта выбиралась юзером в момент покупки. Или относительно бюджетная монохромная MDA, или CGA для любителей странных цветовых палитр.
На самом деле там было много вариантов комплектации, но я не буду описывать эти детали, кому интересно, тот может почитать – статей про это написано множество.
Теперь вернемся в наше время. Модель 5160 вполне можно спаять самостоятельно. Там все микросхемы в корпусах доступных обычному паяльнику. Конструкция IBM PC XT подробно описана в мануалах того времени и легко находится в Интернете. Это довольно объемный документ на 420 страниц. Не по-русски разумеется.
Здесь есть все, включая принципиальную схему и полный листинг BIOS на ассемблере.
Но делать компьютер по той инструкции не интересно. Хотелось добавить в него всяких современностей, но при этом не опускаться до эмуляции всего на микроконтроллере – в таком подходе нет ничего интересного. Компьютер должен быть настоящим, железным. При этом конструкцию можно упростить, если не делать те ее части, которые не получится использовать.
Поразмыслив над всем этим, я пришел к такому плану:
CPU V20 – это улучшенная версия 8088. Может работать на большей скорости.
Математического сопроцессора не будет.
RAM – 1МБ статической памяти.
Клавиатура – использовать простую Bluetooth-клавиатуру из Фикспрайса.
Разъемы ISA не делать. Все, что вставлялось в слоты, сразу припаять на материнку.
Видеокарта MDA тоже самодельная в собственном разъеме, а потом VGA на материнке.
ЖМД (HDD) – CF-card.
ГМД (FDD) – эмулятор на флешке.
COM-мышка.
USB-флешка.
Печатной платы не будет, все навесным монтажом.
Исходный план был не совсем такой, но в процессе пришел к нему.
Видеокарта MDA
Сначала сделал видеокарту MDA. На отдельной плате. Карта задумывалась как тестовая для использования только в процессе отладки.
Оригинальная MDA карта в стандартном режиме показывает алфавитно-цифровую картинку 25 строк по 80 символов. Частоты синхронизации совершенно телевизионные, поэтому современный ЖК-монитор почти точно откажется показывать такой сигнал. Необходимо рисовать его в более современном формате.
Чтобы решить проблему совместимости, решил изменить размеры знакоместа и поместил каждый символ в матрицу 8х9. Примерно как на ZX-Spectrum, т.е. совершенно нормально читаемые символы, хотя и не такие симпатичные как в настоящем ХТ. Картинка получилась размером 640х225. Прочерчиваем каждую строку два раза и получаем на выходе 640х450. Почти идеальные 640х480. И пиксельная частота примерно 24 МГц.
Оригинальная MDA карта содержит на борту еще и LPT разъем для подключения принтера – это сразу в корзину. Есть ряд dip-переключателей для настройки режимов – это тоже исключил. Будет только один стандартный режим.
Сердцем настоящей MDA является видеоконтроллер Motorola 6845, который уже не так-то просто найти. Да он не очень-то и нужен, если планируется совершенно неродной формат изображения.
Вместо этого используются две ПЛИС EPM3064. Одна занимается рисованием картинки, а вторая управляет отображением курсора и сообщает по запросу CPU байт статуса видеокарты.
Видеопамять настоящего MDA – это область памяти в основном RAM. Процессор и видеокарта разделяют доступ к ней, от чего немного снижается скорость работы процессора. Моя видеокарта просто постоянно мониторит системную шину и забирает к себе в память видеобайты, когда процессор пишет их в RAM. Торможений нет.
В остальном ничего примечательного. Картинка из кода символа и кода атрибутов формируется на дискретной логике и отправляется в монитор. Почти как в Радио-86РК.
В итоге поучилась вот такая конструкция:
Клавиатура.
Родная клавиатура IBM XT – это совершенно особенная конструкция. По формату передачи данных похожа на PS/2, но это не она. Купить такую новую уже просто невозможно. Можно использовать что-то более современное, но с конвертором. Или сделать совсем по другому.
Как я уже писал, используется клавиатура Bluetooth из Фикспрайса – самое бюджетное решение без проводов. Чтобы подключиться к ней, пришлось приобрести ESP-32S, который в разы круче всего остального железа. Если бы я делал эмулятор, то можно было бы почти все в нем и реализовать.
Bluetooth – это целая вселенная, погружаться в которую у меня желания не было. Я взял за основу этот проект (спасибо turgu1 из Канады) и доработал под свою задачу. Коды нажатых и отпущенных клавиш принимаются ESP-32S, перекодируются в соответствующие коды клавиатуры IBM PC и через com-порт выкидываются в другой микроконтроллер, о котором будет написано дальше.
Каких-то проблем тут не возникло. Я дольше разбирался, как заливать прошивку в ESP, чем делал саму прошивку.
Материнская плата.
Далее я буду использовать краткие наименования микросхем типа «8088» просто чтобы было меньше букв. Желающие смогут легко найти их описание в сети.
Для материнки заказал большую макетную плату. Размером почти А4.
За основу схемы взял оригинальную конструкцию. Но почти все немного или сильно изменил. Прежде всего, добавил микроконтроллер STC8H8K64U (далее просто STC), который заменил тактовый генератор 8284 и формирует своими таймерами частоты для CPU и для системного таймера 8253. При этом на ЦПУ поступает примерно 8.63 МГц при стандарте 4.77 – почти в два раза быстрее.
Но это не все. Еще STC выполняет функцию буфера клавиатуры, сообщая CPU коды нажатых и отпущенных клавиш, которые принимает через com-порт от ESP-32S. При этом он еще занимается автоповтором нажатых клавиш, который в XT реализован аппаратно внутри клавиатуры.
Так же STC формирует канал DMA 2, который нужен для работы с гибкими дисками.
ROM (BIOS). Сначала я хотел весь код BIOS хранить в прошивке STC просто как статический массив байтов и загружать его в RAM при старте используя режим DMA. Это позволяло хорошо сэкономить на количестве микросхем. Но когда решил делать полноценную модель 5160, пришлось пойти по классике и вынести BIOS в отдельное ROM. Слишком большой объем 64 кБ – это вообще вся память STC.
В качестве этой памяти для хранения BIOS используется W25Q32Q32VB. Емкость 1 МБ, подключается к STC по SPI. Вообще, там не только BIOS, но и ПЗУ (драйвера) контроллеров жесткого и гибкого дисков и видеокарты. Они тоже загружаются в память перед стартом.
Системный таймер (который в любом компьютере незаметно считает время работы), контроллер прерываний и параллельный порт для внутренних устройств почти без изменений повторяют оригинальную конструкцию.
CPU включен в минимальном режиме, потому что в схеме нет математического сопроцессора, поэтому в схеме нет и 8288, процессор по сути сам рулит всеми устройствами.
При старте компьютера STC включает режим DMA, забирая управление на себя. Очищает экран, пишет свое приветствие и производит легкий тест RAM. Просто пишет и читает несколько байт в каждую микросхему. Тестирует контроллер ГМД, загружает в память коды BIOS и драйвера.
После этого управление возвращается процессору и дальше все происходит как обычно в PC/XT.
Здесь и начались первые настоящие трудности. Конструкторы IBM заложили в BIOS алгоритм довольно подробного самотестирования при старте. Значительно серьезнее чем, например, в Spectrum’e. Это объяснялось тем, то РС предлагался прежде всего для бизнеса, и IBM должна была гарантировать, что если компьютер включился, то он исправен и не принесет ущерба неожиданным сбоем. Этот тест моментально блокировал загрузку моей конструкции.
Пришлось доставать логический анализатор, подключаться куда только можно и разбираться что не так. К счастью, в техническом описании есть полный листинг BIOS на ассемблере с машинными кодами. Поэтому получилось возможным делать снимок загрузки и потом побайтно разбираться какие команды исполняет процессор, и в какой подпрограмме происходит сбой.
Чтобы было понятно, это выглядит примерно так:
Как оказалось, CPU не находил контроллера DMA, который я сначала совсем исключил из схемы, и выполнял команду HLT, т.е. просто останавливался. Я заменил HLT на NOP и теперь тест стал падать на проверке контрольной суммы ROM (логично). Пришлось обойти и эту проверку.
Всего в код BIOS внес изменения в шести местах. И это не всегда была простая замена одного байта. Местами более обширные изменения. По мере адаптации кода к конструкции компьютер начал проявлять признаки жизни. Прежде всего писать коды ошибок на экране. Это выглядело например так:
Здесь видно сразу три проблемы.
301 – нет клавиатуры
80000 FF 201 – проблема с RAM.
Все строки подчеркнуты – мой MDA неправильно интерпретирует байты атрибутов символов, ошибочно думает, что надо подчеркивать.
И здесь еще видно в четвертой строке первый вариант курсора – вертикальный мерцающий штрих, как у современных ПК. Позже я заменил его на стандартный для РС мерцающий символ подчеркивания.
Ошибка клавиатуры решилась исправлением кода в STC, в RAM был непропай (после этого появился тест RAM на этапе старта).
Постепенно все проблемы были решены или обойдены и мой ХТ издал всем знакомый одиночный бип и загрузился как положено:
Т.к. в системе нет никаких дисков для загрузки, то управление передается встроенному Basic от Билла Гейтса. Получился такой чёрно-белый вариант Spectrum или Радио-86РК на максималках. Можно было что-то кодить. А если добавить проводков, то и сохранять программы на магнитофоне.
На этом этапе выглядело все это так:
Микросхемы с радиаторами – это КР580ИР82 / ВА86. Я их выбрал потому что они продаются за копейки и имеют удобное расположение выводов. Но, как оказалось, они очень сильно греются при работе. Потом я поменял их на более «холодные». На MDA-карте тоже стоят 4 штуки и без радиаторов. Никаких проблем при этом нет. Только горячие очень.
Еще здесь видно первый вариант BIOS в обычной ПЗУ, потом я его убрал.
HDD (ЖМД)
IBM PC/XT из коробки умеет работать с ЖМД. Разумеется речь о ЖМД 80-х годов прошлого века. Любой современный накопитель будет непосильной проблемой для XT.
Для подключения ЖМД необходим специальный контроллер, который вставляется в свободный слот ISA.
Но есть вариант проще. CF-карта имеет разъем почти идентичный IDA – это такой разъем под широкий шлейф, уже давно не применяется, но все это можно спокойно купить.
Среди любителей ретрожелеза давно известен проект Сергея Киселева. Можно подключить CF-карту к XT в качестве ЖМД.
От этого проекта я взял только код ROM и общую идею. Сергей предлагает свой контроллер как универсальный модуль для установки в любой PC. Поэтому там есть переключатели для настройки конфигурации под конкретную машину. Мне это не было нужно, потому что я делал этот модуль встроенным в материнку. Так же я совсем отказался от ROM и весь его код положил в ПЗУ STC. Таким образом, и без того простая схема контроллера стала совсем уж примитивной. Она вся на этой картинке:
Разъем под CF-карту специально сделан на самом краю, чтобы потом можно было легко извлекать карту через прорезь в корпусе. Я использовал карту на 32 МБ. Невиданная роскошь по тем временам. А потом вообще поставил 250 МБ. Эта конструкция запустилась сразу без отладки и порадовала меня такой картинкой:
Как видно, CF-карта корректно распозналась, но это и почти все. Логическим анализатором я установил, что с карты нормально считывается загрузочный сектор (MBR), управление передается ему и на этом все валится. После нескольких неудачных попыток пройти дальше XT выдает сообщение об ошибке.
Проблема была ожидаемая и заключалась просто в том, что карта была отформатирована на современном ПК непонятным для XT образом. Нулевой сектор всегда нулевой, поэтому MBR читается без проблем, а дальше XT просто не может найти на диске нужный сектор. Я потратил немало времени, пытаясь хоть как-то установить MS-DOS на карту так, чтобы XT смог ее увидеть, но все оказалось бесполезно.
Решить проблему можно было только имея работающий ГМД.
FDD (ГМД).
Сначала я вообще не собирался делать FDD. Уже давно прошли те времена, когда FDD был нормой для конфигурации ПК. Но оказалось, что правильно отформатировать CF-карту для работы в качестве жесткого диска можно только если загрузиться с ГМД.
Сейчас даже просто пойти и купить сам привод с разъемом под шлейф скорее всего не получится. Да и за дисками придется побегать. Но к счастью наши друзья из Китая придумали замечательную штуку, которая позволяет эмулировать привод дисков на обычной флешке:
Сам контроллер тоже «эволюционировал» с тех времен, когда это был отдельный большой модуль для ISA разъема, и теперь практически целиком помещает в одной микросхеме M82077 или PC8477B. Нужен только дешифратор портов для того, чтобы CPU мог обратиться к FDD. Это одна дополнительная небольшая микросхема. Поддержка FDD уже встроена в BIOS и не должна вызывать проблем.
И вот тут меня ожидал сюрприз. FDD не работает без DMA. Такая реализация в PC. А я поначалу вообще не хотел делать DMA, потому что, если нет ГМД, то он нужен только для регенерации динамической оперативной памяти, а память я поставил статическую.
Раз уж ГМД возвращался в конструкцию, пришлось эмулировать канал DMA 2 в STC, потому что STC уже реализует DMA при старте.
Была только одна проблема. Я использовал STC8H8K64U в ретро-корпусе на 40 ног, которые уже даже не выпускают, но еще продают. И почти все эти 40 ног уже были задействованы. Подключать FDD было просто некуда.
Самым простым решением было заменить STC. Я взял точно такой-же, но уже в корпусе TQFP-64. Это абсолютно тот же самый чип, но у него выведено больше портов. Даже прошивку менять не пришлось. Только припаял на это же место другую микросхему. Все-таки макетная плата – это удобно.
Было – стало:
Как видно, тут добавился куллер. Я их заказал, когда увидел как греются буферы КР580, и потом прикрутил, но и без них нормально.
Новая STC запустилась без проблем. Бонусом получил возможность загружать родной BIOS без корректировки. К тому времени подъехали другие детали, и на материнке появился контроллер FDD:
Микросхема контроллера не новая, но их уже наверно не производят. Микросхема с номером 23 на фотографии – это дешифратор портов. Таким образом, все детали контроллера FDD поместились на этой картинке. За основу взял другой проект Сергея Киселева только без com-порта, но, справедливости ради, подключение контроллера совершенно типовое как по даташиту. Проект Сергея помог мне просто понять, как это устроено.
Сразу это все не заработало. Микросхема контроллера оказалась неисправной и пришлось покупать другую.
Хотя родной BIOS поддерживает FDD, для использованного микроконтроллера FDD все же лучше подходит специальное расширение BIOS все того же Сергея. Это расширение стандартного BIOS позволяет работать с дисками любого формата.
Код этого расширения аналогично BIOS заливается в RAM при старте.
Долго ждал эмулятор накопителя, и, когда он приехал, запустил все. На экране получил такое:
Я пробовал разные образы загрузочных дисков, какие нашел в Интернете. Все зависали после старта операционной системы. Ошибка оказалась до обидного простой. Просто заменил в коде STC в одном месте “ &” на “ |” и все заработало.
Найти в Интернете образы дисков с MS-DOS не так уж сложно. Сложнее найти нормальный образ, пригодный для установки. Большинство ориентированы на то, чтобы быть самостоятельными загрузочными дисками для постоянной работы. Можно конечно всегда сделать «format c: /s» и превратить диск C в загрузочный с установленной ОС MS-DOS, но это будет крайне минимальная конфигурация всего из четырех основных файлов. Работать в такой системе можно, но это не будет полноценная система. Придется вручную копировать на диск остальные фалы.
После ряда экспериментов удалось установить на жесткий диск MS-DOS 4.01.
Добавил к системе свой любимый с 90-х годов Volkov Commander и получил такой результат:
Интересно, что если вставить теперь CF-карту, которая отформатирована в XT, в USB-адаптер, то современный ПК ее вообще не видит. Первоначальный план использовать ее как флешку для переноса файлов не сработал. Теперь понятно, почему в Интерне нет образов жестких дисков XT. Без каких-то хитрых приемов их просто не получится развернуть на CF-карту. И видимо прочитать тоже не получится, чтобы сделать образ. Все дело в нестандартной геометрии разметки «поверхности» диска.
Для переноса файлов оказалось проще использовать запись в образ гибкого диска любой доступной программой, которая понимает образы *.imo или *.img .
На этом этапе компьютер выглядел уже так:
Ну и конечно теперь можно было попробовать поиграть во что-нибудь. Игры – это отличный тест системы. С MDA картой сильно не разгонишься, но кое-что можно попробовать. Вот, например, Тетрис:
Продолжение будет завтра. Уже написано.
Продолжение здесь.
В моем детстве почти каждый год мы ездили в деревню, к родителям отца. Иногда летом, иногда зимой. Видимо смотря по тому, как получался отпуск у моих родителей. Целое путешествие. Сначала самолет, потом поезд, потом что-то автомобильное, по ситуации.
Сейчас, на шестом десятке лет, для меня это такие воспоминания, как слайд-шоу. Помню только отдельные кадры из которых складывается общая картина детства в деревне.
Дом деда, как я сейчас понимаю, был совсем небольшой. По сути одна комната с печью, разделенная деревянной перегородкой чуть ниже потолка. С одной стороны спальня, с другой, где печка, - кухня.
Стекла в окнах замазаны по периметру и по трещинам пластилином. Бревенчатые стены просто побелены, а электропроводка на них - скрученные косички проводов на маленьких керамических изоляторах.
На стенах в картинных рамах висят фотографии родственников. Под одно стекло вставлены самые разные фотографии, как сейчас бы сказали “коллаж”. Фотоальбом прямо на стене.
На кухне у стены большой стол, за которым собиралась вся семья. Взрослые курили папиросы так что дым висел по всей кухне, и разговаривали взрослые разговоры. Теперь запах “Беломора” у меня однозначно вызывает воспоминания о тех днях.
На столе конечно была всякая еда, но я помню только “жарёху” - большая черная сковорода, на которой просто кучей пожарены мелкие гольяны и ротаны, выловленные накануне в местной речке. Не помню на сколько это было вкусно или нет. Взрослые просто ели эту рыбу на манер чипсов из общего блюда.
А над столом всегда висела большая во всю стену политическая карта мира. Всегда, потому что ее точно обновляли, приезжая иной раз я замечал, что карта новая. Думаю, что ее вешали в качестве доступных фотообоев. Не помню, чтобы кто-то кроме меня ее рассматривал.
С того места, где я обычно сидел, мне в силу возраста было видно на карте только кусок Антарктиды. Диковинные географические названия этой части мира были слишком сложными, чтобы их запомнить. Кроме одного. Земля королевы Мод. Детского воображения было достаточно, что не задавать вопросов, а просто принять это как есть. Не знаю почему, но садясь за стол, я первым делом находил глазами эту землю.
Еще на кухне стоял “буфет” - такой кухонный шкаф, каких сейчас уже не встретишь. Что-то типа современных кухонь во всю стену, но буфет - это просто один высокий шкаф с посудой и бакалеей. В буфете помню только постоянную чашку с медом и оловянной ложкой в нем. Ложка толстая и массивная с грубыми формами, наверно самодельная. А еще там были конфеты, типа шоколадные, но с белой твердой начинкой. Не помню, чтобы кто-то любил такие.
В спальне был уже настоящий шкаф с одеждой. Но кроме одежды в нем у задней стенки стояли два охотничьих ружья. Две настоящие двустволки - где я еще мог взять в руки такое? Одно ружье было не совсем исправным. Вероятно однажды один ствол был как-то поврежден посередине, и поэтому там была просто деревянная вставка. Патронов к ружьям не было. Видимо дед благоразумно хранил их где-то отдельно.
Рядом, у окна радиола. Такой стационарный радиоприемник на ножках. Каждое утро дед садился к нему, начинал крутить ручки и слушать эфир в поисках новостей. Аналог Интернета получается. Под эти звуки все и просыпались обычно.
Телевизор, черно-белый, тоже был - стоял на комоде в углу спальни под иконой. В этом телевизоре я, как ни странно, запомнил два сюжета: фрагмент из фильма “Вечный зов”, как кто-то поднимает шапку на палке, и ее сбивают пулей и какой-то мультфильм как звери совместно побеждали Страх, живущий в пещере. “Я открою вам секрет, никакого страха нет” - запомнил на всю жизнь.
А во дворе дома была целая вселенная. Прежде всего баня напротив крыльца и склад с дровами и углем. Дрова были сложены высокими поленницами, которые были для мелкого меня как стены, за которые можно было зайти словно в лабиринт. Уголь лежал в отдельном сарайчике тут же.
Между баней и дровами в будке на цепи жил пес по кличке Арго. И был он максимально добродушным. Стоило только его погладить, он сразу плюхался на спину предлагая почесать ему еще и живот.
В другом большом сарае жили куры, свиньи и корова. Саму корову я почему-то не помню, но молока было много. Однажды меня напоили парным молоком, отчего мне стало плохо и больше этого не повторяли. Зимой лишнее молоко морозили в больших чашках. Бабушка складывала эти толстые молочные блины в холодной кладовке, в сенях дома, называя их “мороженое”. Возможно она просто так шутила - это почти единственное, что я точно помню про нее - как она складывает мороженое в кладовку.
За домом был огород, вероятно со всякими овощами, но главное - там стояли ульи. У деда была своя пасека, от чего я старался не появляться там. Но там же меня научили, что пчел не надо бояться. Если пчела проявляет к тебе интерес, то просто замри и она улетит. Это действительно работало. Пользуюсь до сих пор.
В углу огорода был небольшой домик - полуземлянка. Омшаник, в котором зимовали пчелы и хранился всякий хлам.
За омшаником стояли мотоциклы. Что-то типа “Иж-Юпитер” без колясок. Их было то ли два, то ли три, явно не исправные, но настоящие. И с ними можно было играть, что было совершенно недоступно мне где либо еще.
Впрочем, хотя бы один живой мотоцикл точно был. Отец брал меня на рыбалку и мы ездили на нем куда-то далеко.
Еще дальше за огородом и забором был второй огород, уже почти поле. Там росла исключительно картошка.
Помню, что по приезду бабушка приносила из сарая ведро с игрушками. Железное оцинкованное ведро с “сокровищами”. Но из всех игрушек я запомнил только заводную машинку. Маленький зеленый грузовичок. Между задних колес у него был пружинный моторчик, который нужно было заводить специальным ключиком, после чего машинка резво уезжала куда-то под кровать.
Однажды мы приехали зимой, а вся деревня слушала песни Юрия Антонова на пластинках из журнала “Кругозор”. Был такой советский журнал, в котором между страниц вшивались настоящие пластинки для проигрывателя из голубого гибкого пластика. Их нужно было аккуратно вырвать и потом слушать как обычные пластинки. С тех пор как услышу “летящей походкой” - сразу вспоминаю ту поездку. Получается, что это наверное была зима с 81 на 82 год, когда Антонов стал популярным.
Где-то в начале второй половины 80-х умерла бабушка, а на следующий год не стало и деда. Ездить в деревню стало не к кому и больше меня туда не возили.
В 2015 году мы ехали на машине по федеральной трассе через Амурскую область. Я уже знал, что впереди меня ждет поворот в детство. Поэтому когда притормозил перед указателем “Марьяновка 7”, жена сказала: “Давай заедем”.
Было начало ноября, немного пуржило. На улицах деревни не было никого, что впрочем обычно для деревень.
Найти место, где стоял дедов дом было несложно - второй от единственного поворота на центральной улице. Вот только дома уже не было. Только уходящее к лесу ровное чистое заснеженное поле. Наверно как-то примерно так и выглядит Земля королевы Мод.
Привет всем.
Кажется, я уже где-то писал, что на мой взгляд большая проблема для тех, кто любит что-то мастерить на микроконтроллерах (в т.ч. Arduino) – это отсутствие идей для проектов. Помигали светодиодиком, хочется двигаться дальше, но куда? Поэтому я иногда выкладываю тут свои поделки, может кто-то захочет повторить.
Основные принципы - это должно быть максимально бюджетно, чтобы оставалось на уровне простого развлечения, и хоть немного оригинально. Поэтому ниже будут справочно указаны цены, в которые это все обходится. Точнее обошлось мне на момент покупки.
Сегодня мы будем делать микрокалькулятор.
Мозги калькулятора на микроконтроллере STC8H8K64U в устаревшем корпусе DIP на 40 контактов. Такие уже не выпускают, но они еще продаются на Али меньше чем по 100 рублей за штуку. В принципе, можно использовать версию в любом корпусе, но с таким работать приятнее.
Семисегментный индикатор на 8 разрядов на MAX7219 продается там же готовый с управлением по SPI. 108 рублей.
Кнопки тоже есть у китайцев. Я использовал готовые сборки из четырех кнопок. 5 штук по 4 кнопки каждый. 60 рублей за одну сборку. Если честно, то кнопки мне не понравились сами по себе.
И еще бокс для трех батареек ААА за 104 рубля уже на Озоне.
Для основы всей конструкции использовал кусок текстолита без фольгирования. Использовать макетную плату подходящего размера мне показалось слишком жирным для этого.
Итак, схема конструкции
Все очень примитивно. Это просто подключение кнопок и индикатора к микроконтроллеру. Есть еще компорт для прошивки. Здесь же хотел сначала добавить два светодиода, на которые я хотел вывести знак минус для отрицательных чисел и индикатор записи в регистр памяти. Но в итоге я их не стал делать, а вывел сигналы в старший разряд индикатора. Просто потому что два светодиода вживую смотрелись довольно плохо и не наглядно. Соответственно максимальное число на индикаторе будет +- 9999999. Меньше чем обычно, но достаточно. Минус – это будет привычная средняя палочка в восьмом разряде, а память – это точка там же. И буква «Е» в случае переполнения или ошибки.
Когда я написал здесь предыдущее предложение, то вспомнил, что никак не обыграл деление на ноль. Вернулся, доделал.
Получилось вот так:
Кнопочка сверху – сброс микроконтроллера. Используется для заливки прошивки. Ну или просто как сброс, если хочется. Остальные кнопки имеют стандартный смысл.
С обратной стороны как обычно паутинка. На этот раз небольшая.
Бокс с батарейками приклеен на суперклей.
Прошивка и схема в хорошем качестве, если кому интересно, здесь: https://github.com/viktand/calculator
Хотя логика калькулятора кажется довольно примитивной, но на практике это оказалось неожиданно трудно. Пришлось повозиться с тем, чтобы правильно выводить на индикатор числа в процессе их ввода и после вычислений. Особенно разочаровало преобразование между long и double, приводящее к тому, что вместо, например, «4.5» калькулятор показывал «4.499999».
На этом все.
В некотором роде продолжение моего поста про самодельный ZX-Spectrum. Еще одна реализованная мечта детства.
В 10 номере журнала «Юный техник» за 1989 год была опубликована статья «Сквош по пятому каналу»:
По нынешним (да уже и по тем) временам очень примитивная приставка к телевизору на базе микросхемы К145ИК17. Подробности про нее и про тв-игры, которые в ней реализованы можно прочитать в Википедии. Там очень хорошо написано.
В свое время эта статья в журнале меня просто заворожила. Компьютер тогда был вообще недостижим для меня, а тут все так просто казалось сделать. Но купить «процессор» было вообще не реально в нашем маленьком северном городе. Потом я поступил в институт и уехал в большой город Комсомольск-на-Амуре, но и там я ее не нашел, а потом появился Spectrum и я просто забыл про это на много лет. Но недавно вспомнил и решил сделать.
Как оказалось, у этой конструкции есть даже свой микро-фан-клуб, но, пожалуй, он тоже уже уходит в историю. Статья в журнале – это пример самой примитивной реализации, да еще и с ошибками в схеме.
Я решил сделать нормальную цветную версию, но без ВЧ-модулятора. 5 канал уже не актуален.
Итоговой схемы я не рисовал. Собирал по частям из разных схем, и наверно нет смысла подробности здесь описывать. Кому это сейчас может быть интересно? Единственное, что внес от себя в небольшой зоопарк вариантов – это два генератора на одной микросхеме К155ЛН1. Основной для «ЦПУ» на 2МГц и второй для кодера PAL на 4.43МГц. Обычно их делают отдельно.
Кодер PAL самый обычный на CXA1645P.
Итак, реализацию я начал с того, на чем остановился в прошлый раз: поиск микросхемы ИК17. Как оказалось, купить ее не так уж просто. Понятно, что ее уже много лет не производят, но кое-где на складах она еще встречается. Вот только цена не радует.
Я уже склонялся к тому, чтобы заказать ее импортный аналог (точнее первоисточник) у китайцев, но мне удалось найти компанию в Воронеже, которая продавала микросхему всего за 135 рублей. Пересылка умножала эту цену еще на три, но все равно получалось относительно дешево.
Остальные детали купить совсем не сложно.
Конструкцию собрал на макетной плате проводом МГТФ.
С другой стороны как обычно маленький хаос:
У приставки есть два джойстика для управления ракетками. Просто два переменных резистора. Я их сделал вот так из подручных материалов:
Несколько игр предполагают наличие светового пистолета, но все пишут, что пистолет работает только с ЭЛТ-телевизорами. На ЖК не работает. Поэтому я не стал делать вход для пистолета и сам пистолет. Там не сложно, но зачем, если не будет работать?
В итоге получилась вот такая штука:
Вот эта белая черточка – это «мячик» Вживую он более квадратный.
Интересно, что сначала я тестировал на другом телевизоре, который не совсем телевизор, а смарт-тв на Андроиде. И цвета там не было. Я долго и безуспешно искал причину, но потом мне попался нормальный телевизор, который без проблем распознал цвет. Такие дела.
Игры конечно для наших лет очень примитивные, но я и не планировал играть. Гештальд закрыт.
Текста будет немного. Утром обнаружил дома такое:
Сетки на окнах есть. Как эта нечисть проникла в квартиру - загадка. Пару дней назад было открыто окно без сетки на балконе. Выходит, что мы вместе уже несколько дней живем.
Взял коробку и аккуратно накрыл зверя. Мышь спит так крепко, что даже не проснулась пока не поймал. Немного поползала по коробке, пристроилась вниз головой и дальше спит.
Вечером пойдем выпускать на свободу.
Чтобы было понятно, мне уже слегка за 50.
Мне всегда были интересны физика-математика, но на уровне книжек типа «занимательная физика». Я и сейчас с интересом смотрю ролики такой тематики на Ютубе.
Где-то в средних классах школы, уже точно не помню, видимо после «Гостьи из будущего», а может после книжки Герберта Уэллса, я подумал, что в принципе сделать машину времени было бы не такой уж плохой идеей.
Но т.к. я вовсе не был таким уж глупым, то я сразу понял, что тут все не так просто. Сложнее чем, например макет паровой турбины из жестяной банки от кофе (я такое делал). Придется много специально учиться, потратить кучу времени и вообще не факт, что получится. Т.е. как бы есть риск прожить жизнь зря в некотором смысле. Риск не такой уж иллюзорный.
Однако, как я уже сказал, я был довольно сообразительный уже тогда. Я логично рассудил, что если я займусь этим проектом и буду успешен в нем, то сразу после того, как все получится, я смогу послать в прошлое какой-то сигнал самому себе, что идея хорошая и можно вложиться в нее своим трудом и временем. А если я такого сигнала не получу, то и начинать не нужно.
Я подождал пару дней и на этом завершил разработку машины времени. Как вы понимаете, никакого сообщения из будущего я не получил. Великим физиком я не стал.
Дисклеймер.
Хотя далее в легкой форме описывается процесс создания самоделки в духе Ардуино, этот текст следует воспринимать как простую инструкцию по работе с микроконтроллерами серии STC8H.
Все началось с того, что мне захотелось в некотором смысле нащупать самое дно среди микроконтроллеров и посмотреть что там такое. Если точнее, то поглядеть на что способен самый дешевый микроконтроллер из тех, что я смогу найти.
Искать я пошел как обычно к китайцам на известный сайт, где в итоге остановился на STC8H1K17
Вот такой красавчик:
Вот скрин заказа:
Видно, что по цене вышло в среднем 47,49 руб. за штуку.
Вообще были варианты всего по 24 рубля, но там доставка повышала стоимость выше 47 рублей.
Итак, чем примечателен этот МК? Это восьмибитный микроконтроллер со всеми атрибутами старших братьев. Для минимальной работы ему не требуется никакой обвязки, только напряжение питания, буквально какое будет под рукой. От 2 до 5 вольт. Рабочая частота от внутреннего генератора выбирается при прошивке от 4 до 36 МГц.
Практически все выводы кроме питания можно использовать как программируемые пины.
Все семейство очень легко прошивается просто подключением двух выделенных ножек к любому ком-порту. При подаче питания МК сначала пытается прошиться (какие-то доли секунды) и, если не видит на входе сигналов прошивки, запускает программу, которая уже есть в нем. Очень просто и удобно.
Для прошивки используется программа, которую специально написал производитель stc-isp:
Вот последняя версия на сегодня: https://drive.google.com/file/d/1hqZQVEt19RfgwgccXYQ92r2wXv5...
Программа пугает обилием кнопочек, но тут все просто. Выбрать свой чип, открыть прошивку и загрузить ее. Бонусом идет возможность установить плагин для IDE и генерировать код для разных задач. Например, подключение I2C и т.п. И еще много приятных мелочей, позволяющих упростить весь процесс.
Вообще производитель сделал очень подробное описание всего семейства МК почти на 1200 страниц. Вот версия на английском языке: https://drive.google.com/file/d/1bA5yNccgZPAAW7daTwV3jnXuPJ5aMUwk/view?usp=drive_link, если с китайским у вас не очень.
Для написания кода можно использовать бесплатные инструменты, но есть удобная IDE «Keil uVision5». В демо-версии она ограничивает размер прошивки, но для опытов достаточно. Чтобы писать код для STC, надо сначала из программы-прошивальщика добавить в Keil свою библиотеку.
Вводную часть на этом закончим. Ссылок не даю, все легко гуглится. На русском языке почти ничего нет, к сожалению.
Чтобы протестировать МК, я решил сделать простейшую игру крестики-нолики.
В электрическом смысле ничего интересного. Поле двхцветных светодиодов 3х3. Зеленые и красные.
Поле кнопок 3х3 для хода игрока и две дополнительные кнопки «Сброс» и «Пропустить ход». Вторая нужна просто для того, чтобы дать возможность МК сделать первый ход.
Как видно, тут получается заметное превышение по количеству доступных пинов. Поэтому используется динамическая индикация по строкам и столбцам.
Схема получилась такая:
Внимательный читатель заметит здесь три буфера. Они потребовались, чтобы усилить выходной ток пинов в режиме лог.1. иначе светодиоды не зажигаются. В другом случае можно было бы сделать активный 0 и перевернуть светодиод, но т.к. светодиод включен между двумя пинами, то смысла в этом нет. Да и конкретные светодиоды с общим анодом такого не позволяют.
Ну и вот что получись в итоге:
Здесь еще видно разъем для ком-порта и конденсаторы на кнопках, которые я добавил, чтобы уменьшить дребезг. Но совсем от дребезга не избавился. Изредка кнопки могут глюкануть.
Программа управления всем этим, если кому-то вдруг интересно, вот здесь: https://github.com/viktand/cross. МК после инициализации циклически выставляет единицу на одной из трех строк и зажигает зеленые, потом красные светодиоды, потом сканирует кнопки в этой строке. Потом, если его ход, прикидывает, где лучше зажечь красный светодиод.
Интересно, что в красном режиме яркость светодиодов оказалась значительно выше, чем в зеленом. Поэтому пришлось включать их не в каждом цикле, а только в каждом шестом проходе.
Логику самой игры наверно реализовали уже столько раз за историю программирования, что описывать ее смысла нет.
Еще одна фотография. МК (красные) почти выиграл, но я не сдаюсь и что-нибудь придумаю.
Играть конечно не сильно интересно, но процесс создания этого увлекательный. На мой взгляд.
И да, когда все было сделано, чуть позже, я наткнулся на младшего брата использованного микроконтроллера. Вот он:
Этот малыш почти такой же способный. STC8G1R08. У него только пинов совсем мало. Цена всего 17 рублей. Вот думаю теперь что из него смастерить.