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

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

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

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

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

(CodeWarrior Updater).

Вполе Connections нужно выбрать способ отладки проекта, который Вы хотите использовать. В данном лабораторном практикуме возможны два варианта выбора:

Full Chip Simulation – полная программная симуляция микроконтроллера выбранного типа. В этом случае используется компьютерная модель, реального элемента не требуется. Такой способ отладки применяется для первичного тестирования алгоритмов, проверки времени их выполнения без использования аппаратных устройств.

TBDML – отладка приложения на аппаратном прототипе или действующем устройстве и использованием интерфейса Turbo BDM Light. Для связи с компьютером на плате отлаживаемого микроконтроллера должен быть установлен адаптер BDM (Background Debug Mode).

По умолчанию выбран пункт “Full Chip Simulation”.

71

Рис. 4.4. Первое окно мастера создания проекта

После выбора МК перейдите к следующему окну (рис. 4.5). Здесь следует выбрать один или несколько языков, на которых Вы будете программировать МК, имя проекта, папку для фалов проекта.

Пакет CodeWarrior поддерживает несколько языков программирования: ассемблер, C и C++. Допускается использовать их совместно в одном проекте. Язык C поддерживается всеми версиями IDE с ограничением максимального размера программы в 32 КБ в бесплатной специальной версии, которую можно загрузить с сайта компании Freescale Semiconductor. Язык C++ поддерживается только профессиональной версией

CodeWarrior.

Среди языков низкого уровня пользователь может выбрать абсолютный ассемблер, при программировании на котором переменные находятся в указанных программистом фиксированных ячейках памяти, или перемещаемый ассемблер, в котором используются специальные внутренние директивы, позволяющие линковщику выбирать адрес переменной. Перемещаемый ассемблер позволяет создать проекты, состоящие из нескольких файлов. Также он используется при комбинированном программировании на языке C и на ассемблере.

На начальной стадии обучения Вы будете использовать только язык ассемблера. Поэтому следует снять отметку против языка C и установить отметку против опции

Absolute assembly”.

В этом окне в поле “Project name” нужно набрать имя создаваемого проекта, а в “Location” – путь расположения его файлов. С помощью кнопки “Set…” можно сразу указать папку, тогда её имя автоматически скопируется в поле имени.

72

Рис. 4.5. Второе окно мастера создания проекта

В следующем окне (рис. 4.6) Вам предоставляется возможность добавить к вновь создаваемому проекту уже имеющийся готовый материал. Для этого нужно поочерёдно выбирать нужные файлы и нажимать кнопку “Add”. Отметка пункта “Copy files to project” приведёт к автоматическому копированию выбранного материала в папку нового проекта, а установка галочки возле “Create main.c/main.asm” – к автоматическому созданию основного файла с исходным кодом.

Рис. 4.6. Третье окно мастера создания проекта

Если Вы не хотите присоединять сторонние файлы, то необходимо просто нажать

Next >”.

Окно 4 является завершающим в конфигурировании нового проекта. Здесь нужно выбрать компонент для ускорения разработки ПО. Всего доступно три варианта:

None – не использовать дополнительных инструментов.

Device Initialization – инструмент инициализации периферийных устройств. С помощью интуитивно понятного интерфейса пользователь выбирает начальные

73

режимы работы различных модулей МК (порты, АЦП и др.). После этого Device Initialization автоматически сгенерирует исходный код на ассемблере или на C. В нём будут записаны операции установки подходящих двоичных значений нужным регистрам специальных функций.

Processor Expert – инструмент инициализации устройств и автоматического создания типовых функций их обслуживания. Как и Device Initialization, позволяет автоматически генерировать текст с установкой начальных режимов периферийных модулей, а также часто используемые с ними программные фрагменты. В профессиональной версии CodeWarrior с помощью инструмента Processor Expert можно создавать исходный код для некоторых алгоритмов.

В текущем лабораторном практикуме необходимо самостоятельно научиться настраивать микроконтроллер и его компоненты, поэтому следует выбрать опцию “None”. После того, как Вы нажмете кнопку “Finish”, на экране монитора откроется основное окно интегрированной среды разработки CodeWarrior Development Studio for S12(X) (рис. 4.8).

