Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[5]

Микроконтроллеры AVR. Ступень 4

С.М. Рюмик, г. Чернигов

В изучении микроконтроллеров (МК) семейства AVR не надо спешить. Лишь поднявшись на первые три "ступени" (программатор, компилятор, типовые схемы включения), можно приступить к разработке своих собственных конструкций. Начинать, как всегда, легче от простого к сложному.

Идея вдохновляет, опыт исполняет, метод - царствует Н. Векшин

Жизнь не стоит на месте. В новом 2005 году уже успели произойти два важных с точки зрения семейства AVR события.

Во-первых, фирма Atmel расширила классификацию AVR-совмес-тимых МК, выпустив новые серии микросхем Lighting AVR, Smart Battery AVR (табл.1). Наметилась тенденция к четкому разделению на универсальные и специализированные контроллеры. Кроме того, появление высоковольтных (4...25 В) МК означает прорыв в технологии. Не исключено, что в будущем и другие контроллеры фирмы Atmel смогут выдерживать 25 В. Учитывая, что нижний предел во вновь разрабатываемых AVR составляет 1,8 В, устройства станут некритичными к напряжению питания (сколько вольт не подаешь, а оно все равно работает!).

Во-вторых, обновился пакет программ WinAVR. Новый релиз имеет номер 20050214, что означает дату рождения 14 февраля 2005 г. Скачать его можно на сайте http: sourceforge.net/projects/winavr/. Объем исполняемого файла "WinAVR-20050214-install.exe" увеличился до 13,7 Мб, внесены улучшения, исправлены неточности, расширены функции.

Тем, кто уже успел скачать предыдущую версию WinAVR 20040720, не следует спешить с ее удалением с винчестера. Золотое правило безопасности учит, что на компьютере надо держать архивы как минимум двух последних версий обновляемых программ - для перепроверки и для сравнения возможностей. Разумеется, основной рабочей версией должна быть последняя по времени программа, предыдущую версию предварительно деинсталлируют.

Интерфейс WinAVR-20050214 остался без изменений, компиляция программ, как и прежде, производится через редактор Programmers Notepad (PN). Важными являются новшества в Си-компиляторе, входящем в пакет WinAVR. Он стал чуть быстрее, чуть правильнее, пополнился список поддерживаемых МК.

Небольшой нюанс. Иногда WinAVR в Интернете называют компилятором. На самом деле это пакет программ, в состав которого входит ядро настоящего свободно распространяемого Си-компилятора AVR-GCC. Он является неотъемлемой частью коллекции компиляторов GCC (GNU Compiler Collection), поддерживающих Windows, Linux, языки Си, Си++, Си-, Ada, Fortran, Java. В WinAVR включена версия компилятора, специально "заточенная" под архитектуру AVR, платформу Windows и процедуры Ои, Gi++ стандартов ANSI, ISO. Компиляторы GCC имеют свой сайт http: gcc.gnu.org/ и свою эмблему (рис.1).

При обнаружении неточностей в компиляции следует обращаться в базу ошибок GCC http: gcc.gnu.org/bugs.html. О том, что к сообщениям пользователей там прислушиваются, свидетельствуют благодарности от имени авторов к программистам с явно славянскими фамилиями.

Практическую апробацию компилятора AVR-GCC проводят не только одиночки-любители, но и солидные учебные заведения. Например, в Государственном университете Гранд Вэлли (г. Аллендейл, Мичиган, США) на лабораторных работах по моделированию динамических систем используют пакет WinAVR и МК ATmega32 (http: clay-more.engineer.gvsu.edu/ ~jackh/eod/egr345.html). Студенты приобщаются к программированию, а заодно учатся работать со свободно распространяемым компилятором.

Язык Си - повторение материала

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

справка по синтаксису языка Си приведена в РА 6/2004.

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

"Tips and Tricks"

Перевод текста с английского интуитивно понятен - "подсказки и уловки". Речь пойдет о полезных мелочах, облегчающих работу с пакетом WinAVR.

