Занимательная электроника — страница 101 из 128

Arduino, ни заранее встроенным в контроллер загрузчиком. Информацию о том, как обращаться с AVRDUDE, можно найти на множестве ресурсов в Сети[31]. Эта утилита и связанные с ней программные средства (вроде WinAVR), в частности, позволяют применять простейший самодельный программатор, подключаемый к порту LPT.

Упомянутые фирменные программаторы от Argussoft имеют больше контактов: между сигнальными линиями проложены дополнительные линии «земли» и всего контактов получается 10[32]. Разводка этого разъема показана на рис. 19.2 далее.

Отметьте, что каждый сигнальный вывод «подтянут» к питанию внешним резистором — так надежнее. При отсчете выводов имейте в виду, что нумерация контактов PLD-разъемов отличается от обычной и делается не в обход, как у микросхем, а следующим образом: если глядеть на «папу» сверху (т. е. со стороны подсоединения проводов), то вывод номер 1, как и положено, находится слева внизу, вывод 2 — над ним, вывод 3 — следующий за первым в нижнем ряду и т. д., т. е. нижний ряд — это все нечетные, а верхний — все четные контакты. Это сделано потому, что разъемы PL могут иметь не строго фиксированное количество контактов, но при любом их количестве имеющиеся контакты будут нумероваться одинаково.

Если не поняли, то поглядите на разводку любого PLD-разъема на материнской плате компьютера, которая обычно приведена прямо на ней (а также, как правило, имеется в руководстве).

* * *

Подробности

Так как игольчатые разъемы типа PLD и IDC с шагом 2,54 мм встречаются в практике изготовления микроэлектронных устройств довольно часто, то стоит разобраться в их маркировке. Начнем с того, что наименование IDC в случае штыревых разъемов для установки на плату относится к разъемам в кожухе с ключом (именно такие используются для подсоединения жесткого диска в ПК). Бескорпусные подобные разъемы носят название PLD для двухрядных (или PLS для однорядных) типов и более удобны в радиолюбительской практике, т. к. длинные разъемы легко отломать в нужном месте, чтобы обеспечить необходимое количество выводов (правда, при этом лучше все же обозначать на плате первый вывод, чтобы не перепутать ориентацию при включении).

Разметка на плате для обоих типов разъемов (и с кожухом и без) одинакова, поскольку все равно приходится учитывать место, которое займет кабельная розетка при ее подсоединении, и мы в этой книге вперемешку упоминаем IDС и PLD. Разумеется, розетка, которая используется для установки на плоский кабель, может иметь только фиксированное число контактов (из ряда 6, 10, 14, 16, 20, 22, 24, 26, 30, 34, 36, 40, 44, 50, 60…), что нужно учитывать при проектировании.

Цифра после обозначения разъема (IDC-10 или PLD-10) — это количество контактов разъема, а следующая буква символизирует его конфигурацию: М (male, «папа») для штыревой части и F (female, «мама») для гнездовой. Далее может следовать еще одна буква, которая обозначает ориентацию: S для прямых выводов (разъем перпендикулярен плате), R для повернутых под углом 90° (разъем параллелен плате). Таким образом, приведенное далее на схеме рис. 19.2 обозначение IDC-10MS означает штыревой («папа») разъем в кожухе с ключом и с 10-ю прямыми выводами. Соответствующая этому разъему кабельная часть обозначится, как IDC-10F. Бескорпусные PLD-разъемы бывают, естественно, только штыревые, потому для них буквы М и F не указываются (а повернутые под углом 90° дополняются буквой R).

* * *

Вопрос, который при этом немедленно возникает: не жирно ли занимать как минимум три вывода портов (обычно это порт В контроллера) альтернативными функциями? Отвечаю: в большинстве случаев такие выводы можно использовать как обычные порты, программатору это не помешает. Единственная ситуация, в которой возникает конфликт между программатором и схемой, это если выводы MOSI, MISO и SLK используются как входные линии и подсоединены к активным выходам других микросхем, к коллектору открытого транзистора или к конденсатору большой емкости. Поэтому в схеме эти контакты лучше использовать в качестве выходных линий, а если хватает других портов — вообще оставить их только для программирования. На платах Arduino, где контакты штатного SPI-порта совпадают с портом программирования, они выведены, как обычные линии (выводы D11, D12 и D13[33]), и в случае их использования для программирования к ним тоже не рекомендуется подключать низкоомную нагрузку. Естественно, при работе схемы программатор лучше отключать вовсе, только учтите, что по окончании цикла программирования в любом случае схема заработает сразу с начала, как после включения питания.

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


Софт

Если мы имеем какой-то программатор с прилагающимся к нему софтом, то, в сущности, нам нужна еще только одна специальная программа — ассемблер (assembler значит «сборщик»). Его можно бесплатно скачать с сайта Atmel в составе AVR Studio (папка avrassembler), файл носит название avrasm2.exe. Практически все существующие ассемблеры запускаются из командной строки (хотя могут быть и упакованы в оболочку с графическим интерфейсом). В качестве параметров для компилятора Avrasm2 указывается имя файла с исходным текстом программы и имена выходных файлов, главным из которых является файл с расширением hex. Чтобы каждый раз не вводить длинную командную строку, пишется соответствующий bat-файл.

* * *

Подробности

Предположим, у вас файл avrasm2.exe находится в созданной вами папке c.\avrtools. Запустите Блокнот и введите следующий текст (соответственно измените путь, если папка другая):

c: \avrtools\avrasm2 — fI %1.asm

Строка эта может выглядеть и несколько иначе:

c: \avrtools\avrasm2 — е %1.еер — fI %1.asm

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

Сохраните созданный файл под названием, например, avrasm/bat. Пусть текст созданной вами программы находится в файле programm.asm, тогда достаточно в командной строке запустить avrasm.bat с параметром рrоgrаmm (если надо, то с путем к нему, а расширение добавится автоматически), и в той же папке, где находится последний, создастся файл рrоgrаmm.hex. При этом откроется DOS-окно, в котором будут проанализированы ошибки, если они есть (тогда выходной файл не создастся), а если все в порядке — указан объем полученной программы в двухбайтных словах (учтите, что размер hex-файла ни о чем не говорит).

* * *

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

Исходные тексты ассемблерных программ можно создавать в любом текстовом редакторе (разве что к результатам деятельности Microsoft Word следует относиться с осторожностью). Но, несмотря на широкий выбор, есть по крайней мере две причины, по которым лучше все же использовать редакторы специализированные.

Первая причина — это так называемый highlighting или подсветка синтаксиса по-русски. Те, кто пользовался любыми средами высокоуровневого программирования (от Turbo Pascal до Delphi или Visual Basic), хорошо знают, что это такое — служебные слова, комментарии, разные типы выражений выделяются каждый своим цветом или шрифтом, что сильно облегчает чтение текста и служит заодно неплохим средством проверки правильности написания. Но если эту опцию предлагает множество фирменных и не очень редакторов, то вторая желательная функция есть лишь у считанных единиц. Я имею в виду возможность прямо из редактора с помощью горячих клавиш запускать процесс ассемблирования. В этом случае вы можете «не отходя от кассы», т. е. не покидая редактор, одним нажатием горячих клавиш сразу же ассемблировать написанный текст и ознакомиться с сообщениями об ошибках.

Еще одна причина для использования специализированных редакторов — они автоматически нумеруют строки. Причем пустые строки также входят в нумерацию — так проще считать. Если у вас есть ошибки в программе, то ассемблер укажет номер строки