» » Програмирование в AVR Studio 5 с самого начала. Часть 2

 
 
 

Програмирование в AVR Studio 5 с самого начала. Часть 2

Разместил galrad 24 сентября 2011. Просмотров: 51 258

16

Пишем первую программу!

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

Алгоритм, (от имени персидского математика аль-Хорезми) — точный набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за определенное время.
Чтобы правильно писать программы нужно понять, как работает микроконтроллер, чем мы и будем заниматься, а пока составим первую программу на ассемблере.
Вообще, написать программу можно в любом текстовом редакторе, так же как вы бы написали письмо другу, например. После этого, текст надо скомпилировать (иногда говорят - ассемблировать) т.е. перевести в форму, понятную процессору. Раньше, расширение текстового файла .txt переименовывали в .asm и обрабатывали специальной программой, называемой компилятором. Суть работы компилятора в переводе письменных символов понятных для человека в машинный код (в код нулей и единиц) и создание нового файла с расширением .hex

Что делать с этим .hex файлом? А он нужен для программатора, чтобы записать код программы в ПЗУ (постоянное запоминающее устройство) микроконтроллера. Мы вместо программатора будем использовать программу Proteus, которая модулирует реальную работающую схему.
В AVR Studio 5 редактор, компилятор, отладчик и программатор все в одном флаконе!

Директива – это предписание редактору, с которым мы будем работать. В большинстве своем название директивы и ее функция в разных редакторах совпадают. Например, если сравнить редактор MPLAB IDE для микроконтроллеров PIC, то разницы практически нет!
А вот команды отличаются. Список команд формируется производителем и в какой-то степени зависит от технологии производства. Даже у одного производителя в разных семействах может быть разный список команд по мере изменения их структуры.
Команда – это единичная функция, с помощью которой мы можем управлять микроконтроллером.
Программа - это последовательность команд, соответствующая определенному алгоритму (составленная нами).
Любая программа начинается с “шапки”, где прописывается основные функции программы, ее автор, название контроллера, который будет использоваться, тактовая частота и другие данные. “Шапка” - это “правило хорошего тона” в программировании.
Обычно в “шапке” прописывается файл инициализации .includeххххdef.inc. директивы .device, .list, .nolist, и другие.
В AVR Studio 5 эти директивы прописаны по умолчанию. В предыдущей версии AVR Studio 4 эти директивы нужно было прописывать, поэтому я их оставил в виде комментариев.
Комментарии пишутся произвольно, как вам нравиться и главное, чтобы они для вас оставались понятными. Нередко, из-за неполных комментариев, через некоторый промежуток времени сам автор не может разобраться в собственной программе. Перед комментариями ставиться знак (;) .
Я ввел “шапку” предложенную Джоном Мортоном…



Редактор AVR Studio 5 – понимает написанные, директивы и команды выделяя их в синий цвет, числовые данные остаются черными, непонятные выражения выделяет в красный, комментарии в зеленый.

Прежде чем начать, что-то писать рассмотрим директивы ассемблера микроконтроллеров AVR.
Перед каждой директивой ставиться точка:
Директива                                          Описание
.BYTE                 Резервировать байты в ОЗУ
.CSEG                Сегмент программы
.DB                    Определить байт – константу во Flash-памяти или EEPROM
.DEF                   Назначить регистру символическое имя
.DEVICE             Определяет устройство, для которого компилируется программа
.DSEG                Сегмент данных
.DW                   Определяет слово во Flash-памяти или EEPROM
.ENDM                 Конец макроса
.ENDMACRO         Конец макроса
.EQU                   Установить постоянное выражение
.ESEG                 Сегмент EEPROM
.EXIT                      Выход из файла
.INCLUDE            Вложить другой файл
.LIST                   Включить генерацию листинга
.LISTMAC            Включить разворачивание макросов в листинге
.MACRO               Начало макроса
.NOLIST              Выключить генерацию листинга
.ORG                  Установить положение в сегменте
.SET                   Установить для переменной эквивалентное выражение