•Если при инсталляции WinAVR удалить "галочку" возле пункта "Add Shortcuts to Desktop" в разделе "Устанавливаемые компоненты", то на рабочий стол не будут выводиться ярлыки инструментов.

•Чтобы при запуске PN не открывалось новое окно, нужно снять галочку возле "Tools-Options-Start with a new blank document".

•Чтобы текст программы в PN был красиво отформатирован по столбцам, следует сменить тип шрифта Lucida Console на Courier New Cyr по методике "Tools-Options-Style Schemes-<выбрать поочередно все пункты, каждый раз изменяя название шрифта>-ОК".

•Чтобы строки в PN были пронумерованы, следует включить опцию "View-Line Number". Кроме того, надо проследить, чтобы в самом конце листинга оставалась одна лишняя пустая строка, иначе появится замечание компилятора.

Итак, новая версия WinAVR установлена в папку C:\WinAVR. На очереди самостоятельная разработка программы для пробного устройства.

Первая конструкция

У профессиональных программистов с незапамятных времен существует обычай. В первой пробной программе они выводят на экран монитора сообщение: "Hello, world!" Тем самым миру сообщается об успешном освоении еще одного алгоритмического языка или новой компьютерной платформы.

Таблица 1

Семейство

Обозначение микросхем

Особенности

"CAN AVR"

AT90CAN128

Интерфейс CAN

"LCD AVR"

ATmegal 69, 329,3290,649, 6490

Подключение ЖКИ

"Lighting AVR"

AT90PWM2,AT90PWM3

Управление лампами и двигателями

"megaAVR"

ATmega48,8,88,8515,8535,16,162, 165,168,32,325,3250,64,640,645, 6450,128,1280,1281,2560,2561

Универсальная серия с многофункциональными возможностями

"Smart Battery AVR"

ATmega406

Питание 4...25 В

"tinyAVR"

ATtinyl 3,15L, 2313,25,26,28L, 45,85

Малогабаритный корпус

Таблица 2

Таблица 3

функция

журнала

Ключевые

журнала

#include

#define

unsigned

volatile

РАЮ, 12

РАН, 12

Таблица 4

Структурная схема

Номер журнала

Особенности

Без внешних и внутренних функций

С внутренними, но без внешних функций

С внутренними и внешними функциями


Электронщики, не долго думая, стали вводить в пробные программы для МК точно такую же фразу. Хорошо, если МК сопрягается с компьютером или имеет выход на многоразрядный жидкокристаллический экран. А если нет? В таком случае логичнее вместо "Hello, world!" засвечивать обычные индикаторы, управляемые от кнопок. Эффект -одинаковый.

На рис.2 показана схема пробного устройства, которое применялось при изучении МК семейства MCS-51 (см. РА 5/2004), а на рис.3 - его AVR-аналог. Алгоритм работы: индикатор HL1 должен светиться при нажатой и не светиться при отпущенной кнопке SB1, индикатор HL2, наоборот, должен светиться при отпущенной и не светиться при нажатой кнопке SB2.

Различия в схемах. Конденсатор С4 в MCS-51 обеспечивает единичный импульс сброса. Для AVR сброс формируется внутри МК DD1, а резисторы R1, R2 повышают помехоустойчивость.

Элементы C2, C3, ZQ1 в MCS-51 стабилизируют тактовую частоту. Для AVR они не нужны, поскольку используется внутренний RC-ге-нератор с частотой 1 МГц.

Нагрузкой кнопок SB1, SB2 в обеих схемах служат внутренние резисторы между цепью +5 В (VCC) и входами МК соответственно P3.4, P3.5 и PD4, PD5. Их номиналы - десятки килоом.

