РАЗРАБОТКА И ОТЛАДКА УСТРОЙСТВ НА МК (Часть 2)


А. ДОЛГИЙ, г. Москва

Иногда встречаются файлы НЕХ-подобного формата, в которых принцип записи адресов и данных мало отличается от принятого в Intel HEX, но признаками начала строки вместо двоеточия служат, например, дробная черта, знак минус, буква S и т. п. Используются и другие алгоритмы подсчета контрольной суммы. Она может, например, состоять из двух байтов.

Большинство программаторов воспринимает файлы и так называемого "сырого" двоичного (raw binary) формата. Они, как правило, носят имена с расширением .bin и содержат точную двоичную копию содержимого памяти МК. Единственное преимущество подобных файлов - минимальный объем, занимаемый на диске компьютера, главный недостаток - отсутствие каких-либо адресов, контрольных сумм и других дополнительных сведений. При попытке просмотреть такой файл с помощью текстового редактора чаще всего не удастся увидеть на экране ничего, кроме бессмысленного набора символов. Но иногда они складываются в тексты сообщений, выводимых МК в процессе работы на индикатор, в название программы или товарный знак ее разработчика (собственника). Никогда не пытайтесь с помощью текстового редактора внести в двоичный файл какое-либо, даже самое незначительное изменение, а на предложение того же редактора сохранить этот файл всегда отвечайте отрицательно. Иначе хранящаяся в нем программа может оказаться безвозвратно испорченной.

HEX- и двоичные файлы - конечный продукт ассемблеров, трансляторов языков высокого уровня и других средств разработки программ. Однако на разных этапах своей работы все эти программные средства создают и используют большое число других файлов, содержащих промежуточные результаты трансляции, данные о размещении в памяти МК программы в целом, ее фрагментов и переменных, об установленных (в том числе по умолчанию) режимах трансляции, отчеты о ходе работы и много другой полезной информации.

Кроме файла листинга (.lst) - полного текстового отчета о выполненной трансляции программы, больше всего информации о ней содержат так называемые "объектные" файлы с расширениями .obj, .out, .cod и некоторыми другими, однако их форматы очень разнообразны и сложны. Их описание заняло бы слишком много места. К тому же программисту обычно нет необходимости специально "заглядывать" в эти файлы, все, что нужно, система разработки записывает, читает и выводит на экран самостоятельно. Прибегают к этому лишь в самых крайних случаях, когда другие способы найти сложную ошибку и устранить ее последствия исчерпаны или когда приходится восстанавливать частично утраченные в результате сбоя данные.

Прежде чем перейти собственно к программаторам, посмотрим, какими бывают МК с точки зрения занесения в них программы. Первая категория - МК, запрограммированные на заводе. Некоторые из них оснащают так называемым масочным ПЗУ. В технологическом процессе изготовления микросхемы маска - примерно то же, что и фотошаблон при изготовлении печатной платы. Разработка и изготовление маски недешевы, а чтобы внести в программу самое незначительное изменение, требуется делать новую. Поэтому ма-сочные МК окупаются лишь при массовом производстве однотипных изделий с многократно "обкатанной" программой, например, контроллеров бытовых приборов широкого применения. Ясно, что использовать такой МК не по прямому назначению невозможно.

Другая разновидность МК - обычные однократно программируемые приборы (ОТР - One Time Programmed; они будут рассмотрены ниже), уже запрограммированные на заводе-изготовителе. Заказчику остается решить, что выгоднее: передать файл с исходными данными на завод и получать уже готовые к использованию МК или организовать программирование у себя. Но эта проблема уже не техническая, а экономическая.

Основную массу однократно программируемых МК поставляют потребителю "чистыми", готовыми к приему любой программы. Таковы изделия семейства PICmicro, имеющие в обозначении буквы С или CR (например, PIC12C508, PIC16CR84). Запрограммировать их можно всего один раз без гарантированной возможности что-либо откорректировать или просто исправить ошибку. (Оговорка "гарантированной" - не случайна, нередко, особенно в любительской практике, кое-что изменить все-таки удается).

Не будем рекомендовать экзотические приемы, подобные стиранию памяти с помощью рентгеновского излучения. Учитывая большую энергию рентгеновских квантов, неизвестную проницаемость для них корпуса микросхемы и многие другие факторы, очень трудно дозировать облучение с точностью, необходимой для полного стирания информации без необратимых изменений в элементах микросхемы, не говоря уже об опасности рентгеновских лучей для оператора.

Лучше воспользоваться тем, что возможность однократно изменить свое исходное состояние имеет не память в целом, а каждый разряд всех ее ячеек. Обычно после первого программирования во внутреннем ППЗУ МК остается достаточно много неиспользованных, находящихся в исходном состоянии ячеек. Ничто не мешает занести в них новую программу. Проблема лишь в том, каким образом заставить МК выполнять эту программу вместо старой.

