Проект по созданию компьютера занял у меня почти три года неспешной работы с большими перерывами. Это был увлекательный квест воина паяльника и клавиатуры, который научил меня многому в отношении создания систем. Особенностью этого проект является то, что я одновременно создавал и отлаживал и аппаратную и программную части системы, которые очень тесно связаны между собой. И если с программной частью для меня всё было более-менее понятно (жизнь в этом смысле меня изрядно покидала, поэтому я не боюсь ассемблера и железа), то разработка и отладка аппаратуры для меня во многом оставалась полем поисков и экспериментов.
Подготовка и заточка инструмента
С самого начала я понимал, что замахиваюсь на более сложный проект, чем все мои предыдущие. Если до этого я делал свои системы по наитию на макетке и отлаживал при помощи мультиметра и светодиодиков, то теперь этого арсенала мамкиного схемотехника явно не хватало.
И так, чем же я вооружился для того, чтобы одолеть все трудности? Здесь я опишу аппаратный инструментарий, про мои приключения в разработке программ будет написан отдельный эпос.
Инструментарий проектирования
Начинать разработку надо с проектирования схемы. Раньше мне хватало бумаги, но теперь я решил освоить какую-нибудь CAD-систему. Я перебрал несколько разных вариантов программ, но в итоге остановил свой выбор на онлайн-сервисе EasyEDA. Он привлёк меня своей простотой в работе и отсутствием необходимости устанавливать программу на свой компьютер. Бесплатный аккаунт даёт достаточно возможностей для неискушённого пользователя: можно рисовать схемы, разводить платы и заказывать их у производителя. Возможно, в будущем я перейду на какой-нибудь Proteus, но пока меня полностью устраивает и этот инструмент.
TIP: При пайке с тыльной стороны платы очень удобно иметь схему, зеркально отражённую по вертикальной оси, тогда на ней расположение контактов у микросхем будет таким же, как и при взгляд с тыльной стороны платы. Это очень сильно облегчает процесс пайки проводков при макетированнии. EasyEDA позволяет получить такую схему с небольшим количеством усилий.
TIP2: EasyEDA имеет функцию автороутинга - автоматической разводки печатных плат. Но доступный в облаке роутер часто бывает недоступен из-за перегрузки. Редактор даёт возможность развернуть роутер локально и использовать мощности компьютера. Очень рекомендую сделать сделать это сразу.
Логический анализатор
Внутри компьютера очень много разных линий соединения по котором с частотой в несколько мегагерц бегают туда-сюда сигналы. Чтобы понять, как работает система, и что в ней не так. надо уметь заглянуть "внутрь" этого процесса. Отладку предыдущих схем я осуществлял при помощи светодиодов и режима ручного тактирования. Это адски трудоёмкий способ.
К счастью, есть устройства, позволяющие заглянуть внутрь системы - это логические анализаторы (иногда их называют шинными анализаторами). Доступные в российских магазинах системы неприятно удивляют своей ценой. К счастью есть китайцы и сделанные ими клоны, которые можно приобрести за вполне разумные деньги. Я выбрал Saleae Logic-16 - 16-канальный анализатор с подключением к компьютеру через USB. У него нет многих функций дорогих профессиональных моделей, зато его можно купить за 2500 рублей (на момент написания заметки).
Среди полезных фишек его программного обеспечения - возможность декодирования некоторых протоколов из данных о перехваченных сигналах. Мне очень помогла возможность декодировать UART, SPI, и просто параллельные шины данных.
Программаторы
Микроконтроллер и ПЗУшки компьютера надо чем-то программировать. Традиционно я использовал свой старый добрый WizardProg 87i (российская нелицензионная копия китайского(!) программатора TL866 MiniPro). Он умеет и в параллельное программирование и в ISP-программирование, но его программная оболочка не умеет выполнять операции из командной строки. Без этого заливка прошивки становится операцией в несколько ручных действий.

Чтобы закрыть этот "пробел" я прикупил копеечный USBAsp 2.0, который можно использовать с утилитой AVRDude. Запуск этой утилиты можно прописать в External Tools в Atmel Studio и прошивать микроконтроллер в один клик.
Паяльная ванна
Предыдущий эксперимент с Z80 показал, что компьютер на макетной плате - это крайне нежное создание, которое имеет тенденцию отказывать в самые неожиданные моменты из-за плохих контактов. Очень увлекательно было несколько раз убить часы на поиск ошибки в программе только чтобы понять, что одна из ножек микросхемы плохо контачит. Поэтому я решил, что в этот раз макетировать буду сразу с использованием перфорированных макетных плат для пайки.
Чтобы спаять более-менее сложную схему и не получить комок лапши на плате, надо использовать очень тонкий провод. Для этого идеально подходит МГТФ с сечением 0.03 мм. Он тонкий, гибкий, не ломается. Его тефлоновая изоляция хорошо выдерживает нагрев и при пайке не оголяет лишнего провода. У этого провода есть один большой недостаток - его ну ОЧЕНЬ муторно зачищать руками, обычные стрипперы его не берут.
В качестве выхода подсмотрел в интернете идею использования паяльной ванны. При правильно подобранной температуре достаточно окунуть конец МГТФ в флюс и потом в расплавленный припой, чтобы за один раз зачистить и залудить кончик, подходящий для припаивания к ножкам микросхемы. Это позволяет в два движения сделать то, что без ванны потребует целой серии ручных операций.
Первые эксперименты
Дождавшись из Китая и ЧипДипа комплектующих и инструментов, я собрал несколько простейших схем с новым процессором на макетной плате. Для микроконтроллеров своего рода аналогом "Hellow World" является мигающий светодиод ("Blinkenlights"), для мира самопальных компьютеров - это "холостой ход" процессора, когда он без всякой памяти циклически исполняет NOP-инструкции. Когда я увидел в логическом анализаторе заветные меандры сигналов на шине, я сел паять первую версию вычислительного ядра.
 |