Назначение резисторов R3, R4 на рис.3 не совсем очевидно. Действительно, при нормальной работе они не нужны, токи через кнопки SB1, SB2 протекают слабые, защищаться нет от чего. Но вдруг произойдет сбой процессора, и линии PD4, PD5 программно переключатся из режима вход в режим выход с высоким логическим уровнем? В этой ситуации при нажатых кнопках SB1, SB2 и отсутствии резисторов R3, R4 через каждый из выводов 6, 11 микросхемы DD1 будет протекать ток короткого замыкания до 100 мА. Если не принять спешных мер, то через некоторое время корпус DD1 перегреется и МК может выйти из строя. Такая ситуация теоретически возможна. Главную опасность представляет не само замыкание (МК его кратковременно выдерживает), а длительность воздействия, число одновременно закороченных выводов и тепловой нагрев корпуса.

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

Очевидно, компромиссное решение лежит где-то посередине. При отладке устройства на макетной плате ограничительные резисторы по входам, которые могут быть напрямую соединены с общим проводом GND или с питанием VCC, лучше поставить, а вот в отработанной конструкции без них можно обойтись. В дальнейшем такие резисторы рисоваться не будут, но их наличие каждый должен держать в уме.

Пример преобразования программы MCS-51 в AVR

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

Считается, что проще конвертировать программу, чем создавать ее заново. Заманчиво было бы взять за основу алгоритм работы уже существующей программы и заменить в ней названия линий портов, подкорректировать функции и регистры прерываний. Работа требует внимательности, но будет вознаграждена сторицей.

Например, электрические схемы, приведенные на рис.2, 3, функционально идентичны, следовательно, и Си-программы будут у них похожи. В листинге 1 показан текст для MCS-51, а в листинге 2 - конвертированный текст для AVR.

Пояснения к листингам

Беглое сравнение листингов 1 и 2 явно не в пользу последнего. Только сейчас можно по достоинству оценить простоту управления портами в MCS-51, где не надо заботиться о фьюзах и не надо создавать make-файл. За расширенные возможности МК AVR приходится "платить" усложнением программного обеспечения.

Поскольку листинг 1 уже рассматривался ранее, то основное внимание будет уделено листингу 2.

R1 10 к

DD1 ATmega8-16PI

R2 10 к

<Р RES MOSI MISO SCK

R3240 SB2 R4

VCC AVCC GND GND

+5 В -Э»

т- <0 X <

Листинг 1

/♦пробный тест, мк шаг 3, журнал ра, №5, 2004= 1*/ #include <io51.h>/*системная библиотека= 2*/

/♦пустая строка, разделитель заголовка 3*/ void main (void) /*начало "тела" программы= 4*/ {/*начало главной функции main= 5*/

while (1)/*бесконечный цикл= б*/

{/*начало функции while в строке 6= 1*1

р1.3 = р3.4;/«повторение sb1 (ны)= 8*/

р3.7 = р3.5 л 1;/*инверсия sb2 (hl2)= 9*/

}/*окончание функции while в строке 6=10*/

}/*окончание функции main и программы=11*/

Листинг 2

пробный тест. =avr, ступень 4=. журнал ра, №4-2005 =1 make: name=avr41, mcu=atmega8, level=2, debug=vmlab =2 фыоэы: sut0=cksel3=cksel2=cksell="rano4KM" (1 мгц) =3 ftinclude <avr/io.h> библиотека ввода-вывода =4

/♦пустая строка-разделитель* / =5

int main(void) начало основной программы =6

( portb - portc - portd - oxff; входы с резисторами =7 ddrc = bv(pc3) ; рсз выход с лог.1 =8

ddrd = bv(pd7) ; pd7 выход с лог.1 =9

while (1) бесконечный цикл между строками 11-17 =10 { проверка лог.1 на линии pd4 и передача ее рсз =11 if (bit is set(pind,pd4)) portc = bv(pc3); =12 else portc &= ~ bv(pc3) ; иначе рсз лог.о =13

проверка лог.о на линии pd5 и установка лог.1 pd7 =14 if (bit is clear(pind,pd5)) portd = bv(pd7) ; =15 else portd s= - bv(pd7) ; иначе pd7 лог.о =16

} окончание функции "while" в строке 10 =17

} winavr-20050214, длина программы 142 байта =18