Полное описание команд и директив ассемблера в русском переводе Руслана Шимкевича можно посмотреть тут:
atmel-avr-assembler.7z | Файл 397,28 Kb загружен 230 раз.

Мы еще не раз вернемся к директивам ассемблера, а сейчас попробуем написать небольшой текст программы, где будем включать светодиоды.
Для удобства выберем микроконтроллер ATtiny2313A. Если кто-то пойдет дальше и будет экспериментировать в “железе”, этот контроллер один из самых доступных, очень часто применяется в различных конструкциях, которые можно найти в бескрайних просторах сети.

Начинаем работать с программой Proteus

Чтобы поначалу вам не сидеть, составляя схему, я выложил готовый проект.
attiny2313_led.rar | Файл 27,18 Kb загружен 178 раз.
Нужно лишь распаковать и стартовать его (при условии, что Proteus уже установлен).
Должна появиться вот такая картинка:


Запустим AVR Studio 5, и в редакторе напишем небольшую программу с подробными комментариями:

.def temp=r16    ; директива .def назначает регистру r16 имя temp

;====================================================
; Начало программы
.cseg            ; директива .cseg определяет начало сегмента, где будет расположен
                    ; основной код программы. В AVR Studio 5 это директива не
                    ; обязательна
.org 0            ; начало первой строки программы
rjmp Start       ; относительный переход к метке Start (в PIC соответствует 
                    ; команде goto)
; ====================================================
Start:
ser temp; устанавливает все биты регистра temp  в 1
out DDRB,temp; переводит все биты 
out DDRD,temp; порта B  и D на вывод
clr temp; обнуляет регистр temp (устанавливает все биты регистра temp в 0)
out PortB,temp; отключает подтягивающие резисторы 
out PortD,temp; портов B и D 
Cicle: 
ldi temp,0b11001100; включает светодиоды
out PortB, temp; порта B
rjmp Cicle; Возвращаемся к метке Cicle, зацикливаемся


Скомпилируем ее, кликнув по F7
В окошке Output появятся информация о проведенной компиляции, в конце должна быть надпись Build succeeded, которая подтверждает удачную сборку .hex файла.

Этот файл по умолчанию размещен в Моих документах, в проекте AVR Studio 5.

Переходим в Proteus, кликаем на рисунок контроллера и вводим путь, где находиться .hex файл:





Запускаем эмуляцию программы.
После нажатия кнопки Старт видим результат!


Чтобы остановить эмуляцию – кликаем Стоп.
Если прошить микроконтроллер программатором и собрать схему, то результат будет таким-же.

Попробуем разобраться, с программой:

Строка:
.def temp=r16    ; директива .def назначает регистру r16 имя temp

Для удобства мы назначили регистру r16 имя temp, это значит что в любом месте программы, при написании слова temp программа будет обращаться к регистру r16.
Что это за регистр – r16?
Он относится к регистрам общего назначения, которые обозначаются как r0….r31, т.е их всего 32 по 8 бит. Вторая половина регистров общего назначения r16…r31 выполняют функцию временного хранения информации (как аккумуляторы, могут принимать и могут отдавать информацию, для сравнения - у PIC контроллеров всего один аккумулятор W). Последние 6 регистров общего назначения условно объединены в три 16-битных:


Обратите внимание, что старший байт пишется раньше, младший позже.

r27:r26 называется регистром X,
r29:r28 называется регистром Y,
r31:r30 называется регистром Z
Программа будет так же работать если слово temp будет присвоено любому другому регистру общего назначения от r16 до r31 например .def temp=r20. После компиляции (клавиша F7 в AVR Studio 5), разницы в работе программы никакой нет.
(Можете попробовать, теперь вы знаете, как это сделать!)

Строка:
.cseg            ; директива .cseg определяет начало сегмента, где будет расположен основной код программы

В AVR Studio 5 это директива прописана по умолчанию.
В микроконтроллерах AVR выделяют разные области памяти, для хранения программного кода, данных в постоянной памяти или EEPROM, для обозначения этой области существуют директории:
.cseg - Программный сегмент
.dseg – Сегмент данных
.eseg – сегмент EEPROM

Строка:
.org 0           ; начало первой строки программы

Программа начинается со строки указанной директивой .org, и при завершении будет возвращаться к ней.

Строка:
rjmp Start       ; относительный переход к метке Start (в PIC соответствует команде goto)

Это команда относительного перехода к метке Start.
Программа выполняется последовательно от верхней стоки к нижней. Если требуется перейти в другую область программы то используется команда rjmp

Строки:
ser temp         ; устанавливает все биты регистра temp  в 1
clr temp         ; обнуляет регистр temp (устанавливает все биты регистра temp  в 0)

Команда ser выполняется с регистрами r16…r31, а команда clr может выполнятся ко всем регистрам, в том числе и регистрам ввода-вывода (регистрам специального назначения). Назначение этих регистров мы рассмотрим позже.

Строка:
ldi temp,0b11001100 

Команда ldi записывет в регистр temp двоичное число 11001100 (не будет ошибкой если вместо 0b11001100 написать 204 или CCh, в одном случае в десятичной форме в другом в шестнадцатеричной)

Строка:
out DDRB,temp

Команда out выводит значение регистра temp в регистр порта DDRB.

Что такое порт и как он работает?

Если упростить до минимума, то порт можно представить как ножку-вывод микроконтроллера, на который в режиме вывода можно произвольно подать напряжение или отключить, а в режиме ввода определить, есть ли напряжение, поданное извне или нет.
Есть три режима работы порта: это вывод, ввод и отключенное состояние.
Управляют портами регистры PinX, PortX, DDRX.
Х – означает порт, которым управляют эти регистры.
Регистр DDRX управляет режимами ввода-вывода, как реле – включили (записали 1) – подключился на линию вывода, отключили (записали 0) – переключился на линию ввода (по умолчанию).


Чтобы вывести данные в порт Х, нужно регистр DDRX переключить в режим вывода (прописать 1) а данные переслать в регистр PortX.
Считать значение порта Х можно, если регистр DDRX переключить в режим ввода (прописать 0), из регистра PinX. Чтобы подключить подтягивающие резисторы в режиме ввода, надо отправить данные в PortX.
Подтягивающие резисторы избавляют нас от необходимости подключать внешние резисторы на положительный провод и с помощью одной команды сами подают логическую единицу на вход.

Еще раз просмотрим программу, все просто!
Попробуйте самостоятельно поменять картину свечения светодиодов.

Читайте в следующей части!

В следующий раз разберемся, как рассчитывать время задержки, из чего состоит контроллер, попробуем заставить поморгать наши светодиоды.
Радик (galrad)
РФ. Республика Башкортостан. г.Уфа
Профиль galrad
1964г.р. Специальность - врач. Должность - доцент кафедры. Ученая степень - кандидат медицинских наук. Радиоэлектроника - увлечение с детства (с 15 лет). Приоритетные направления - микроконтроллеры, цифровая электроника, измерения, ремонт компьютеров и сотовых телефонов, и т.п. Второе высшее образование - инженер-электроник.
 

Понравилось? Палец вверх!

  • всего лайков: 30

Поделись с друзьями!

Связанные материалы:


Программатор AVR910: перезагрузка! Ускорение работы + «превращение» в STK500

Сегодня я не лег спать. Включил фоном какую-то киношку с Джеки Чаном и быстренько спаял второй...

Програмирование в AVR Studio 5 с самого начала. Часть 4

Сегодня рассмотрим программу “бегущих огней” и “бегущих теней”. Примеры “бегущих огней” можно найти...

Програмирование в AVR Studio 5 с самого начала. Часть 3