Рис. 4.7. Четвёртое окно мастера создания проекта

4.3. Создание исходного текста программы на языке ассемблера

Если в окне 3 мастера создания нового проекта (рис. 4.5) пользователь выбрал язык абсолютного ассемблера и прошёл все дальнейшие шаги, то окно пакета CodeWarrior будет выглядеть так, как показано на рис. 4.8. Интерфейс среды разработки содержит в себе две основные области: окно проекта и окно текстового редактора.

74

Рис. 4.8. Основное окно IDE CodeWarrior Development Studio for HC(S)12

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

*.inc – файлы, с помощью которых подключаются названия регистров специальных функций, написаны на ассемблере;

main.asm – исходный код программы.

Рис. 4.9. Окно проекта

Кнопки Make и Debug . В правой верхней части основного окна расположен ряд кнопок. По нажатию на Make начинается процесс сборки проекта (режим Build). При

75

этом все файлы проекта компилируются и “линкуются” (соединяются). Если нажать на кнопку Debug, то произойдет то же самое, но после сборки проекта автоматически запустится отладчик. Если в последнем используется не программная симуляция, а аппаратная платформа, то созданный машинный код будет автоматически занесён во flash-память микроконтроллера. Таким образом, IDE CodeWarrior автоматически выполняет сначала стирание ПЗУ, а затем программирует её.

Для написания текста программы необходимо открыть в окне проекта папку Sources и сделать двойной щелчок левой кнопкой мыши по файлу main.asm. После этого откроется окно текстового редактора.

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

можно увидеть 5 кнопок управления: Header files , Functions , Markers ,

Document settings и Version control (рис. 4.8).

Кнопка Header files показывает список всех файлов проекта с учетом текущего. Этот список обновляется только после очередной сборки проекта. Можно открыть любой файл, просто выбрав его в списке.

Кнопка Functions показывает все функции, объявлённые в файле. Это очень полезная функция для навигации по файлу: просто выберите функцию в списке, и начало тела функции будет показано в окне редактора.

С помощью кнопки Markers можно вывести список специальных отметок в программном коде (маркеров), которые не оказывают влияния на компиляцию текста, но позволяют легко находить в тексте отмеченные программистом строки. Число маркеров с разными именами может быть произвольным.

Система контроля версии ПО (CVS – Concurrent Version System) полезна для контроля изменений в программе. Перед использованием, её необходимо активизировать. Для этого необходимо зайти в окно настроек, выбрав пункт меню Edit Version Control Setting основного меню среды разработки. Если CVS включена, то иконка с изображенным замком превратится в карандаш.

Создадим в файле main.asm Ваше первое приложение “Example”.

Для этого изменим текстовый файл, который находится в окне редактора. Сначала необходимо удалить из него все предварительные записи (они необходимы при профессиональном уровне разработки). Далее ввести текст программы, приведенный ниже.

Пример

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

RAMStart

EQU

$0400

;Назначение имени RAMStart значения $400 (начало

ROMStart

EQU

$C000

;области ОЗУ).

;Назначение имени ROMStart значения $C000 (начало

StartVector

EQU $FFFE

;области ПЗУ).

;Адрес вектора начального пуска.

PRTB

EQU

$01

;Адрес регистра данных порта B.

DDRB

EQU

$03

;Адрес регистра направления передачи данных через

PUCR

EQU

$0C

;порт B.

;Адрес регистра контроля подтягивающих резисторов.

76

ORG

$E800

;Инструкция ORG задаёт начальный адрес записи

 

 

;следующей за ней команды. В данном случае будет

 

 

;записан не код операции, а первый элемент

 

 

;определяемого нами массива, т.е. $80 (см. ниже).

DC.B $80,$70,$00,$С0

;Запись в память массива значений,

 

 

 

;выводимых на порт B. Взят ряд в

 

 

 

;обратном коде от чисел $7F, $8F, $FF,

 

 

 

;$3F, т.к для светодиодов активным

 

 

 

;уровнем является логический ноль.

ORG

ROMStart

 

;Начальный адрес программы в памяти МК. При

 

 

 

;ассемблировании двоичный код первой

 

 

 

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

 

 

 

;адресом $C000. Программа обязательно должна

 

 

 

;размещаться в области ПЗУ.

MOVB #$F0,DDRB

 

;Инициализация младших четырёх битов

 

 

 

;порта B на ввод, остальных старших – на

BSET PUCR,$02

 

;вывод.

 

;Включение подтягивающих резисторов

 

 

 

;порта В.

example LDAA #$E8

 

;Загрузка в аккумулятор A старшего байта

LDAB PRTB

 

;адреса заданного массива.

 

;Считывание данных из порта B.

ANDB #$03

 

;”Отсечка” ненужных старших разрядов.

 

 

 

;Таким образом, в аккумуляторе D сформирован

 

 

 

;адрес ячейки памяти, данные из которой нужно

XGDX

 

 

;вывести на порт B.

 

 

;Посылка адреса в индексный регистр X.

LDAB ,X

 

;Загрузка в аккумулятор B данных из ячейки

 

 

 

;памяти, адрес которой хранится в индексном

COMB

 

 

;регистре X.

 

 

;Побитная инверсия значения аккумулятора B.

STAB PRTB

 

;Сохранение в порт B.

JMP

example

 

;Возвращение в начало программы.

 

 

 

;Т.к. цикл бесконечный, то порт B будет

 

 

 

;постоянно опрашиваться микроконтроллером.

ORG

StartVector

;Установка адреса начального пуска. При

DC.W

ROMStart

 

;включении микроконтроллера значение $C000

 

 

 

;автоматически загрузится в счётчик команд PC

 

 

 

;центрального процессора.

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

77

Рис. 4.10. Окно среды CodeWarrior с исходным текстом проекта Example

Программа “Example” производит вывод 4-разрядных двоичных кодов на порт B микроконтроллера в зависимости от положения двух переключателей SW3-1 и SW3-2, которые подключены ко входам PRTB0 и PRTB1 соответственно. Для кода

SW3-2 : SW3-1 = 11 будет показан код $3, т.е. будут гореть только светодиоды LED1 и LED2 лабораторного стенда. При SW3-2 : SW3-1 = 01 программа выведет на порт B значение $8, при котором активным будет только элемент LED4. Какие светодиоды загорятся при комбинациях переключателей SW3-2 : SW3-1 = 11 и SW3-2 : SW3-1 = 10? Далее программа “Example ” поможет нам разобраться с основными правилами записи программы на языке ассемблер, а также получить первичные навыки отладки

программы с использованием симулятора микроконтроллера.

Рассмотрим более подробно текст программы “Example ”. Первые три записи с псевдокомандами EQU отражают распределение адресного пространства реального микроконтроллера MC9S12C128. Его ПЗУ расположено в памяти, начиная с адреса $C000 (см. раздел 2.2). В тексте программы это отражено записью в верхней строке. Внутреннее ОЗУ микроконтроллера располагается, начиная с адреса $0400, что отражено третьей строкой. Наконец, в третьей записи объявляется адрес двух 8-разрядных ячеек памяти, из которых микроконтроллер считывает начальный адрес программы и начинает её исполнение. В исходном тексте начальный адрес программы принято обозначать меткой “Main”, на профессиональном языке его называют вектором начального запуска или, более кратко, вектором сброса. В нашем примере такое имя не используется, т.к. адрес первой команды основной программы является началом ПЗУ микроконтроллера. Т.е. в последней команде DC.W можно использовать имя ROMStart. В изучаемой модели микроконтроллера MC9S12C128 адрес вектора сброса должен располагаться в ячейках памяти с адресами $FFFE и $FFFF.

Далее по тексту программы объявляются адреса специальных регистров, которые управляют портами ввода и вывода МК.

Особое внимание следует обратить на строку ORG ROMStart. В ней программе ассемблера указывается, что все последующие команды программы она будет располагать

78

с адреса ROMStart. Поскольку выше по тексту программы имени ROMStart было назначено значение, то код программы будет расположен с адреса $C000.

Также обратите внимание на строку с записью ORG $E800. После этой записи программа ассемблера будет располагать все последующие коды, начиная с адреса $E800. Далее по тексту программы следует строка:

DC.B $80,$70,$00,$С0

С помощью неё с использованием псевдокоманды DC.B в память заносится массив из четырёх значений, отделёнными друг от друга запятыми. Числа будут расположены по адресам $E800, $E801, $E802, $E803.

Рассмотрим две последние строки программы:

ORG StartVector

DC.W ROMStart

Первая запись указывает адрес, начиная с которого будут записаны все последующие коды. Во второй строке с помощью команды DC.W в памяти размещаются два байта данных (или машинное слово, word). Т.к. ранее именам ROMStart и StartVector были присвоены значения, то значение $C0 будет записано по адресу $FFFE, а $00 – по $FFFF. Т.е. значение вектора сброса будет равно $C000. Это адрес, с которого микроконтроллер начинает запуск программы.

Рассмотрим теперь, какие смысловые действия записаны в приведённом примере. После команды ORG ROMstart происходит инициализация различных периферийных модулей. После запуска (сброса) по умолчанию все порты микроконтроллера настроены на ввод. Поэтому можно было не инициализировать направление передачи через младший ниббл порта B, а только через старший. Но в качестве примера произведена настройка режимов работы для всех восьми цифровых линий. Сделано это при помощи записи значения $F0 в регистр направления передачи порта B DDRB.

Далее в младших четырёх линиях порта B, включаются «подтягивающие вверх» (pull-up) резисторы. Эти сопротивления нужны для того, чтобы на ножку микроконтроллера, если она настроена на ввод, стабильно приходила логическая единица. Если не использовать эти резисторы, то на выводе порта в режиме ввода и отсутствии на нём внешнего сигнала будет присутствовать некоторый уровень напряжения. Его величина не будет однозначно определяться, а будет зависеть от сопротивления каналов внутренних закрытых КМОП-транзисторов, работающих как делитель напряжения.

Начиная с команды с меткой example и до конца программы, происходит опрос кнопок, выбор нужного значения из массива и вывод его на светодиоды.

На этом закончим разбор исходного текста программы. Более подробное описание псевдокоманд (ORG, EQU, DC.B и др.) с пояснениями по их применению вы найдёте в разделе 4.8.

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

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

79

4.4. Отладка проекта в среде CodeWarrior

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

Пакет разработки CodeWarrior предоставляет разработчику вести отладку в двух режимах:

Simulation – режим программной симуляции микроконтроллера.

Debug – режим отладки на реальном физическом микроконтроллере.

Программная симуляция – это первая ступень проверки разработанного прикладного ПО. При таком способе отладки программу исполняет не реальный микроконтроллер, а компьютер, который имитирует работу микроконтроллера MC9S12C128. Программная симуляция – это идеальный вариант для начальной проверки ПО, поскольку никаких аппаратных средств не требуется.

В режиме Dubug отладка происходит с применением специальных аппаратных средств. Программа загружается и исполняется настоящим микроконтроллером, выходы которого подключены к реальным устройствам сопряжения с объектом управления. Такой способ отладки позволяет проверить правильность написания программы с учётом всех внешних сигналов и схемотехнических особенностей всего устройства в целом.

Среда CodeWarrior имеет в своем составе программы отладки для обоих из рассмотренных режимов. Называются они “True Time Simulator” и “Real Time Debugger”. Эти утилиты сведены в одну, поэтому при запуске отладчика Вы увидите окно с названием “True Time Simulator & Real Time Debugger”.

Сначала научимся работать в режиме симуляции. Этот режим Вы можете использовать для самостоятельных занятий дома.

Для того чтобы созданная программа была исполнена, её двоичный код необходимо загрузить в память микроконтроллера. Поскольку последний в нашем случае виртуальный, то загрузка выполняется автоматически в процессе запуска программы симулятора.

После того, как Вы добьетесь успешного ассемблирования исходного текста,

следует нажать кнопку Debug или кнопку F5 клавиатуры. Двоичный код загрузится в программу симулятора и на экране монитора появится образ отладчика микроконтроллера среды CodeWarrior (рис. 4.11).

80