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

Пособие HCS12 & Elvis II v.7.01

.pdf
Скачиваний:
223
Добавлен:
03.05.2015
Размер:
4.14 Mб
Скачать

Рис. 4.44. Свойства элемента Static Text

Для остальных светодиодов нужно проделать сходные операции:

Рис. 4.45. Полученная линейка светодиодов

Теперь добавим на рабочую область VisualizationTool переключатели. Для этого нужно осуществить переход в контекстном меню Add New Instrument Switch.

В свойствах переключателя (рис. 4.46) выберите тип Toggle Switch. Далее необходимо «подключить» элемент к симулируемому МК. т.е. назначить порт и линию. Устанавливаем опять адрес $0001 (порт B) в поле Port to display и номер бита равным 0 в поле Bitnumber to display. Дополнительно можно указать и другие настройки переключателя. Текстовые элементы добавляются на рабочую область так же, как и ранее.

101

Рис. 4.46. Свойства элемента Switch

Особенностью работы инструмента Switch является то, что режим линии, к которой он подключается, должен быть определён значением 1 в регистре направления передачи порта. И это несмотря на то, что линия работает на ввод.

Инструмент LED работает с правильной логикой. Поэтому линия, к которой подключается этот элемент, должна быть проинициализирована значением 1 в соответствующем регистре направления передачи.

Таким образом, для переключателей SW3-1..SW3-4 и светодиодов LED1..LED4 выполненного примера в регистр DDRB ($0003) нужно записать значение $FF = %11111111. Для кнопок SW1 и SW2 нужно установить в единицу два младших разряда регистра DDRP ($025A).

Далее необходимо настроить свойства приложения VisualizationTool. Нажав правой кнопкой мыши на рабочей области и выбрав пункт меню Properties, откроется окно с настройками VisualizationTool. В нём необходимо изменить режим работы Refresh Mode на Periodical и период обновления Refresh Time установить в 1. Это заставит данные обновляться с интервалом в 100 мс. Готовая конфигурация компонента VisualizationTool, содержащая кнопки и светодиоды реального лабораторного стенда, представлена на рис. 4.47. При этом пользователь не обязан ею ограничиваться, он вправе создать любой другой виртуальный набор устройств ввода/вывода.

102

Рис. 4.47. Готовая конфигурация компонентов утилиты VisualizationTool

Созданные образы визуализации с их «подключениями» к МК можно сохранить на диск компьютера, нажав Ctrl+S. Воспользовавшись кнопкой на панели инструментов окна VisualizationTool или нажав комбинацию клавиш Ctrl+L.

После конфигурирования компонента VisualizationTool в контекстном меню рабочего поля можно переключить режим с Edit Mode на Display Mode. Теперь можно запустить отлаживаемую программу на исполнение (например, нажав на F5). Вы увидите, выставив положение переключателей SW3-1..SW3-4 и нажимая кнопки SW1 и SW2, как работает Ваше приложение.

4.8. Псевдокоманды и методика их использования для создания программ

Программа компилятора преобразует (транслирует) исходный текст программы, записанный с использованием мнемокода команд микроконтроллера, в двоичные коды. При этом транслирующая программа берет на себя многие из рутинных задач программиста, таких как присвоение действительных адресов, преобразование чисел, присвоение действительных значений символьным переменным и др. Но всё же пользователь должен указать некоторые параметры: начальный адрес прикладной программы, конец ассемблируемой программы, форматы данных и т.п. Всю эту информацию программист указывает в исходном тексте своей прикладной программы в виде псевдокоманд, которые только управляют процессом трансляции и не преобразуются в коды управляющей программы для микроконтроллера.

Для более полного рассмотрения использования псевдокоманд в программах и получения практических навыком их применения рассмотрим программу “Example” из раздела 4.3.

В тексте программы “Example ” используются четыре псевдокоманды для программы транслятора (программу транслятора с языка ассемблера именуют просто программой Ассемблер). В процессе выполнения лабораторных работ Вы будете использовать 6 типов псевдокоманд. Это следующие команды:

EQU – команда присвоения численного значения символьному имени.

ORG – команда установки значения счётчика адресов программы Ассемблер. DC.B – команда записи в память МК одного или нескольких численных

однобайтовых значений.

DC.W – команда записи в память МК одного или нескольких численных двухбайтовых значений.

103

DS.B – команда резервирования ячеек памяти ОЗУ (в однобайтовом формате). DS.W – команда резервирования ячеек памяти ОЗУ (для двухбайтового слова).

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

Псевдокоманда EQU присваивает численное значение любого формата некоторой символьной переменной. Эта переменная может быть адресом или константой данных, которую в программе записывают в символьном виде. Важно только понять, что команда EQU позволяет лишь соотнести назначенное численное значение с каким-либо символьным именем. Никаких команд собственно для МК она не формирует. Однако, если далее в программе упомянуть имя, то вместо него при ассемблировании будет подставлено назначенное численное значение.

