Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микроконтроллеры в системах управления. Лабораторный практикум
.pdf
Лабораторная работа № 3
ПРОГРАММИРОВАНИЕ МК-СИСТЕМЫ УПРАВЛЕНИЯ
ШАГОВЫМ ПРИВОДОМ НА ЯЗЫКЕ АССЕМБЛЕР
Цель работы – изучение функционирования системы управле-
ния исполнительного уровня на микроконтроллерах серии
ATmega, языка программирования Assembler, составление программ и их отладка в составе аппаратно-программного ком-
плекса.
Теоретические сведения
Рассмотрим состав проекта при работе на Asm. В проект
могут входить различные файлы. Главный из них – файл проекта. Он имеет расширение aps. Файл проекта содержит сведения о типе процессора, частоте тактового генератора и т.д. Он
также содержит описание всех остальных файлов, входящих
в проект. Все эти сведения используются при отладке и трансляции программы. Кроме файла aps, проект должен содержать
хотя бы один файл с текстом программы на языке ассемблера
AVR (порядок написания программ изложен далее). Такой
файл имеет расширение asm. Если он уже написан вне среды
AVR Studio, недостаточно просто поместить файл asm
в директорию проекта. Его нужно включить в проект, указав
имя в окне выбора проекта среды на этапе инициализации.
Проект может содержать несколько файлов asm. При этом
один из них является главным. Остальные должны вызываться
из главного при помощи оператора .include. На этом заканчивается список файлов проекта, которые создаются или подключаются при участии программиста.
Составление программ на языке ассемблера AVR
Как известно, язык ассемблера – это символическое пред-
ставление машинного языка конкретной ЭВМ, где каждая команда именована некоторым сокращением из букв, чтобы сде-
41

