.
Чтобы правильно писать программы нужно понять, как работает микроконтроллер, чем мы и будем заниматься, а пока составим первую программу на ассемблере.
Вообще написать программу можно в любом текстовом редакторе, так же, как вы бы написали письмо другу, например. После этого, текст надо скомпилировать (иногда говорят - ассемблировать) т.е. перевести в форму, понятную процессору. Раньше, расширение текстового файла .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 Установить для переменной эквивалентное выражение
Полное описание команд и директив ассемблера можно посмотреть по ссылке: https://dfe.karelia.r.../avrasm-rus.htm
Мы еще не раз вернемся к директивам ассемблера, а сейчас попробуем написать небольшой текст программы, где будем включать светодиоды.
Для удобства выберем микроконтроллер ATtiny2313A. Если кто-то пойдет дальше и будет экспериментировать в “железе”, этот контроллер один из самых доступных, очень часто применяется в различных конструкциях, которые можно найти в бескрайних просторах сети.
Начинаем работать с программой Proteus. Чтобы поначалу не сидеть и составлять схему, я выложил готовый проект: ATTINY2313_led.zip (30,18К)
Нужно лишь распаковать и стартовать его (при условии, что 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.
Еще раз просмотрим программу, все просто!
Попробуйте самостоятельно поменять картину свечения светодиодов.
В следующий раз разберемся, как рассчитывать время задержки, из чего состоит контроллер, попробуем заставить поморгать наши светодиоды.
(Продолжение следует)
Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2021 © ChipMK.ru
![]() |
|