Пример 1

ROMStart EQU $E000

;$E000 можно заменить, например на $9000.

Заметьте, с точки зрения транслятора, абсолютно безразлично, какое число Вы запишете после EQU. Но Вам необходимо, чтобы программа в МК размещалась по тем адресам, где присутствует реальная физическая память. Поэтому для работающей программы число $9000 недопустимо, а вот $E200 или $F100 вполне допустимы, т.к. совершенно необязательно, чтобы программа управления начиналась с начального адреса ПЗУ микроконтроллера.

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

Пример 2

ROMStart

EQU

$E000

;$E000 можно заменить, например на $9000.

CONST1

EQU

$31

;Имени CONST1 присваивается значение $31.

 

ORG

ROMStart

;Команда ORG задает начальный адрес программы в

 

 

 

;памяти МК.

MAIN:

LDAA #CONST1

;Загрузить в аккумулятор A число $31

 

LDAB CONST1

;Загрузить в аккумулятор B число из ячейки памяти с

 

 

 

;адресом $31.

Обратите внимание, в тексте основной программы дважды использована символьная константа CONST1. В первом случае, благодаря знаку “#”, она используется как данные. Во втором случае – как адрес. При этом программист должен следить, чтобы формат численного значения символьной переменной применялся так, как нужно в данном случае. Так при транслировании текста примера 3 будет обнаружена ошибка, поскольку двухбайтовое число $AF31 невозможно разместить в формат команды LDAA с непосредственной адресацией.

Пример 3

CONST2

EQU

$AF31

;Имени CONST2 присваивается значение $AF31.

 

ORG

ROMStart

;Команда ORG задает начальный адрес программы в

 

 

 

;памяти МК.

104

MAIN:

LDAA #CONST2

;Загрузить в аккумулятор A число $AF31

Псевдокоманда ORG устанавливает значение внутреннего счётчика адресов программы Ассемблер. Не следует путать этот внутренний счётчик с программным счётчиком PC в центральном процессоре МК. Внутренний счётчик использует программа трансляции для размещения кодов команд для МК памяти МК.

Пример 4

 

 

ORG

$E000

;Установить значение внутреннего счётчика равным

 

 

;$E000.

Пример 5

 

 

ROMStart EQU

$E000

;Установить для имени ROMStart значение $E000

ORG

ROMStart

;Задать значение внутреннего счётчика, равное

 

 

;ROMStart = $E000.

Нетрудно видеть, что действия в примерах 4 и 5, совершаемые с помощью псевдокоманд, одинаковые. Однако запись примера 5 более профессиональна, поскольку позволяет изменением численного значения в первой строке переназначить начало ПЗУ в тексте всей программы.

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

Псевдокоманда DC.B предназначена для занесения в память МК численного однобайтового значения (Byte). Следует отметить, что при отладке программы на реальном физическом МК эту псевдокоманду следует применять только для занесения значений в постоянную память. В случае использования программного симулятора Вы можете с помощью этой псевдокоманды заносить значения и в ОЗУ МК.

Пример 6

 

ORG $E000

;Установить значение внутреннего счётчика равным

 

;$E000.

DC.B $23

 

DC.B $FA

 

DC.B $7D

 

После исполнения данного программного фрагмента в ячейки памяти с адресами $E000, SE001, $E002 записываются коды $23, SFA, S7D соответственно. Сточки зрения синтаксиса записи, действие примера 6 можно записать в более компактном виде:

Пример 7

 

ORG $E000

;Установить значение внутреннего счётчика равным

 

;$E000.

DC.B $23,$FA,$7D

105

При записи строки после псевдокоманды DC.B перед числами не нужно ставить знак “#” и их следует разделять запятыми. Пробелов после запятой быть не должно, и после последнего числа не должна стоять запятая. Также не следует располагать в строке более 8 чисел.

При занесении константных значений в память с использованием псевдокоманды DC.B часто встречается ситуация, когда необходимо занести несколько массивов с именами и иметь возможность обращаться к их отдельным элементам. Эту задачу можно решить посредством следующей конструкции программного кода:

Пример 8

 

ORG $F300

;Расположить первый массив, начиная с адреса $F300.

ARR1:

DC.B $23,$FA

 

ARR2:

DC.B $32,$56,$DA,S56

Такая запись автоматически присвоит имени ARR1 текущее значение внутреннего счётчика, а именно $F300. Далее транслятор расположит два байта массива в памяти по адресам $F300 и $F301. Затем имени ARR2 будет присвоено новое текущее значение внутреннего счётчика, а именно $F302 и четыре байта этого массива транслятор разместит по адресам $F302..$F305. В тексте программы допустимо будет использование следующих ссылок на введенные константные значения:

LDAA ARR1+1 ;В аккумулятор A будет загружено число $FA. ADDA ARR2+2 ;Будет выполнено сложение содержимого A

;с числом $DA.

Псевдокоманда DC.W предназначена для занесения в память МК численного двухбайтового значения (Word). Для этой команды действуют абсолютно все правила синтаксиса, что и для псевдокоманды DC.B. При отладке программы на реальном физическом МК эту псевдокоманду следует применять только для занесения значений в постоянную память. В случае использования программного симулятора Вы можете с помощью этой псевдокоманды заносить значения и в ОЗУ МК.

Пример 9

 

ORG $E000

;Установить значение внутреннего счётчика равным

 

;$E000.

DC.W $231B

 

DC.B $FE

 

DC.W $D6

 

После размещения транслятором в памяти МК указанных константных значений в памяти будут записаны следующие коды:

Табл. 4.1. Размещение кодов в памяти

Адрес

Данные

$E000

$23

$E001

$1B

$E002

$FE

$E003

$00

$E004

$D6

106

Обратите внимание, что по адресу $E002 размещено однобайтовое число, как и указано соответствующей псевдокомандой. А в ячейке $E003 записано число $00, поскольку третьей директивой задан двухбайтовый формат числа, а в поле данных написано однобайтовое значение. Так же, как и в предыдущем случае, каждому из чисел может быть автоматически присвоено символьное имя:

Пример 10

 

ORG $E000

;Установить значение внутреннего счётчика равным

 

 

;$E000.

CONST1

DC.W $231B

 

TIM

DC.B $FE

 

RTC

DC.W $D6

 

Псевдокоманды DS.B и DS.W резервируют в оперативной памяти МК ячейки для хранения промежуточных результатов вычислений.

Пример 10

 

ORG

$0060

;Установить значение внутреннего счётчика равным

 

 

 

;$0060.

Byte1:

DS.B

1

;Для переменной с именем Byte1 зарезервировать

BUF1:

DS.B

3

;1 байт памяти.

;Для переменной с именем BUF1 отвести 3 байта

BUF2:

DS.W

3

;Для переменной с именем BUF2 отвести 6 байт

 

 

 

;(3 слова).

По аналогии с псевдокомандами DC.B и DC.W к зарезервированным таким образом ячейкам ОЗУ можно обращаться с использованием объявленных имен:

LDAA BUF1+2 ;Будет считано число из ячейки памяти с адресом $63. STAA BUF2+1 ;Число будет загружено в младший байт первого слова

;массива BUF2, т.е. в ячейку памяти с адресом $65.

107

5. Лабораторный практикум по курсу «Шестнадцатиразрядные микроконтроллеры семейства

HCS12»

Лабораторная работа № 1

Архитектура МК MC68HC12. Знакомство с технологией отладки программы в среде CodeWarrior Development Studio

Содержание

В данной лабораторной работе изучается архитектура МК MC9S12C128, программно-логическая модель центрального процессора HCS12, распределение адресного пространства МК MC9S12C128.

Также изучается простейший формат записи программы на языке Ассемблера, технология преобразования исходного текста программы в машинные коды для загрузки в МК, технология отладки разработанной программы с использованием программно-

логической модели (симулятора) IDE CodeWarrior Development Studio for S12(X).

Подготовка к работе

Для успешного выполнения работы рекомендуется изучить программно-логическую модель центрального процессора HCS12, способы адресации операндов, используемые этим процессором, а также получить вводные сведения о программировании на языке Ассемблера.

Практическая часть

В ходе выполнения всех последующих лабораторных работ настоящего практикума, посвященных изучению системы команд и приобретению навыков программирования на языке Ассемблера для МК семейства HCS12 компании Freescale Semiconductor, Вы будете выполнять стандартную последовательность действий:

1.Ввод исходного текста программы на языке Ассемблера с использованием редактора пакета интегрированной среды разработки Программного Обеспечения (ПО) для микропроцессорных систем WinIDE CodeWarrior;

2.Ассемблирование исходного текста прикладной программы с целью получения машинного кода для загрузки его в память МК;

3.Загрузка машинного кода созданной Вами программы в память МК;

4.Ввод в память МК исходных данных для выполнения программы;

5.Выполнение программы, анализ результатов работы программы.

Описанная последовательность действий именуется процессом разработки и отладки прикладной программы управления встраиваемой микропроцессорной системы. На данном занятии Вы должны получить практические навыки управления программным пакетом “Интегрированная среда разработки (IDE) CodeWarrior Development Studio for S12(X)” для МК модели MC9S12C128 семейства HCS12 на примере простейшей программы EX_1_1.

Программа EX_1_1 производит пересылку содержимого 5 ячеек ПЗУ в ОЗУ МК. Начальный адрес ПЗУ, где расположены данные для пересылки - E100h (или $E100),

108

Следовательно, исходный массив array1 расположится в ячейках памяти с адресами $E100, $E101, $E102, $E103 и $E104. Адрес области ОЗУ, куда будут производить пересылку - 60h (или $0060). Следовательно, конечный массив array2 расположится в ячейках памяти с адресами $60, $61, $62, $63 и $64. Исходный текст программы EX_1_1 представлен ниже.

Примечание. Система команд МК семейства НСS12 подробно изучается в следующих лабораторных работах. Данный пример приведен исключительно для демонстрации возможностей симулятора по вводу и исполнению программы, поэтому выбранный способ решения задачи на данном этапе не обсуждается. Необходимые пояснения по способу решения даны в комментариях.

Пример 1.1

;Моя первая программа EX_1_1

;Текст, расположенный после символа “;”, называется комментарием и при ;ассемблировании программы не учитывается. Используйте комментарии для пояснения ;выполняемых Вами смысловых действий прикладной программы.

 

ORG

$E000

;Команда ORG задает начальный адрес Вашей

 

 

 

;программы в памяти МК. При ассемблировании

 

 

 

;первая команда будет размещена в ячейке памяти с

ex_1_1:

movb #$08,$11

;адресом $E000.

;Установка начального адреса области регистров

 

 

 

;специальных функций в $0800. Таким образом,

 

 

 

;освобождается диапазон адресов $0000..$07FF под

 

ldx

#$E100

;ОЗУ.

 

;Индексный регистр X загружается начальным адресом

 

movb #5,$70

;первого массива array1.

 

;Ячейка памяти ОЗУ c адресом $70 выбрана в качестве

 

 

 

;счетчика циклов. Предварительно рассчитали, что

 

 

 

;конечный массив не займет эту ячейку, поэтому её

m1:

ldaa ,x

;можно использовать.

;Загружаем байт памяти из ячейки первого массива в

 

staa $1F60,x

;аккумулятор А.

 

;Пересылаем данные из аккумулятора A в память МК

 

 

 

;по адресу, вычисленному по формуле: (X) + $1F60.

 

 

 

;$E100 + $1F60 = $10060. Старший разряд 1 выходит за

 

 

 

;пределы 16-разрядного формата регистра адреса,

 

 

 

;поэтому автоматически отбрасывается, полученное

 

inx

 

;значение адреса равно $0060.

 

$70

;Увеличиваем содержимое индексного регистра X на 1.

 

dec

;Уменьшаем счетчик циклов на 1.

 

bne

m1

;Проверяем счетчик циклов на 0. Если не 0, то

 

 

 

;продолжить исполнение программы, перейдя по метке

 

jmp

*

;m1. Иначе переход на следующую команду.

 

;Если все байты массива перемещены, то исполнять

 

 

 

;пустой цикл (бесконечный переход по адресу текущей

 

 

 

команды). Такое решение необходимо, чтобы при

 

 

 

;отладке в автоматическом режиме исключить

 

 

 

;исполнение произвольного кода из памяти МК,

 

 

 

;который Вы не загружали.

 

ORG

$FFFE

;Задать адрес вектора начальной загрузки. При

 

 

 

109

DC.W $E000

;включении МК этот адрес ($E000) автоматически

 

;загрузится в счетчик PC центрального процессора.

 

;Конец текста для ассемблирования.

Приступим к процессу ассемблирования и отладки. Для этого запустите программу

CodeWarrior Development Studio for S12(X). Следуйте по всплывающим диалоговым окнам создания нового проекта.

Сначала появится окно, изображённое на рис. 5.1. Для создания нового проекта в нём необходимо щёлкнуть по кнопке “Create New Project”. Если Вы намерены открыть ранее начатую программу, то надо выбрать “Load Previous Project”.

Рис. 5.1. Окно выбора начального действия

В следующем окне (рис. 5.2) необходимо выбрать модель МК, для которой Вы будете создавать проект. Это MC9S12C128.

Здесь также необходимо выбрать способ отладки проекта, который Вы хотите использовать. На первом занятии Вы будете разрабатывать программу с помощью программно-логической модели микроконтроллера, встроенной в среду разработки, т.е. в режиме программной симуляции. Поэтому следует выбрать опцию “Full Chip Simulation”. Этот же режим Вы будете использовать при домашних занятиях во время самостоятельной подготовки. Далее на занятиях Вы будете осуществлять отладку созданных программ на реальном контроллере, в этом случае нужно выбирать опцию

P&E Multilink/Cyclone Pro”.

110