Вид тыльной стороны платы при пайке МГТФ. Оригинальные материнские платы не сохранились, на фото - макет видеоадаптера |
Задумка была простая - сделать плату с микросхемами, на которой будут разведены основные сигнальные пути, оставив возможность подключаться к каждому сигналу через штыревой разъем. Так появилась гибридная схема из паечной и контактной макетных плат. Этот подход позволил мне опробовать много идей, не гадая каждый раз, включится ли ранее работавшая схема, или нет. В этой схеме я ещё использовал в качестве системного контроллера старую добрую Atmega32, но уже в тот момент мне стало понятно, что для нормальной системы потребуется намного больше сигналов.
На одном из этапов работы я бился с непонятным сбоем системы при
обращении к памяти. Логический анализатор показывал полную чушь, а я не
мог понять что к чему. Проверки пайки показывали, что всё, вроде бы, в в
норме. Только дотошный прозвон контактов на замыкания показал, что две сигнальные линии замкнуты. И только потом с лупой наотсвет я почти случайно увидел
тонюсенькую ниточку припоя, соединившую соседние контакты.
Новый микроконтроллер и новые амбициозные цели - подключение SD-карт - заставили меня перейти на следующий этап проекта и начать паять более полную схему на большой паечной макетной плате. Этот этап проекта стал для меня большим разочарованием - потратив много часов на кропотливый ручной роутинг проводков по гигантской макетной плате, я в итоге пришёл к нестабильно работающей схеме. Что-то я такое хитрое умудрился сделать при пайке, но система более-менее стабильно заводилась, только если на плату в центре нажать пальцем и слегка её прогнуть.
Я перепробовал кучу шаманских плясок с перепайкой контактов и поиском плохих проводков, но тщетно - этот экземпляр был проклят духами и отказывался исправляться. Это было обидно вдвойне, так как я угрохал огромное количество ручного труда на эту схему. Разочарование было столь велико, что я даже всерьёз подумывал забросить проект целиком.
Китай спешит на помощь
Этот неудачный опыт научил меня тому, что с кустарными технологиями пора завязывать. Лапша из проводов и всё такое - это не для настоящих пацанов, надо разводить и делать нормальную печатную плату. Для других своих проектов я уже начал осваивать ЛУТ-метод производства плат в домашних условиях, но здесь решил не рисковать.
Поскольку я изначально проектировал всё в EasyEDA, у меня уже была принципиальная схема. Разобравшись с тем, как проектировать платы из ранее подготовленных логических схем, я заказал изготовление материнской платы в Китае. При проектировании платы я заложил несколько особенностей, которые облегчили дальнейшие эксперименты:
- Плату я разводил двухслойную, чтобы иметь возможность любую дорожку при необходимости точечно разорвать. Правда, мне пока это не потребовалось.
- Для основных сигналов я заложил штыревые разъёмы, чтобы можно было подключать логический анализатор и/или дополнительные схемы.
- Сразу заложил в схему шинную архитектуру, разъёмы для SD-карт, PS/2 разъём и достаточно сигналов, чтобы превратить контроллер ещё и в DMA-контроллер.
 |
Тот самый погнутый рычаг ZIP-панели. Ещё и развернул его на 180 градусов. Бонусом можно видеть припаянный проводок - обход ещё одной ошибки в схеме. |
Платы мне делали примерно месяц и обошлось это не очень дёшево - из-за выбора двухслойной технологии платы получились весьма большие (иначе дорожкам места не хватало). Зато когда я смонтировал на новой плате все компоненты и запустил тестовую прошивку, она заработала с первого раза. Это было
очень неожиданно после всех моих предыдущих упражнений с макетными платами и шаманским бубном.
Естественно, что я накосячил в схеме, а как иначе? Но самой смешной ошибкой стало то, что рычажок ZIF-панели для ПЗУ упирался в соседнюю микросхему, не давая полностью защёлкнуться. Это была настолько глупая и очевидная ошибка, но она стала возможной из-за того, что я слишком фокусировался на схеме и логике, упустив более комплексный взгляд на систему. К счастью, все ошибки я так или иначе сумел обойти, применив смекалку и грубую силу (да-да, этот рычажок я просто согнул). На этой плате я пока и продолжаю развивать проект, так как она в целом делает всё, что я от неё хочу.
Отдельная весёлая история приключилась с платой видеоадаптера, которую я спаял для своего компьютера. Схема уже была ранее опробована на макетной плате, поэтому я не ожидал сюрпризов. Но, видимо, что-то забылось из-за долгого перерыва а работе над проектом, и я допустил одну маленькую ошибку, из-за чего схема не запускалась. Юмор ситуации был в том, что я перебрал почти все варианты "сложных" ошибок и даже собирал на стенде макеты, воспроизводившие корректную работу контроллера. На деле же оказалось, что я банально забыл про некоторые особенности микросхемы программируемой логики и забыл задействовать ножку, которая включала бы выходные буферы запрограммированной схемы. И только после нескольких недель мучений, меланхолично перечитывая datasheet от этой микросхемы, я догадался, в чем проблема.
Но в конечном итоге, именно такие трудности на пути к решению вызывают потом франкенштейновский восторг ("It's alive!"), когда паззл складывается и схема начинает работать. Ради этой радости я и занимаюсь подобными проектами. О том, что именно у меня получилось в результате этих стараний, я расскажу в следующей заметке. А пока всех с наступающим 21-ым годом!