Микроконтроллеры AVR - с чего начать | Контроллер | Управление программатором | Программирование | Ссылки |
Для
просмотра рисунков в крупном масштабе щелкните
по ним мышкой.
Здесь свалена информация о микроконтроллерах AVR с предыдущей версии сайта, ссылки могли устареть.
Хотя сначала мне показалось более удобным иметь два программатора в одном (скорее потому, что ByteBlaster уже был), оказалось, что лучше пользоваться двумя отдельными программаторами, в связи с этим программное обеспечение для программатора ByteBlaster+AVR ограничилось поддержкой микроконтроллеров AVR серии AT90, дальнейшее развитие ПО (поддержка ATtiny, ATmega, программирование Fuse-битов) шло под схему, приведенную на странице ПУБЛИКАЦИИ.
В сети можно найти множество программаторов для микроконтроллеров AVR. Для разработки контроллеров удобен программатор с последовательной загрузкой программ (Serial Downloading), позволяющий программировать МК в системе, то есть, для перепрограммирования не требуется извлекать МК с платы контроллера, на плате контроллера предусматривается дополнительный разъем для программирования (обычно на плату контроллера устанавливают разъем BH-10, а шлейф программатора заканчивается разъемом IDC-10).
Такой программатор обычно подключается к СОМ- или LPT-порту компьютера (далее - РС). Преимуществом подключения к СОМ-порту является возможность использования длинного кабеля РС-программатор. К недостаткам следует отнести
-относительную сложность изготовления: в таком программаторе обычно используется микроконтроллер AVR, в который в свою очередь должна быть записана программа каким-либо другим программатором,
-использование программатором СОМ-порта.
Этих недостатков лишен программатор, подключаемый к LPT-порту РС, хотя в этом случае приходится отключать принтер. Для изготовления такого программатора микроконтроллеров AVR требуется лишь буферная ИС, например, КР1533АП5 или ее аналог 74HC244 и несколько пассивных элементов, а плата может быть размещена в корпусе стандартного 25-контактного разъема DB-25, подключаемого к LPT-порту РС (существуют разновидности такого корпуса - металлический на винтах и пластиковый на защелках, корпус на защелках более вместителен). Питание буферной ИС поступает с платы программируемого контроллера.
В своем программаторе я использую кабель длиной в 1 метр.
Поскольку СОМ-порт остается свободным, можно проводить отладку программ связи контроллера с РС через СОМ-порт, не отключая программатор - а при многократном перепрограммировании МК это существенное удобство . Для этого лишь необходимо, чтобы в программаторе (в схеме и в ПО) была предусмотрена возможность отключения его линий от контроллера по окончании программирования.
При желании "мощно сэкономить" и рискнуть целостностью LPT-порта и МК можно отказаться от буфера и ограничительных резисторов, тогда программатор можно сделать из двух разъемов и пяти проводов. Правда, в таком варианте провода надо делать очень короткими.
Простая схема такого программатора с программным обеспечением скачивается здесь. Это fbprg.pdf (схема подключения AVR-микроконтроллеров к LPT-порту), то же - fbprg.gif (разница лишь в формате файла; картинка в fbprg.pdf качественнее), программное обеспечение - в fbprg.zip (здесь же схема и печатная плата для подключения микроконтроллера AT90S1200). Схема отличается тем, что питание и тактирование программируемого микроконтроллера AVR осуществляется от компьютера через LPT-порт. Достоинства: минимум деталей - нужны 25-контактный разъем (папа) для LPT-порта и 3 резистора (кварцевый резонатор и источник питания не требуются).
Недостатки: опасность вывести из строя LPT-порт, необходимость использовать короткие проводники, невозможность программирования микроконтроллера AVR в составе системы (контроллера), вероятность сбоев во время программирования за счет перекрестных наводок на линиях программатора. Но, используя такой программатор, можно прошить микроконтроллер AVR программатора, подключаемого к СОМ-порту РС.
Ознакомление с разделом Memory Programming, часть "Serial Downloading" технического описания какого-либо МК серии АТ90 или ATMega помогло написать собственное программное обеспечение.
Первоначально мне показалось удобным изготовить программатор микроконтроллеров AVR на основе ByteBlaster, рекомендуемого для программирования в составе системы PLD ALTERA (программируемые логические устройства компании ALTERA). Для программирования микроконтроллеров AVR понадобилось добавить всего одну линию и изготовить переходник для микроконтроллеров AVR. Необходимо также разработать собственное программное обеспечение.
От переходника можно отказаться, но тогда у вас будет программатор с отличающейся от предлагаемой корпорацией Atmel цоколевкой разъема (это не страшно, тем более, что в разных программаторах Atmel для микроконтроллеров AVR используются как минимум две разные цоколевки). Кроме того, в ByteBlaster не рекомендуется использовать кабель длиннее 25 см, а переходник позволит получить кабель для программирования МК суммарной длиной 1 м (25 см кабель ByteBlaster + длина кабеля переходника). Правда, длину кабеля ByteBlaster можно значительно увеличить, если разместить плату программатора не в корпусе разъема , подключаемого к LPT-порту РС, а рядом с программируемой платой. Но такой вариант менее удобен в эксплуатации.
Схема программатора ByteBlaster находится здесь.
Для массового программирования микроконтроллеров AVR более подойдет параллельный программатор. Но если для последовательного программиорвания используется 4 сигнальные линии и 2 линии питания, то для параллельного - порядка 20-ти линий (их число отличается для разных типов МК).
В таком программаторе можно соединить несколько розеток с программируемыми микроконтроллерами AVR и программировать их одновременно.
Вам такой программатор не нужен? Ошибаетесь. Например, при программировании микроконтроллеров AVR серии ATMega есть возможность использовать контакт RESET МК в качестве еще одного контакта порта ввода-вывода, для этого программируется один из Fuse-битов МК, но после этого дальнейшее последовательное программирование невозможно, так как оно требует использования этого контакта в его первоначальной функции RESET. Восстановить эту функцию можно только при параллельном программировании.
Поскольку при работе с МК серии ATMega без программирования Fuse-битов не обойтись, возможна и ошибочная запись, делающая невозможным дальнейшее последовательное программирование, так как существует Fuse-бит, отвечающий за разрешение/запрет последовательного программарования.
С целью восстановления возможности последовательного программирования можно сделать параллельный программатор с единственной программной функцией восстановления Fuse-битов МК.
Так как мне нужен был программатор ByteBlaster, подключаемый к LPT-порту, работающий по такому же алгоритму и дающий возможность программировать PLD ALTERA, то я воспользовался его схемой и изготовил съемный переходник для подключения к разъему с цоколевкой, рекомендованной корпорацией ATMEL для программирования микроконтроллеров AVR. Кроме того, в ByteBlaster довольно удачно выбраны контакты с позиции написания управляющей программы. Для пущего комфорта в написании программы я использовал незадействованный ключ элемента DD1, подключив его к конт.16 разъема DB-25M, что позволило в программе использовать отдельный порт для управления линией SCK. При некотором усложнении программы это можно было проделать и через конт.8 разъема DB-25M, оставив ByteBlaster в первозданном виде.
Вы можете посмотреть схему комплекта дополненный ByteBlaster - переходник для AVR здесь.
Для программирования микроконтроллеров AVR в составе отладочного комплекта STK-200 применяется такой же 10-контактный разъем BH-10, но с подключением цепей к другим контактам; в программаторе AVR910 рекомендуется использовать шестиконтактный разъем. Я использовал разъемы BH-10 с шагом между контактами 2,54 мм. Использование таких разъемов удобно тем, что на плате контроллера можно установить даже не разъем, а три или пять секций двухрядных джамперов, которые продаются в виде длинных пластиковых линеек, от которых можно отломить нужное число секций.
Если отказаться от переходника, то цепи 10-контактного разъема ByteBlaster можно обозвать, например, так:
Цепь | MOSI | VCC(+5V) | RESET | SCK | MISO | GND(0V) |
Контакт | 1 | 4 | 5 | 6 | 7 | 2 или 10 |
Разместив ответный разъем на плате контроллера, соедините его контакты с одноименными контактами микроконтроллера AVR (так, контакт 1 (MOSI) разъема соединяется с контактом MOSI используемого микроконтроллера AVR). Соединение контактов разъема 2 и 3 на плате контроллера позволит программно определять, подключен ли контроллер к программатору.
Однако изготовление переходника позволит программировать микроконтроллеры AVR в составе контроллеров с разъемами, рекомендуемыми корпорацией ATMEL (а вдруг захочется). Привожу соединения между контактами разъемов переходника:
Цепь | MISO | VCC(+5V) | SCK | MOSI | RESET | GND(0V) | Резерв | Перемычка |
к AVR(6 или 10 контактов,мама) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | - |
к ByteBlaster(10 контактов,папа) | 7 | 4 | 6 | 1 | 5 | 10 | 9 | 2 и 3 |
Эксплуатация показала, что изготовленный программатор удобен в работе, однако имеет недостатки, к которым я отнес бы короткий кабель и то, что для уменьшения времени программирования микроконтроллера AVR необходимо подбирать разные задержки на разных компьютерах.
Для подключения к компьютеру используется разъем DB-25M.
Контакт | Наименование | Порт | Номер бита | Направление | Инверсия |
2 | DATA 0 | 378h (278h) | 0 | выход | нет |
3 | DATA 1 | 378h (278h) | 1 | выход | нет |
7 | DATA 5 | 378h (278h) | 5 | выход | нет |
8 | DATA 6 | 378h (278h) | 6 | выход | нет |
9 | DATA 7 | 378h (278h) | 7 | выход | нет |
10 | ACK | 379h (279h) | 6 | вход | нет |
11 | BUSY | 379h (279h) | 7 | вход | есть |
12 | PE | 379h (279h) | 5 | вход | нет |
13 | SLCT | 379h (279h) | 4 | вход | нет |
14 | AutoLineFeed | 37Ah (27Ah) | 1 | выход (вход) | есть |
15 | ERROR | 379h (279h) | 3 | вход | нет |
16 | INIT | 37Ah (27Ah) | 2 | выход (вход) | нет |
18...25 | 0V | - | - | - | - |
Если используется порт LPT1, программное управление производится через порты 378h, 379h и 37Ah; для порта LPT2 - через 278h, 279h и 27Ah.
Направление ВЫХОД означает, что информация выводится из компьютера. ВЫХОД (ВХОД) - возможны оба направления, но в программаторе используется ВЫХОД. Наличие ИНВЕРСИИ означает, что при записи единицы в бит слова, выводимого в порт, на соответствующем контакте будет ноль. Инверсия при приеме и передаче проверялась экспериментально.
Воспользуемся схемой программатора с переходником и таблицей контактов LPT-порта.
Простая программа на Pascal иллюстрирует организацию управления.
const bit0=1; bit1=2; bit2=4; bit3=8; bit4=16; bit5=32; bit6=64; bit7=128;
var B:byte;
begin
Port[$378]:=bit7+bit5; | {в порт 378h посылается 128+32, высокие уровни на контактах 9 и 7} |
Readln; | {проверьте уровни на контактах 2, 3, 7, 8 и 9, затем нажмите ENTER} |
Port[$37A]:=bit1+bit2; | {на конт.14 низкий уровень (он с инверсией), на конт.16 высокий} |
Readln; | {проверьте уровни на контактах 14 и 16, затем нажмиет ENTER} |
while true do begin | {в бесконечном цикле проверяется состояние порта 379h} |
B:=Port[$379]; | {на контактах, не соединенных с землей,- высокие уровни} |
Writeln(B); | {исходно состояние порта 127: 1+2+4+8+16+32+64 (нет 128: бит 7 инверсный)} |
end; | {соединение конт.11, 12, 13 или 15 с любым контактом 0V изменит состояние порта} |
end. |
.
В шестнадцатеричном формате .hex хранятся файлы с информацией, предназначенной для загрузки как во Flash-память микроконтроллера AVR (память программ), так и в EEPROM микроконтроллера AVR (электрически перепрограммируемая постоянная память).
Рассмотрим фрагмент файла .hex, генерированного AVR Studio 3.0 и готового для записи во Flash-память микроконтроллера AVR.
Замечу, что формат файла определялся интуитивно, поэтому буду благодарен за поправки. Для наглядности в строки введены интервалы.
Каждая строка начинается двоеточием. Каждая последующая пара символов представляет собой один байт в шестнадцатеричном коде. Четыре байта в начале и один байт в конце строки являются служебными, находящиеся между ними байты - информационные - загружаются в память. В служебных строках информационные байты отсутствуют.
Для примера я выбрал две начальные и три конечные строки одной из программ, ассемблированных в AVR Studio:
:10 | 0000 | 00 | B6C0 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 7A |
:10 | 0010 | 00 | 0000 | 0000 | 0000 | 0000 | 0000 | 24D0 | 7CE0 | 50FD | 43 |
... | |||||||||||
:10 | 0E20 | 00 | 2A1D | 3B1D | 4C1D | 5D1D | 6E1D | 7F1D | 2797 | 7993 | 4F |
:0E | 0E30 | 00 | 6993 | 5993 | 4993 | 3993 | 2993 | 1993 | 0895 | 1F | |
:00 | 0000 | 01 | FF |
Первый байт - число информационных(!) байт в строке; для первой строки это 10, значит, в первой, второй и третьей строках по 10H информационныx байт (10H=16); в предпоследней строке их 0EH (=14).
Следующие два байта - адрес ячейки памяти, по которому записывается первый информационный байт строки (остальные информационные байты строки записываются в последующие ячейки памяти), третий байт отличается от нуля только в служебных строках. Он равен единице в последней строке, являющейся, очевидно, признаком конца файла, и равен двум в первой строке файла .hex , загружаемого в EEPROM микроконтроллера AVR (такая первая строка - признак файла с информацией для EEPROM); с другими значениями этого байта я не сталкивался.
Далее - пары информационных байт, каждая пара составляет ассемблерную команду или часть команды микроконтроллера AVR.
Последний байт - контрольное число. Если просуммировать все байты строки, то младший байт результата должен равняться нулю (суммирование с результатом размерностью в байт). Для файла .hex, полученного при ассемблировании в AVR Studio, информационные байты располагаются последовательно, так, как они должны располагаться в памяти программ (см. 2-ю колонку с адресами: в каждой строке адрес на 10Н больше, чем в предыдущей)
Отмечу, что в результате компилирования программы, написанной на С в IAR Embedded Workbench, файл .hex оказывается составленным из блоков, внутри которых байты располагаются последовательно, как и показано выше, но после блока, начинающегося адресом 1040 может быть блок с младшим адресом, например, 0820, а количество информационных байтов в блоке может быть не кратна 10Н (не кратна 16-ти). Лучше сразу учитывать возможность загрузки такого файла при разработке программного обеспечения.
Для начала следует ознакомиться с разделом Serial Downloading главы Memory Programming полного технического описания какого-нибудь микроконтроллера AVR. Я не стану пересказывать этот раздел, остановлюсь лишь на моментах, которые вызвали у меня сомнение, потребовали проверки или не были описаны вовсе.
Большинство команд микроконтроллера AVR двухбайтные, несколько команд 4-хбайтные. Так вот, если сравнить пары байт, составляющих одинаковые команды, в файле .hex и при просмотре Program Memory в AVR Studio, то оказывается, что в файле пара выглядит так: C04F, а в Program Memory так: 4FC0 .
( Пунктик появился от великого ума: не фиг было просматривать Program Memory!)