Строка 1 начинается с двух наклонных линий, иначе называемых "прямой слэш". Все, что справа от них - это комментарии к программе. Компилятор допускает еще одну разновидность текстовых пояснений, как показано в строке 5. В отличие от слэш-варианта, между символами "/*" и "*/" может находиться не одна, а несколько строк подряд. С точки зрения компилятора оба варианта равноценны.

Строки 2,3 специфичны для AVR и отсутствуют в MCS-51. Это подсказка пользователю, который будет повторять конструкцию, о содержимом make-файла в программе MFile и установке фьюзов в программе PonyProg. Человек, который в первый раз видит листинг, будет знать, что название всех файлов проекта начинается с "avr41", в устройство надо ставить микросхему ATmega8, которая работает от внутреннего генератора 1 МГц, а компиляция программы будет производиться по второму уровню оптимизации с отладочной информацией в формате VMLab.

Строка 6. Согласно стандартам языка Си основная программа должна иметь тип "int". В листинге 1 это требование не обязательно.


Строка / После подачи питания все линии портов МК автоматически настраиваются в режим входа без нагрузочного резистора (PORTB=PORTC=PORTD=DDRB=DDRC=DDRD=0). Чтобы входы "не висели в воздухе", во все разряды портов записываются единицы (шестнадцатиричный байт OxFF), при этом внутри микросхемы к линиям портов подключаются резисторы сопротивлением 20...50 кОм. Вольтметром можно убедиться, что напряжения на линиях близкие к уровню питания.

Строка 8- перевод линии PC3 порта С из состояния ВХОД в состояние ВЫХОД. К этой линии в схеме, показанной на рис.3, подключаются резистор R5 и светодиод HL1. Исходный уровень будет лог."1", поскольку ранее в строке 7 он был записан в регистр PORTC.

Расшифровка оператора: "Установить в "1" третий разряд регистра DDRC". Эта конструкция будет в дальнейшем часто встречаться в программах, поэтому чуть подробнее. С левой стороны расположено название 8-разрядного регистра DDRC, подлежащего изменению. Знаки "=" означают, что будет произведена операция ЛОГИЧЕСКОЕ ИЛИ между левой и правой частью формулы, а результат помещен в левую часть, т.е. в регистр DDRC. Символы " BV" - это системное макроопределение компилятора AVR-GCC, которое устанавливает в "1" один из битов (Bit Value). Какой именно - указывается в круглых скобках далее. В нашем случае это третий бит (PC3). Итого, в регистре DDRC устанавливается в "1" бит номер 3, остальные биты не изменяются.

В Си-программах встречаются и другие записи этого оператора, например, DDRC = (1 << PC3), что эквивалентно.

Строка 9аналогична строке 8. Она устанавливает в "1" седьмой разряд регистра DDRD, переводя линию PD7 с входа на выход.

Строки 12, 13. Выражение "bit is set" является системным макроопределением компилятора AVR-GCC. Оно проверяет содержимое разряда PD4 в регистре PIND и, если результат равен "1", то выдает сообщение "истина", в противном случае - "ложь". К линии PD4 на схеме присоединена кнопка SB1, поэтому проверяется, нажата она или нет. Полная расшифровка функции "if-else": "Если на линии PD4 об-

Табпица5

Исходное состояние линии РСЗ

Последующее состояние линии РСЗ

Вход (z)

Вход (R)

Выход (0)

Выход (1)

PORTC = BV(PC3);

DDRC = BV(PC3);

PORTC = BV(PC3); DDRC = BV(PC3);

Вход (R)

PORTC &= - BV(PC3);

PORTC &= ~ BV(PC3); DDRC = BV(PC3);

DDRC = BV(PC3);

Выход (0)

DDRC &= ~ BV(PC3);

PORTC = BV(PC3); DDRC &= -v BV(PC3);

PORTC = BV(PC3);