Мы научились включать и выключать светодиоды, а как сделать, чтобы они сами заморгали? Понятно, что...

Программатор JTAGICE 3. Что внутри?

Совершенно случайно попался мне в руки программатор JTAGICE3, который был выпущен компанией Atmel...

Програмирование в AVR Studio 5 с самого начала. Часть 1

Каждый человек, который только начинает осваивать программирование микроконтроллеров, да и вообще...

Elect_60: программа микроконтроллерного управления внешними устройствами от ПК

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

Грызем микроконтроллеры. Урок заключительный. Прошивка.

Ну вот, писать программы для микроконтроллеров мы научились. Работоспособность прошивки тоже...

Грызем микроконтроллеры. Урок 2.

Предлагаю продолжить изучение микроконтроллеров… Второй урок будет посвящен по большей части...

Программатор для ATMEL AVR-910 по USB

Представлю Вам мой вариант печатной платы для сборки такого программатора. Детали, кроме самого...

Применение микроконтроллеров AVR. Схемы, алгоритмы, программы

Какой микроконтроллер выбрать? Где найти его описание? Где взять программу, обеспечивающую...

Анатомия микроконтроллеров ATmega

Здравствуйте, датагорцы! После публикации моей первой статьи, меня завалили вопросами о...

Программирование микроконтроллеров ATmega

Хеллоу ВСЕМ!!! Итак, как я и обещал, расскажу как залить программу в МК. Для этого нам понадобится...
<
  • Кандидат
25 сентября 2011 00:08

Михаил / Dust112

  • С нами с 22.05.2011
  • Ушёл в реал Пользователь offline
  • 14 комментариев
  • 1 публикация
 
  • 0
Спасибо за Ваш взгляд в сторону ассемблера, а то в основном все С.

<
  • Гражданин
25 сентября 2011 14:17

Дмитрий / Supercontick

  • С нами с 27.03.2010
  • Ушёл в реал Пользователь offline
  • 22 комментария
  • 0 публикаций
 
  • 0
Класс, давно хочу разобратся с ассемблером.

Спасибо за обучение.

<
  • Прохожий
25 сентября 2011 18:18

/ Demiurg

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
В который раз уже замечаю эту распространенную ошибку.
Cycle:
ldi r16,0b00000001
out PORTX,r16

или
out DDRX,r16
rjmp Cycle


Спрашивается, зачем все время выводить значения в порты? Вывели значение в порт и зациклились. Все.
ldi r16,0b00000001
out PORTX,r16

или
out DDRX,r16
Cycle:
rjmp Cycle


От Датагора: поправил тэги листинга

<
  • Гражданин
25 сентября 2011 18:28

Радик / galrad

  • С нами с 23.08.2011
  • Ушёл в реал Пользователь offline
  • 84 комментария
  • 12 публикаций
 
  • 0
Цитата: Demiurg
В который раз уже замечаю эту распространенную ошибку.

Здесь это сделано намерено, чтобы было понятно откуда, что исходит.
Я думаю, что в будущем вопросы оптимизации кода затронем обязательно!

<
  • Прохожий
25 сентября 2011 18:43

/ Demiurg

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
Это не оптимизация. В моем примере отлично видно, откуда, что и как. Если пишем уроки для начинающих, то пусть сразу будет как должно. Что они не мучались из-за наших же ошибок. Со своими итак намучаются. :)

Datagor, неплохо было бы добавить возможность вставлять программный код в комментариях.

<
  • Гражданин
25 сентября 2011 19:04

Радик / galrad

  • С нами с 23.08.2011
  • Ушёл в реал Пользователь offline
  • 84 комментария
  • 12 публикаций
 
  • 0
Цитата: Demiurg
Если пишем уроки для начинающих, то пусть сразу будет как должно. Что они не мучались из-за наших же ошибок.

Согласен! Спасибо за комментарии. drinks

<
  • Главный редактор
25 сентября 2011 21:29