лать написание программ более удобным. Ассемблер позволяет писать короткие и быстрые программы, не пользуясь машинными кодами. Однако этот процесс чрезвычайно трудоёмкий. Для написания максимально эффективной программы
необходимо хорошее знание особенностей команд языка ассемблера, внимание и аккуратность. Поэтому реально на языке
ассемблера пишутся в основном программы, которые должны
обеспечить эффективную работу с аппаратной частью. Это относится и к ассемблеру семейства AVR. Переводит текст про-
граммы в машинные коды программа-компилятор. В нашем
случае она включена в среду AVR Studio.
Ниже приведена типичная структура для программ AVR
ассемблера.
* Комментарии, заголовок, где идёт текстовое описание, ко-
пирайты и проч. – для пользователя программы.
* Заголовочная информация, определение констант, под-
ключение внешних файлов, определение макросов и др. – для
управления компилятором.
* Код начала программы.
* Основная структура программы.
Комментарии начинаются со знаков точка-с-запятой [ ; ]
или двойной слеш [ // ]. Все, что следует в строке за ними,
компилятором игнорируется. Если вам надо написать многострочный комментарий, необходимо каждую строку начинать
с этих знаков.
Добавляйте комментарии не только в заголовке, но и во
всех частях программы, это позволит облегчить разработку,
поиск ошибок и модернизацию программы в будущем.
Заголовок определяет директивы ассемблера («служеб-
ную инициализацию») для управления компилятором,
в частности по подключению внешних библиотек, определению макросов, размещению команд и данных в памяти, определению имён для регистров, обозначению констант. Название
каждой директивы начинается с точки.
42

Одна из самых главных частей заголовка – модель процессора. Программы не будут запускаться на других чипах без соответствующих изменений. Тип процессора определяется подключаемым файлом, в этом файле прописаны адреса регистров
ввода вывода, прерываний, расположение встроенной памяти
SRAM и EEPROM. Файлы называются по имени чипа, например для ATmega16 – m16def.inc, а для ATtiny2313 –
tn2313def.inc. По умолчанию файлы находятся в папке
"C:\Program Files (x86)\Atmel\AVR
Tools\AvrAssembler\Appnotes". Вот пример подключения биб-
лиотеки
.NOLIST ; Данная директива указывает, что
генерация файла листинга отключена
.INCLUDE " m16def.inc" ; Импортировать за-
головочный файл
.LIST ; Включить генерацию листинга
Листинг представляет собой комбинацию ассемблерного
кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако может быть отключена директивой
NOLIST (обычно включение всей библиотеки в листинг программы не нужно). Кроме того, данная директива может быть
использована совместно с директивой LIST для получения листингов отдельных частей исходных файлов.
А что же внутри файла m16def.inc? Первой строкой после длинного заголовка идёт Specify Device (определение
устройства)
.DEVICE ATmega16 ; Текущий тип (модель)
устройства
Директива .DEVICE позволяет компилятору проверить
соответствие команд процессора в программе текущему указанному типу AVR. Так что не следует указывать тип устройства в программе, ибо он есть в ****def.inc файле.
В заголовочном файле также определено, какие регистры
используются как XH, XL, YH, YL, ZH и ZL (это однозначно
R26…R31, однако должны быть определены все символьные
43

имена). Они нужны для определения частей 16-разрядных указателей X, Y или Z. В данном файле определены также все
порты, например PORTA представлен его HEX значением.
Имена портов соответствуют описаниям в Datasheet. Там же
определены единичные биты портов. Например, для доступа 5го бита порта C используется PINC5, что также соответствует
фирменному описанию. Важно, что аналогично определены
имена регистров управления и состояния всех функциональных модулей МК (например, таймеров) и ассемблерные имена
каждого их бита.
Другие компоненты, которые могут быть включены в заголовок программы, это определение регистров, присваиваемое программистом, например
.DEF TMP = R16 ; Создание удобного имени для
регистра R16
Вообще определение регистров полезно – так видно, какие
регистры используются (и с какой целью), а какие нет, это позволит рационально использовать регистры и избежать путаницы и конфликтов.
Там же, в заголовке программы определяются используемые константы. Например, частота тактового генератора, что
позволит при изменении параметров тактового генератора не
менять все части программы
.EQU fq = 4000000 ; частота тактового генератора
Полный список директив и их назначение см. в приложении 1 к файлу «Система команд Asm AVR.docx» в том же ка-
талоге, что и данное пособие.
В начале кода начала программы по адресу 0x0000
находится вектор сброса, т.е. адрес памяти команд, по которому перейдёт программа после включения питания или сигнала
RESET. Сразу за этим адресом с адреса 0x0002 начинается
таблица векторов прерываний. Выглядит это примерно так
44

.CSEG
.ORG $0000
rjmp Main ; Вектор сброса
Директива .CSEG указывает компилятору, что последующие строки принадлежат памяти команд, .ORG задаёт текущее смещение на определённый адрес, т.е. .ORG $0000
указывает, что следующая команда будет находиться по адресу
0x0000. rjmp Main – данная команда, находящаяся по
0000 адресу, осуществляет безусловный переход к метке Main
(следует учесть, что для чипов Mega с объёмом памяти программ ≥ 2Кх16 следует использовать команду jmp вместо
rjmp, в частности, у ATmega 16 размер памяти программ
8 Кслов). Аналогично .org OC1Aaddr указывает, что при
приходе на адрес OC1Aaddr (переход по прерыванию от таймера) следует выполнить команду, приведенную на следующий строке (rjmp _timer1oc1a – переход на данную метку
для обработки соответствующего прерывания).
Директивой .MACRO начинается определение макроса –
разработанной пользователем последовательности команд, которая часто будет использоваться в данной программе и которую удобно заменить одной макрокомандой.
В качестве параметра директиве .MACRO передаётся имя
макроса. При встрече имени макроса позднее в тексте программы, компилятор заменяет это имя телом макроса. Макрос
может иметь до 10 параметров, к которым в его теле обращаются через @0-@9. При вызове параметры перечисляются через запятые. Определение макроса заканчивается директивой
ENDMACRO. Например, задав макрос .macro outi и определив его как описано выше, цепочку
ldi r16,0x02
out porta,r16
заменяют макросом
outi porta, 0x02.
45

Такая замена популярна, чтобы не указывать использова-
ние «аккумулятора» R16.
В ходе выполнения лабораторной работы механизм макро-
сов будет рассмотрен подробнее.
Далее следует основная часть программы. Составлять
программу следует, придерживаясь принципа модульности
(организуйте отдельные модули со своими входами и переходами между подпрограмм с помощью меток). Желательно не
использовать кириллицу и транслитерацию в названии подпрограмм. Основной модуль должен быть охвачен циклом.
Особое внимание следует уделить воздействиям на регистры управления и состояния блоков МК (например, таймера,
АЦП и т.п.). В случае начальной установки (инициализации)
можно проанализировать необходимые значения каждого бита
и записать итог в виде двоичного кода (или hex-кода), например
outi SFIOR,0b11010000 //| делитель такт. частоты АЦП –
//| 64 с ускорением
Если же нужно по ходу программы изменить один или несколько битов, а при этом значение всех прочих битов данного
регистра должно оставаться неизменным, то можно использовать следующую последовательность команд (пример соответствует работе с регистром таймера Т1):
in r16, TCCR1B //| запуск Т/С1
sbr r16, (1<<CS11)+(1<<CS10) //| на частоте счета СК/64
out TCCR1B,r16 //| (для эмуляции только
//| 1<<CS10)
Здесь 1<< – оператор сдвига бита (см. ниже), а его необходимое
значение задается в команде sbr (set bit) или cbr
(clear bit). При необходимости многократной перенастройки таких битов можно создать для этого макросы, как
описано выше.
46

Многие другие приемы программирования на ассемблере
можно освоить, изучая примеры программ, приведенные в методических указаниях к данной и последующей лабораторным
работам.
Дальнейшие операции по управлению проектом и пере-
носу программы в флэш-память МК описаны в разделе «Рабочее задание» данной работы.
Предварительное задание
1. Изучите сведения о шаговых двигателях. В случае
надобности используйте файлы учебных материалов и лекции.
2. Повторите сведения об интегрированной среде разра-
ботки AVR Studio по разделу «Среда разработки и отладки
управляющих программ» данного пособия.
3. Откройте в том же каталоге, что и данное пособие,
файл «Система команд Asm AVR.docx», ознакомьтесь с ним и
используйте в дальнейшей работе.
4. Откройте в том же каталоге, что и данное пособие,
файл test3_asm.doc, изобразите графически программные модули /*Основная программа*/, /*Обработчик пре-
рывания по таймеру*/ и связи между ними, используя
стандартный стиль [13] или стиль Algorithm Builder [8]. Обратите внимание на то, что операция смещения единицы на выводах порта включена в подпрограмму обработки прерываний
от таймера и что основная программа завершается входом в
цикл ожидания прерывания.
5. Изучите рабочее задание и подготовьтесь к его выпол-
нению.
Рабочее задание
1. Соберите схему (см. файл «Стенд для изучения МК
AVR») в соответствии с рис. 5.
47

Плата от-
ладчика
Плата управления
ШД
Рис. 5
Шаговый двигатель до того, как будет загружена программа в МП (см. ниже), подключать не следует, ибо возможно
внутрисистемное зависание программатора-отладчика JTAG
ICE и придется заново его перепрограммировать. Питание на
плату управления следует подать от системного блока ПК, при
этом желательно, чтобы в это время компьютер был выключен.
2. Включите ПК. Запустите AVR Studio, откройте в нем
новый проект под именем LR3_1 в своем каталоге в папке
Users, выполняя процедуры, аналогичные описанным в пп. 1-4
из [3] (напоминание: имя каталога и весь путь к нему НЕ
должны содержать знаков КИРИЛЛИЦЫ!). Перенесите в окно
проекта текст программы из test3_asm.doc без комментариев.
Внимательно изучите организацию вывода сигналов на ШД
по схеме, приведенной в разделе «Назначение, состав и органы
управления лабораторного стенда», отредактируйте программу, выставив нужные разряды указанного в схеме порта, измените значения в использованных РОН.
3. Выберите в командной строке программы цепочку ко-
манд Debug → Select Platform and Device…: из появившегося
списка отметьте JTAG ICE (Debug Platform) и ATmega16
(Device).
Теперь нажмите клавишу F7, пиктограмму Assemble или
выберите пункт Build в меню Build, в результате чего начнется
48

трансляция программы. Затем выберите пункт меню Debug →
Start Debugging или соответствующую пиктограмму для за-
пуска отладки. В результате программа из вашего проекта загрузится в память программ МК ATMega 16 и вы получите
доступ к ресурсам этого МК для пошаговой отладки.
Напоминание: при отладке программы следует умень-
шать интервалы таймеров и коэффициент предделителя относительно расчетных, если они слишком велики, поскольку
в процессе отладки в AVR Studio программа выполняется
в тысячи раз медленнее, чем на реальной частоте МК и вы не
дождетесь срабатывания таймера (см. предыдущую работу).
4. Откройте окна Register и I/O View/PortA. Перемещаясь
по листингу с помощью клавиш F11, F10, отследите выполнение команд модуля *Основная программа*. Для анализа модуля *Обработчик прерывания по таймеру* установите курсор на его начало и дайте команду Run to cursor (Ctrl+F10).
Опробуйте управление ШД, если есть ошибки, измените программу, заново постройте проект, вновь запустите Start De-
bugging и снова проверьте работу программы.
5. Возвратите интервалы таймеров и коэффициент пред-
делителя (см. п. 4) к расчетным значениям, выйдите из режима
отладки (Stop Debugging), подключите ШД, наблюдайте работу шагового двигателя и светодиодов индикации в темпе работы МК.
6. Вернитесь в режим отладки, подберите параметры тай-
мера, дающие возможность наблюдать чередование фаз в темпе работы МК, затем подберите максимальную скорость вращения без пропусков (предел приёмистости ШД), запишите
эти значения в отчет, сохраните проект.
7. В новом экземпляре AVR Studio откройте новый проект
под именем LR3_2, перепишите в него текст программы из
LR3_1, закройте прежний экземпляр. Переработайте программу в соответствии с указаниями, данными в файле
test3_asm.doc красным шрифтом, сохраните проект.
8. В новом экземпляре AVR Studio откройте новый проект
под именем LR3_3, перепишите в него текст программы из
LR3_2, закройте прежний экземпляр Studio. Переработайте
49

программу так, чтобы логические единицы в биты порта А выводились в обратном порядке. Опробуйте работу ШД, сохраните проект.
9. Аналогично предыдущим пунктам откройте новый про-
ект под именем LR3_4, перепишите в него текст программы из
LR3_3, закройте прежний проект. Переработайте программу
так, чтобы в порте А перемещались две смежные логические
единицы. Обратите внимание на их переход с одного края разрядной сетки на другой. Доработайте программу так, чтобы
переход происходил через состояние 1001 (см. предыдущую
работу). Опробуйте управление ШД и сохраните проект. Поясните, как влияет такое управление на момент двигателя.
10. Откройте новый проект под именем LR3_5. Предложите
алгоритм управления ШД с дроблением шага пополам (см.
предыдущую работу), составьте и опробуйте соответствующую программу. Целесообразно при этом использовать ОЗУ
контроллера, занеся в нее последовательность включения обмоток в виде кодов и считывая их циклически. Следует учесть,
что в модели МК ATMega 16 фактическое адресное пространство ОЗУ начинается с адреса 0x0060. Полезно предварительно
восстановить в своей памяти навыки работы с ОЗУ, полученные при выполнении соответствующего задания из предыдущей лабораторной работы. Во время отладки пользуйтесь окнами I/O View/PortA, Registers и Memory/Data. Возвратите
интервалы таймеров и коэффициент предделителя (см. п. 5)
к значениям, дающим возможность наблюдать чередование
фаз в темпе работы МК, выйдите из режима отладки (Stop De-
bugging), наблюдайте работу шагового двигателя и светодиодов индикации в темпе работы МК.
11. Составьте отчет по перечисленным выше пунктам,
включая скриншоты программ и экранов эмуляции. Выделите
в пунктах отчета полученные навыки составления программ и
навыки пользования интегрированной средой разработки AVR
Studio, запишите отчет в файл под именем LR3 в той же папке,
что и программные модули.
12. Покажите результаты преподавателю, ответьте на его
вопросы.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