PORTC &= ~ BV(PC3); DDRC &= ~ BV(PC3);

DDRC &= - BV(PC3);

PORTC &= ~ BV(PC3);

Условные обозначения: ВХОД (z) - без резистора; ВХОД (R) - с резистором; ВЫХОД (0)-лог."0"; ВЫХОД (1)-лог.Т

наружена лог."1", то занести лог."1" в линию PC3 и перейти к строке 14. Если на линии PD4 присутствует лог."0", то перейти к строке 13 и установить лог."0" в линии PC3".

Знак "волна" или "тильда" впереди " BV" в строке 13 означает инверсию выражения справа, т.е. вместо установки "1" будет установлен "0" в третьем бите. Если учесть, что знак ЛОГИЧЕСКОЕ ИЛИ заменен знаком ЛОГИЧЕСКОЕ И (&), то получится, что в регистре PORTC установится в "0" бит номер 3, остальные биты не меняются.

В табл.5 приведены варианты Си-операторов, которые надо вводить в листинги, для перевода линий в различные состояния. Все примеры рассчитаны на линию PC3, в остальных случаях меняется последняя буква в названии регистра (PORTB, PORTD, DDRB, DDRD) и порядковый номер линии (PB0-PB7, PC0-PC7, PD0-PD7), например, PORTB I= BV(PB0).

Строки 15, 16 аналогичны строкам 12, 13, но с макроопределением "bit is clear" (дословный перевод - "бит очищен"), которое выдает сообщение "истина" при наличие лог."0" в разряде PD5 регистра PIND и "ложь" при лог."1". Если сравнить с листингом 1, то эквивалент этой сложной конструкции содержится в одном операторе строки 9.

Строка 18 содержит упоминание о текущей версии пакета WinAVR, при которой производилась компиляция программы, и соответствующий ей размер кодов прошивки МК.

Создание MAKE-файла

Как известно, каждая Си-программа в WinAVR должна иметь свой собственный make-файл. Самый простой способ его создания - это копирование уже существующего файла "makefile" из папки C:\WinAVR\examples\demo\ и замены в нем первых трех строк по образцу, показанному на рис.4. Разумеется, исходный текст программы "avr41.c" (листинг 2) и скопированный make-файл должны находить-

ся вместе в отдельно созданной папке рабочего проекта.

Чтобы каждый раз не копировать make-файл и не изменять в нем текст, в пакете WinAVR имеется средство для его автоматизированного создания - инструмент MFile (автор Joerg Wunsch, г. Дрезден, Германия). Порядок действий. Запустить на выполнение программу MFile: "Пуск - Программы - WinAVR - MFile". Выбрать пункт меню Makefile и последовательно заполнить "анкету":

•В пункте "Makefile-Main file name...-Main file" ввести имя проекта avr41 и нажать OK.

•В пункте "Makefile-MCU type-ATmega" выбрать тип микросхемы atmega8 (рис.5).

•В пункте "Makefile-Optimization level" задать уровень оптимизации 2 как наиболее часто встречающийся в программах WinAVR. Для справки, цифра "0" - без оптимизации, буква "s" - минимальная длина кодов, цифры "1-3" - три разных метода оптимизации, причем цифра "3" не означает лучший вариант, все зависит от конкретной Си-программы.

в пункте "Makefile-Debug format" установить формат отладочной информации "AVR-ext-COFF (AVR Studio 4.07+, VMLab 3.10+)".

Остальные пункты менять не надо, пусть остаются принятыми по умолчанию.

Далее следует сохранить полученный файл: "File-Save as..-<выбрать папку, где находится файл "шТсуказать имя "makefiles-Сохранить". Закрыть программу MFile ("File - Exit") и просмотреть содержимое вновь созданного файла в любом текстовом редакторе. Традиционно makefile не имеет расширения, так принято в среде UNIX.

Следующим этапом надо открыть программу PN, загрузить в нее Си-программу "avr41.c" и откомпилировать через пункт "[WinAVR]



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11]