Тем, кто знаком с программированием, поясним, как это сделать. Следует заранее побеспокоиться о том, чтобы при первом программировании в ячейку, с которой МК начинает выполнять программу после сброса (в большинстве случаев нулевая), была записана команда безусловного перехода на действительное начало программы, а одна или несколько следующих ячеек остались незапрограммированными. При втором программировании стартовую ячейку "портят", превращая находящуюся в ней команду в любую другую, с переходом не связанную. А в следующую ячейку записывают команду безусловного перехода к началу новой программы. Подобным же образом удается заменить отдельную подпрограмму. Главное - предусмотреть эту возможность, начиная подпрограмму последовательностью из команды безусловного перехода и незапрограммированной ячейки. Все это можно повторять до исчерпания свободного места в памяти программ МК.

Из сказанного следует, что повторно использовать "одноразовые" МК удастся лишь тем, кто разрабатывает программы самостоятельно, строго соблюдая определенные правила. Однако нет никакого смысла придерживаться этих правил в программах, предназначенных для коммерческого использования, проще при необходимости заставить потребителя оплатить стоимость новой микросхемы. Поэтому ОТР МК, извлеченный из какого-либо готового изделия, перепрограммировать, скорее всего, не удастся.

ОТП МК совершенно непригодны для отладки вновь разрабатываемых программ, где неизбежны многочисленные поправки. В этих случаях используют их многократно программируемые аналоги. По своим характеристикам они идентичны соответствующим одноразовым, но помещены в корпус, снабженный прозрачным окном над кристаллом. Это позволяет с помощью ультрафиолетового излучения стереть содержимое внутренней памяти, после чего микросхема вновь готова к программированию. Отличительный признак подобных микросхем фирмы Microchip - буквы JW в конце условного обозначения.

Нужно сказать, что из-за дороговизны корпуса с окном разница в стоимости одно- и многократно программируемого вариантов одного и того же МК достигает десятикратной. К тому же допустимое число циклов стирания-программирования ограничено (порядка сотни раз). По этим причинам все большее распространение получают МК с так называемой FLASH-памя-тью программ, устроенной таким образом, что стирание и запись информации выполняются с помощью электрических импульсов, формируемых внутри самой микросхемы. При этом не требуется не только какого-либо облучения, но и подачи на выводы микросхемы повышенных (по сравнению с обычным режимом работы) напряжений (иногда за исключением сигнала разрешения перехода в режим программирования).

МК с FLASH-памятью программ рассчитаны на 1000 и более циклов перепрограммирования и всего в полтора-два раза дороже однократно программируемых. Они наилучшим образом подходят для разработки опытных образцов изделий и любительского конструирования. К их числу относятся МК семейств AT89S, AT90S (AVR) фирмы ATMEL и те из PICmicro, в названии которых имеется буква F (PIC16F84, PIC16F628).

А теперь перейдем собственно к программированию МК и программаторам. При возможностях полупроводниковой технологии, имевшихся в эпоху первых МК семейств MCS-48 (К1816ВЕ48), MSC-51 (K1816BE51), было слишком сложно и экономически невыгодно размещать на их кристаллах узлы, нужные только в процессе программирования и фактически бездействующие в дальнейшем. Поэтому основная "тяжесть" обеспечения нужных для программирования режимов ложилась "на плечи" программатора, представлявшего собой довольно громоздкое устройство. МК приходилось подключать к нему, занимая чуть ли не все 40 выводов микросхемы.

Сегодня почти все необходимое для программирования, в том числе источники повышенного напряжения и генераторы сложных импульсных последовательностей, находится внутри самих МК. Число выводов, соединяемых с программатором, сокращено до минимума. Обычно достаточно линии синхронизации, одной-двух линий для передачи последовательным кодом команд, адресов и данных и еще одной для подачи сигнала, переводящего МК в режим программирования. Справедливости ради отметим, что наряду с "последовательным" в некоторых многовыводных МК сохранен режим "параллельного" программирования, причем возможности последнего, как правило, шире, чем первого.

Аппаратная часть программатора во многих случаях превратилась в простой буфер, согласующий логические уровни сигналов одного из портов компьютера и МК. Сравнительно сложной она остается лишь у приборов, способных работать с программируемыми микросхемами различных типов. В них либо приходится устанавливать множество панелей (под разные микросхемы), либо предусматривать непростую систему электронной коммутации выводов единственной панели.

