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

2341

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
1.43 Mб
Скачать

Лабораторная работа № 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 Debugging и снова проверьте работу программы.

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 Debugging), наблюдайте работу шагового двигателя и светодиодов индикации в темпе работы МК.

11.Составьте отчет по перечисленным выше пунктам, включая скриншоты программ и экранов эмуляции. Выделите в пунктах отчета полученные навыки составления программ и навыки пользования интегрированной средой разработки AVR Studio, запишите отчет в файл под именем LR3 в той же папке, что и программные модули.

12.Покажите результаты преподавателю, ответьте на его вопросы.

50

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]