Виртуальный кузнец Di Halt (di_halt@mail.ru) Хакер, номер #108, стр. 108-122-1 Компьютерное моделирование самопального железаЖелезо… Как много в этом звуке для сердца фрикера слилось. Плох тот фрикер, который не умеет самостоятельно делать себе девайсы. Да и не фрикер это вовсе. А железо мало придумать, его еще нужно разработать, отладить, протестировать. На это уходит зачастую уйма времени, особенно когда разбираешься в каком-либо новом контроллере или навороченной микрухе. Нужны эксперименты... Однако не все так страшно! Вот ты думаешь, что наша фрикерская братва с утра до вечера просиживает за своими паяльными станциями, укуриваясь до одурения парами голландского флюса? Нет, не спорю, некоторые так и делают, и в этом тоже есть огромная польза – практический опыт, но те, что попродвинутей, предпочитают моделирование схем на компе. Сейчас я тебя научу разрабатывать, отлаживать и получать на выходе почти готовое железо, даже не притрагиваясь к паяльнику и деталям. Клещи, молоток, топор - вот кулхацкера набор!Вообще существует масса систем моделирования электронных схем. Из всех, что я видел, мне больше всего понравились Multisim и ISIS Proteus. Multisim обладает практичным интерфейсом, и в нем удобно отлаживать аналоговые схемы. Он позволяет использовать виртуальные (параметры ты указываешь сам) транзисторы и усилители, но совершенно не поддерживает сложные системы, вроде микроконтроллеров или разного рода драйверов. Напротив, Proteus замечательно умеет работать с контроллерами, но ограничен своей библиотекой реальных элементов, поэтому без знания того, какая именно деталь тебе нужна, ты там мало что сделаешь. Вдобавок он обладает убогим интерфейсом. Однако это лучшая система моделирования, что я когда-либо встречал, а потому описывать буду именно ее. ISIS Proteus – твоя лабораторияИтак, не будем тут растекаться припоем по дорожкам, а приступим к делу. Для начала качни Proteus. Весит он порядка 30 метров в архиве. Самая поздняя версия, которая мне известна, - это 7.2, вот ее и ищи. Учти только, что крякнутая версия Proteus работает порой ну очень странно, например код процессора виден, а отладка не идет и в регистрах левые значения. Потому ищи тщательно :). Скачал – установи! Думаю, с этим ты справишься сам, а потому приступлю собственно к описанию этой чумовой проги. Предлагаю сразу же взять быка за рога и быстренько смоделировать какую-нибудь несложную схему на микроконтроллере. Объяснять где что я буду по ходу дела. Запускай Proteus (ярлык ISIS 7 Professional - прим. Dlinyj), сразу же должно открыться бежевое окно в точечках. Это рабочее поле. Тут мы и построим нашу схему. Для примера сварганим схему на моем любимом контроллере АТ89С51. Она не будет делать ничего особенного, просто будет отсылать в окошко терминала буковки по нажатиям кнопок, приделанных к портам контроллера. Нечто похожее, только на контроллере ATMega8535, было описано мной в прошлом номере «Хакера» – там мы рулили мобильным телефоном. Чтобы добавить компонент, нужно вначале выбрать черную стрелку в левом верхнем углу, а потом нажать кнопочку с лупой и треугольником (на скриншотах я постарался все тебе подписать), она расположена посередине верхней панели инструментов. Откроется огромный список элементов, которые знает Proteus. Библиотеки постоянно дополняются и обновляются, поэтому пошарь по инету в поисках новых деталек. Найди в списке контроллер АТ89С51. Чтобы не возиться, заюзай поиск по ключевым словам: набери просто «АТ89» и увидишь все семейство MSC-51, известное Proteus’у. Выбирай нужный и тыкай ОК. После этого помещай микросхему в удобное тебе место. Сразу оговорюсь, что модели процов в Proteus несколько упрощены, поэтому они не требуют наличия в виртуальной схеме кварца, системы сброса (подтяжка RESET до нужного уровня). Об этом следует помнить, когда в итоге ты будешь делать реальную схему. В противном случае искать причину неработоспособности схемы можно очень долго. Хоть они и не нужны, но детали обвески мы все же добавим. Опять тыкай на лупу с треугольником и ищи там кварц, буржуи зовут его crystal - вот его и ставь на схему рядом с выводами XTAL. Главная убогость интерфейса Proteus заключается в том, что правый клик всегда сначала выделяет, а потом удаляет компонент, а левый ставит новый такой же. Ужасно напрягает! В Multisim все сделано традиционнее и в разы удобнее, но, увы, Multisim не столь могуч. Теперь наведи курсор на вывод кварца и соедини его с выводом XTAL1-процессора, то же проделай и со второй ногой кварца, только для XTAL2. Теперь нам нужны кондеры. Снова лезь в библиотеку и ищи там Capacitors. Ты увидишь огромный список реальных кондеров, выбери какой-нибудь SMT-конденсатор емкостью порядка 33 пф. В верхнем окошке справа будет его обозначение в схеме, а внизу габаритные размеры, а точнее, контактные площадки под его запайку. Кстати, посмотри на окошко чуть ниже строки поиска. Видишь там строку Modeling Primitive? Там есть виртуальные примитивы. Они не имеют корпуса, потому при разводке печатной платы выскочат с ошибкой, но если ты не собираешься разводить плату, а лишь хочешь смоделить схему, то возьми лучше их – их значения можно менять как угодно. Воткни пару кондеров рядом с кварцем и повесь их на ноги кварца одним выводом, а второй объедини и повесь на землю. Где взять землю? Хороший вопрос :). Ищи в левой панели инструментов такие две фиговины, похожие на бирки, зовутся они Terminal mode. Тыкай туда. Рядом слева откроется панелька, где нужно будет выбрать строку GROUND - это и есть земля. Установи ее там, где тебе удобно. Power там же - это напряжение питания схемы. Обычно оно общее, но иногда могут быть заморочки с тем, что у схемы множественное питание (как, например, в компе: там и 5, и 12, и 3,3 В - и вообще тьма разных напряжений). Далее надо собрать схему сброса. Proteus’у это не требуется, он и так будет нормально отрабатывать, но реальной схеме это нужно. Делается это просто. Ставим резистор и конденсатор. При включении, когда конденсатор не заряжен, его сопротивление равно нулю и на вывод RST подается +5 В, то есть логическая единица. Как только кондер зарядится - это произойдет через пару миллисекунд - ножка через резистор будет лежать на земле, а это уже самый настоящий логический нуль, и проц запустится в штатном режиме. Сделай все так, как показано на картинке, и приступай к навеске кнопок на наш девайс. Вешать лучше на порт 1. Почему? Да потому что резисторы дополнительные не нужны. Дело в том, что у С51 порт 0 сделан с возможностью работы на шине данных, то есть имеет так называемое Z-состояние. Это когда на выходе не 1 и не 0, высокое сопротивление (импеданс), почти обрыв, но порт может в это время без палева снифать шину на предмет пролетающих там значений, ничуть не выдавая себя и не мешая другим устройствам. Порт 3 обвешан всякой дополнительной периферией, а порт 2 не очень удобно расположен в модели Proteus’а. Поэтому используем порт 1. Ищи в библиотеке какой-нибудь switch или button. Мне нравится компонент button, потому я заюзаю именно его. Ставлю четыре кнопочки и вешаю их на выводы P1.0, P1.2, P1.4, P1.6, а другие выводы кнопки кладу всем скопом на землю. Как это будет работать? Да очень просто! Вначале вывожу в порт единичку на все выводы. Ножки изнутри сразу же подтягиваются к логической единице. Теперь, чтобы считать данные, достаточно забрать значение из регистра порта P1, а если мы нажимаем какую-либо из кнопок, то эта ножка жестко сажается на землю, пересиливая внутренний подтяг до единицы. То есть нажатая кнопка дает в порту ноль на своем бите. Такой принцип определения нажатия кнопки действителен для всех микроконтроллеров. Также настоятельно рекомендую шунтировать кнопки конденсаторами на 40 пф – не будет ложных срабатываний от импульсных помех (шунтировать – подключать параллельно кнопке - прим. Dlinyj). Это касается реальных устройств, в Proteus’е это не сыграет никакой роли, но я все же добавлю. Все, ввод данных готов. Теперь надо сделать вывод. Для вывода можно тупо повесить на ножки виртуальные светодиоды и виртуально ими помигать, но это моветон, хотя, не спорю, зачастую помогает отлаживать программу. Я же предпочитаю побаловаться моим любимым UART’ом. Проще говоря, терминалкой. Лезем в раздел виртуальных приборов. Находим на левой панели инструментов пиктограмму с нарисованным стрелочным прибором и заходим туда. Там нашему взору будет представлен список всякого хлама, который мы можем юзать: и вольтметр, и амперметр, и осциллограф, и цифровой анализатор, и разные узкоспециализированные приблуды вроде монитора протокола SPI или I2C. Для прикола возьми осциллограф (oscilloscope) и повесь его одним каналом на вывод TxD. Еще нам понадобится Virtual Terminal. Выбирай его и вставляй на схему. А теперь соединяй его выходы с выходами проца крест-накрест. Rx c Tx, Tx с Rx. Готово! Ну и для полного счастья поставь еще светодиод на порт Р2. Как подключать светодиоды к портам проца? Да очень просто! Плюс светодиода вешаешь на питание, а минус - на резистор, а этот резистор - уже на выход процессора. Чтобы зажечь диод, на эту ногу надо выдать ноль. Тогда разница напряжений между напряжением питания и напряжением нуля на ножке будет максимальной и диод загорится. Ищи в компонентах LED, ну и втыкай его, как я тебе сказал. Ты уже, наверное, обратил внимание, что событие мы чаще определяем или устанавливаем по нулю, а не по единице. Это связано с тем, что легче ноль получить принудительно, чем подтягивать ножки вверх. Но это далеко не всегда так, например контроллеры семейства AVR умеют свои ножки наглухо сажать и на ноль, и на напряжение питания, так что там диод зажечь можно и единичкой. Для этого его надо будет перевернуть и вторым концом через резистор повесить не на Power, а на землю. It’s live! It’s live!Так, аппаратную часть мы нарисовали. Пора приступать к настройке и отладке. Код и прошивку ты найдешь на диске - я не буду на них подробно останавливаться, сделав упор на настройку компилятора и отладчика в ISIS Proteus. Выдели микроконтроллер и кликни на нем дважды - откроется окно свойств. Итак, выставь нужную частоту проца, пропиши путь к прошивке, и на этом настройка схемы будет завершена. Можно запускать отладку. Жми кнопку с значком Play, как на магнитофоне. Тут все просто, никаких сложностей. Отмечу только, что пошаговый режим - это просто прерывистый запуск с небольшой временной задержкой. Теперь твоя схема работает. Можешь понаблюдать процессы, происходящие в ней. Если выберешь в панели инструментов вольтметр, то увидишь напряжение. А если заюзать амперметр, можно измерить ток. Цветные квадратики, что зажглись на ножках процессора, - это логические уровни. Синий – ноль, он же земля. Красный – логическая единица, а серый - это высокий импеданс, он же Hi-Z. В принципе уже этого достаточно, чтобы отладить работу девайса. А что, отлаживаем прогу в Keil uVision (если речь идет о С51) или в AVR Studio, компилим и смотрим, что получилось. Это отлично работает на простых девайсах с одним управляющим контроллером и обвязкой. Но вот когда у тебя в системе пашет несколько микроконтроллеров или контроллер и какое-либо шибко умное устройство, например ключ Dallas, то тут начинается неслабый геморрой, так как трудно сказать, в какой момент времени какой из контроллеров что выполняет. В такой ситуации нам на помощь придет внутренний отладчик Proteus, позволяющий отлаживать программу по исходному коду, не выходя из программы. Вскрываем череп контроллеруИтак, действие первое. Нам надо добавить в наш проект исходник. Лезь в меню, отыщи там пункт Source и смело ткни в него недрогнувшей рукой. Выбирай Add/Remove source и добавляй исходник. Чтобы компилятор не тупил, исходники советую ныкать по простым путям, без пробелов и русских букв. Например, как у меня: «d:\coding\C51\hack_2.asm». Добавляя исходник, не забудь указать компилятор, которым его надо будет компилить. Для этого случая в Code generation tools надо указать ASEM51, то есть компилятор архитектуры MCS-51. Жми ОК, и в меню Source появится еще один пункт – добавленный исходный файл, при выборе которого автоматом открывается редактор, и можно оперативно подправить текст программы. Действие второе. Настройка компилятора. Снова лезь в меню Source и ищи там пункт Define Code Generation Tools - это опции компилера. Изначально они настроены криво - в разделе Make rules тычь в строку Command Line и выноси оттуда весь мусор, что там есть. Оставь только «%1» без кавычек. ASEM51 - умная зараза, он сам добавит нужные файлы с описаниями регистров и переменных, тем более что у семейства MСS-51 все адреса одинаковые. Действие третье. Жми в том же меню Source пункт Build All и получай на выходе hex-файл, но уже местной выделки. Там же моргнет окно компилятора, в котором будут сведения об ошибках и ряд служебных данных. Действие четвертое. Запускай схему кнопкой Play в нижней панельке и сразу же устанавливай либо паузу, либо пошаговый режим. Должно открыться окно с кодом программы, как в уже привычном тебе отладчике. Если не открылось, то ты можешь найти его в меню «Debug -> 8051CPU -> Source Code - U1». Там же будет масса других полезных вещей, как, например, содержимое регистров процессора или памяти программ/данных. Ну а далее все просто – обычный отладчик, в котором ты, надеюсь, работал уже не раз. Кнопочки вверху окна исходного кода управляют исполнением кода. Назначение кнопок
Кружочки со стрелочками – установка/снятие/отключение точек останова Breakpoint. Брейкпоинт - это такое место в программе, где твоя прога встанет, как вкопанная, и дальше пойдет лишь с твоего согласия, незаменимая вещь при отладке. При добавлении в проект второго проца его код, регистры и память будут там же, но называться будут уже Source Code – U2 и т.д. Кроме того, в директории Proteus’a есть папка SAMPLES - в ней куча разных весьма сложных примеров, показывающих возможности системы ISIS Proteus. ARES – разводит не по-детски!Итак, ты отладил схему, все работает, виртуально все отлично. В принципе все уже готово, пора мутить печатную плату. Если схема простая, то лучше взять Sprint Layout и развести схему вручную. Но если и это в лом, то можно заюзать встроенный в Proteus трассировщик – ARES. Но для этого при составлении схемы нужно, во-первых, указать тип корпуса абсолютно всех элементов, а во-вторых, не забыть разного рода кварцы и конденсаторы, без которых в Proteus’е модель работать будет, а вот в реале, возможно, даже не запустится. Для перехода в ARES достаточно лишь нажать кнопочку с надписью «ARES» в верхней части экрана. Очевидно, не правда ли? Proteus предложит сохранить соединения в NetList, скажи да и приступай к разводке платы. Сразу предупрежу, что развести печатную плату можно только на секс - долгий и нудный трах с проводочками, гоняя их туда-сюда. Следя, чтобы все было подключено и нигде не коротнуло, чтобы дорожки не оказывались слишком узкими и было как можно меньше перемычек или чтобы они не пытались лезть между ножками микросхем. В домашних условиях такие платы разводить сущее мучение. Скажу честно, в ARES я особо не врубался, так как обычно развожу платы вручную, поэтому синяки и шишки о его интерфейс ты будешь набивать без меня. Могу только дать парочку советов. Во-первых, среди инструментов ARES есть две мегавещи. Первая - это AutoPlacer, оптимально размещающий компоненты на плате. Вторая - это AutoRouter, красиво автоматом разводящая все дорожки. Для того чтобы эти штуки сработали, нужно указать границы платы. Поэтому найди там внизу экрана селектор слоев, выдели на нем желтый слой (Board Edge) и нарисуй в рабочем поле какой-нибудь замкнутый контур (на правой панели инструментов увидишь такие салатового цвета квадрат, круг, линию... хм, задницу… вот ими и надо нарисовать границы платы). Когда укажешь границы платы, можешь смело жать сначала AutoPlacer, а потом AutoRouter. Их кнопочки расположены на верхней панели инструментов. Когда после недели шаманских манипуляций с автотрассировщиком ты наконец получишь адекватный результат, можешь считать, что ты достиг просветления и обрел силу. Теперь, как истинный фрик-джедай, ты имеешь полное право заюзать лазерный утюг и изготовить себе печатную плату девайса. ЗаключениеТеперь ты понимаешь, что для достижения просветления не нужно корпеть с паялом в руках сутками, покупая горы деталей, и материться, когда твоя схема в очередной раз запылает синим пламенем. Все значительно проще – моделируй схемы на компе, отлаживай. И только когда все заработает в вирте, переноси в реал. Удачи хацкер! Лазерный утюг – оружие настоящего джедая!Лазерный утюг - это широко известная технология изготовления печатных плат почти промышленного качества. Вкратце это можно описать так: рисунок платы в зеркальном отображении печатается на лазерном принтере, затем отпечаток накладывается на текстолит и проглаживается утюгом. Бумага смывается, а тонер остается. Далее это дело кидается в раствор хлорного железа, и через минут 30 ты становишься счастливым обладателем печатной платы с абсолютно ровными и красивыми дорожками. От себя добавлю, что идеальным материалом для печати является подложка от самоклеющихся пленок – ее не надо отмачивать, можно просто оторвать. Погугли по ключевым словам «изготовление плат методом ЛУТ» и найдешь миллион и одну публикацию на эту тему. Кстати, с поста про ЛУТ началось сообщество ru_radio_electr в ЖЖ. Можешь копнуть в сообществе, там навалом постов по этой теме, как моих, так и Dlinyj. |