В любительских условиях довольно сложно изготовить полноценный универсальный программатор. Да и делать это не имеет смысла. Достаточно собрать простейший базовый блок, по мере надобности дополняя его столь же простыми переходными панелями (адаптерами) для программирования микросхем того или иного типа. Именно так построен известный многим посетителям Интернета программатор PonyProg2000, разработанный итальянцем Клаудио Ланконелли. На сайте <www.lancos.com> помещены схемы узлов этого программатора, программное обеспечение к нему и описание пунктов экранного меню. К сожалению, русскоязычной версии программного обеспечения пока (на апрель 2001 г.) нет, так как у нашего итальянского коллеги возникли трудности с "подключением" кириллицы к своим программам. Надеемся, к моменту выхода из печати этого номера журнала он их преодолеет. С его согласия мы публикуем схемы узлов программатора с заменой импортных компонентов отечественными. Печатные платы, в том числе и в этой части статьи, отличаются от авторских, они разработаны по заданию редакции. Принципиальная схема базового блока программатора РопуРгод2000 изображена на рис. 2, а чертеж его печатной платы - на рис. 3. Розетку XS1 стыкуют с вилкой одного из последовательных (СОМ) портов компьютера непосредственно или через кабель длиной до 1 м, в котором контакты вилки и розетки соединены "один к одному". Учтите, что распространенный "нуль-модемный" кабель с перекрестным соединением контактов в данном случае непригоден.

pic-501-5.gif
Рис. 2

pic-501-6.gif
Рис. 3

Особенность блока в том, что для питания программируемой микросхемы используется выпрямленное диодами VD1, VD2, VD4 напряжение, снимаемое с выходных линий порта. Микросхема DA1 - стабилизатор напряжения +5 В. Рекомендуемая автором микросхема LM2936-Z5 отличается предельно малым (измеряемым единицами микроампер) собственным потреблением, но опыт показывает, что на ее месте с успехом работают и другие интегральные стабилизаторы, в том числе отечественный КР142ЕН5А.

Можно воспользоваться и внешним 12-вольтным источником питания, подключив его к разъему Х1 и переведя переключатель SA1 в соответствующее положение. Такая необходимость возникает, когда потребляемый программируемой микросхемой ток превышает 2...3 мА, что создает слишком большую нагрузку на СОМ-порт. В этом случае подачей напряжения питания на программируемую микросхему управляет ключ на транзисторах VT1 и VT2.

Преобразование логических уровней сигналов на выходах порта в требуемые для программирования осуществляется простейшим способом - с помощью ограничителей напряжения из резисторов R2, R4, R5 и стабилитронов VD3, VD5, VD6. В оригинальной конструкции применены стабилитроны с напряжением стабилизации 5,1 В, не имеющие отечественных аналогов. Если в результате их замены на КС147А уровень лог. 1 окажется недостаточным (что, впрочем, маловероятно), его можно повысить, включив последовательно со стабилитронами кремниевые диоды любого типа (на рис. 2 они показаны штриховыми линиями). Заменять КС147А на КС156А не следует.

Каскад на транзисторе VT3 инвертирует сигнал, формируемый компьютером на выводе 3 СОМ-порта. В результате на контактах 2 и 3 вилки ХР1 образуются два взаимно инверсных импуль-

са сброса. Используют тот, полярность которого соответствует необходимой для конкретного МК. Перемычка между выводами 6 и 7 розетки XS1 позволяет компьютеру убедиться, что программатор подключен к порту.

По цепи контакт 6 ХР1 - контакт 8 XS1 в компьютер поступают считываемые из МК данные. Может возникнуть вопрос: каким образом входной i узел СОМ-порта, зона нечувствительности которого к помехам согласно стандарту RS-232 не должна выходить , за пределы ±3 В, без всяких преобразований принимает формируемый МК


сигнал с ТТЛ-уровнями? Оказывается, оба пороговых уровня (срабатывания и отпускания) триггеров Шмитта, установленных на подобных входах большинства современных компьютеров, находятся в интервале + 1,5...2,5 В. Отличие этих входов от обычных ТТЛ лишь в способности выдерживать без повреждения напряжение до ±25 В. С СОМ-портом, выполненным строго по стандарту, программатор PonyProg2000 (как, впрочем, и многие другие) работать не будет, придется вводить в него источник отрицательного напряжения и дополнительный преобразователь уровня.

Если по каким-либо причинам подключать программатор к СОМ-порту нежелательно, можно воспользоваться параллельным LPT. Никаких преимуществ это не дает, так как протокол обмена данными остается прежним. Поскольку преобразования уровней не требуется, схема базового блока, подключаемого к порту LPT, очень проста (рис. 4). "Внутреннего" питания она не предусматривает, а узел коммутации внешнего напряжения аналогичен показанному на рис. 2. Прототип этой схемы был опубликован вместе с одной из первых версий программного обеспечения PonyProg. К сожалению, его автор не сообщает, совместимы ли последние версии с подобным блоком. Возможны различия в выборе выводов LPT-порта для формирования и приема тех или иных сигналов.

Радио 6/2001, с.24-26.