Программирование c нуля в AVRStudio 5 (ч.3)

Автор: Радик Просмотров: 3939


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

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

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

 

alt

 

     Редактор 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                Установить для переменной эквивалентное выражение

 

       Полное описание команд и директив ассемблера можно посмотреть по ссылке: http://dfe.karelia.r.../avrasm-rus.htm
Мы еще не раз вернемся к директивам ассемблера, а сейчас попробуем написать небольшой текст программы, где будем включать светодиоды.
Для удобства выберем микроконтроллер ATtiny2313A. Если кто-то пойдет дальше и будет экспериментировать в “железе”, этот контроллер один из самых доступных, очень часто применяется в различных конструкциях, которые можно найти в бескрайних просторах сети.
Начинаем работать с программой Proteus. Чтобы поначалу не сидеть и составлять схему, я выложил готовый проект:
ATTINY2313_led.zip (30,18К)

Нужно лишь распаковать и стартовать его (при условии, что Proteus уже установлен). Должна появиться вот такая картинка:

 

alt

 

Запустим 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 файла.

alt

Этот файл по умолчанию размещен в Моих документах, в проекте AVR Studio 5.
Переходим в Proteus, кликаем на рисунок контроллера и вводим путь, где находиться .hex файл:

 

alt

alt

alt

alt

alt

alt

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

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


Строка:

 

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

 

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

alt

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

alt

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) – переключился на линию ввода (по умолчанию).

alt

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

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

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

                                                   (Продолжение следует)


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru