Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микроконтроллеры в системах управления. Лабораторный практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Лабораторная работа № 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]