Игорь Петрович Котов / Datagor

  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 608 комментариев
  • 256 публикаций
 
  • 0
Demiurg Женя, пожалуйста не берите на себя роль цензора чужих статей. А тем более не спорьте с автором о ЕГО задумке.
Во-первых, вам это не по рангу. Во-вторых, не по статусу, судя по трём комментариям за 3 года и по полному отсутствию ваших собственных безошибочных статей на нашем портале.
Будьте добрее, почитайте: "Пишем комментарии правильно"

Для пожеланий по усовершенствованию и добавлению функций портала есть специальный раздел на форуме.
Чтобы отформатировать программный листинг заключите его в стандарные bb-тэги [code]

<
  • Прохожий
25 сентября 2011 22:14

/ Demiurg

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
Datagor, я внимательно недавно читал "Пишем комментарии правильно". Я не брал на себя роль цензора чужих статей. Мои действия не были злыми по отношению к автору статьи. Он молодец, не поленился. Не пожалел времени. А не написать я не смог удержаться. Так как сам учился по подобным примерам. Не раз сталкивался с грубыми ошибками. И терял на тех ошибках уйму драгоценного времени. Так тогда практически ничего не знал о микроконтроллерах, тем более о программировании. И помня об этом, написал-давайте будем экономить драгоценное время начинающим.
Писать статьи и учить тоже нужно уметь. Честно скажу, у меня это не очень выходит.

<
  • Главный редактор
25 сентября 2011 22:53

Игорь Петрович Котов / Datagor

  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 608 комментариев
  • 256 публикаций
 
  • 0
Demiurg, я поставил тэги листинга в вашем посте, надеюсь сделал правильно.

<
  • Прохожий
25 ноября 2012 18:07

/ Хабиб

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
Мухаммед ибн Муса Хорезми (ок. 783 — ок. 850) — хорезмийский, центральноазиатский математик, астроном и географ, основатель классической алгебры. (Википедия)
Он был не персидским, а Хорезмийским (Нынешняя Хорезмская область Узбекистана) ученым-математиком, родным языком которого был узбекский.

<
  • Прохожий
7 января 2014 05:18

/ Mikalay83

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
Добрый день, у меня почему то после компиляции нет hex файла как показано на скриншоте.

<
  • Главный редактор
10 января 2014 18:25

Игорь Петрович Котов / Datagor

  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 608 комментариев
  • 256 публикаций
 
  • 0
Цитата: Mikalay83
нет hex файла как показано на скриншоте.

Значит и компиляции нет. Читайте лог сообщений, ошибок и т.п. Ищите причины.

<
  • Кандидат
16 февраля 2014 20:05

Василий / Vasek_Vasechek

  • С нами с 16.02.2014
  • Ушёл в реал Пользователь offline
  • 2 комментария
  • 0 публикаций
 
  • 0
скомпилировал .hex файл, создал проект в proteus как показано на изображениях, вопрос:
для чего нам кнопка? при написании кода про нее ни слова, а при эмуляции проекта в proteus при нажатии на нее светодиоды гаснут

<
  • Главный редактор
16 февраля 2014 20:30

Игорь Петрович Котов / Datagor

  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 608 комментариев
  • 256 публикаций
 
  • 0
Василий, это хардварный RESET (Сброс), поэтому в коде он не упоминается.
Что такое RESET объяснять надо?

<
  • Кандидат
20 февраля 2014 17:39

Василий / Vasek_Vasechek

  • С нами с 16.02.2014
  • Ушёл в реал Пользователь offline
  • 2 комментария
  • 0 публикаций
 
  • 0
ОК, понял

<
  • Кандидат
29 июня 2015 02:05

Валера / Ka4ErAp

  • С нами с 26.05.2015
  • Ушёл в реал Пользователь offline
  • 1 комментарий
  • 0 публикаций
 
  • 0
Подскажите, как влияет число, записанное с помощью Команда ldi в регистр temp.
Никак не могу понять закономерность.

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.