ytgf6785f86rf  
Главная
Продукция
Партнеры
Статьи
О нас

Контакты

Ссылки

Написание и отладка программ для микроконтроллеров 51семейства

в среде VISION-2.

Часть 1.

 


На сегодняшний день приходится констатировать некоторый информационный вакуум вокруг WINDOWS ориентированных средств проектирования для микроконтроллеров 51 семейства. Данная статья описывает создание и отладку программ в интегрированной среде разработки mVISION-2. Особое внимание уделено особенностям ассемблера фирмы Keil. Статья призвана помочь разработчикам осуществить быстрый переход от DOS к WINDOWS ориентированным средам разработки.


Эра микроконтроллеров 51 семейства началась очень давно. Их долгая жизнь не случайна и определена в основном двумя факторами: удачной архитектурой и возможностью операций с битами.
Отрадно, что всё хорошее в мире имеет тенденцию к развитию. Появились восьми разрядные микроконтроллеры с другими системами команд, это PIC и AVR микроконтроллеры.
Однако, как показывает время, отказываться от старого доброго 51 семейства ещё рано. Разработчики таких фирм, как SiLab и Philips предложили конкурентно способные изделия, вобравшие в себя много хорошего из микроконтроллеров семейств PIC и AVR. Есть множество задач, которые могут быть успешно решены с применением микроконтроллеров 51 семейства. Бывает проще и дешевле воспользоваться готовыми библиотеками программ, чем стремиться к достижению максимально возможной производительности.
За последнее время вышел целый ряд книг [1, 2], посвященный программированию на языке ассемблера для микроконтроллеров 51 семейства. Однако в этих книгах описывается старая среда программирования — DOS, с которой, например, операционная система WINDOS XP работает некорректно. Кроме того, возможности старой среды проектирования ни как не идут в сравнение с возможностями среды VISION-2, а высокая популярность PIC и AVR микроконтроллеров частично определена доступными и высоко интегрированными средами проектирования (например, AVR STUDIO). Наверное, не будет очень субъективным следующее высказывание: работая в TASM, написание программы неминуемо потребует несколько рабочих циклов отладка-прошивка, работа же в среде VISION-2 позволяет выполнить отладку с первого раза или, по крайней мере, значительно сократить количество рабочих циклов. Интегрированная среда разработки VISION-2 не волшебник, который укажет на все ошибки, допущенные Вами, однако, последовательно выполняя все шаги, большая часть ошибок будет обнаружена и устранена до прошивки кода программы в микроконтроллер (редактор доступен во всех режимах работы).
Демонстрационная версия VISION-2 находится на сайте www.keil.com [3] и вполне подходит для начала работы.
Итак, приступаем к рассмотрению среды разработки VISION-2 и созданию программы. После установки среда VISION-2 выглядит так, как показано на рис. 1 и первоначально включает три окна:
1. Work space — рабочее окно (правое верхнее).
2. Project Window — окно проекта (левое верхнее).
3. Output Window — окно вывода (нижнее).

 


Рис. 1
В верхней части экрана находится строка заголовка. В этой строке выводится имя проекта. Под ней расположена строка главного меню. Главное меню содержит обширный набор команд для доступа к функциям VISION-2, основные из которых рассматриваются при изучении связанных с этими командами операций.
Панели инструментов находятся под главным меню. Всего имеется три панели инструментов:
1. File Toolbar — файлов.
2. Build Toolbar — компоновки.
3. Debug Toolbar — отладки.
Две из них File Toolbar и Build Toolbar показаны на рис. 1.
Сразу следует оговориться, среда VISION-2 работает с проектами. В проект может быть включено большое количество автономных программ, связи между которыми задаёт программист особыми инструкциями ассемблера, а устанавливает программа компоновщик, входящая в среду VISION-2. В нашем случае первый проект будет состоять из одной единственной программы. Это первый шаг нашей работы по изучению среды VISION-2.
Для создания нового проекта выбираем пункт главного меню Project→New Project.… В открывшемся окне Create New Project создаем директорию Project, в строке File name вводим имя проекта Pro01 и сохраняем его в директории Project. В дальнейшем вызов созданного проекта возможен из среды VISION-2 или двойным щелчком левой кнопки мыши по этому файлу. Если Ваша будущая программа, например, является драйвером для какого-то устройства, то целесообразно именем этого устройства и назвать проект. В открывшемся окне Select Device for Target “Target1” (выбор устройства для проекта) выбираем фирму ATMEL, а в открывшемся списке микроконтроллер AT89S53. Подтверждаем выбор нажатием кнопки ОК. В ответ на вопрос “Копировать стандартный установочный код в проект и добавить файл к проекту?” отвечаем No. Необходимо пояснить, что это за файл. Среда VISION-2 позволяет программировать в совокупности с соответствующими аппаратными средствами микроконтроллеры и в этом файле содержится информация для настройки конкретного программируемого устройства. Например, для микроконтроллера P89LPC901 — это информация по установке секретных битов, заданию режимов работы внутреннего генератора, сторожевого таймера и т.п.
Для начала работы над проектом необходимо создать исходный файл. Это можно сделать через пункт главного меню File→New или щелкнув по кнопке New file (крайняя слева на панели инструментов File) рис. 2.

 


Рис. 2
В появившемся окне Text1 наберем одну строку нашей будущей программы: MOV SP,#?STACK–1 и нажмем клавишу Enter. Эта команда загрузки указателя стека, она будет присутствовать в каждом Вашем проекте.
Сохраним исходную программу через пункт главного меню File→Save as…. В открывшемся окне Save As в строке File name введем имя файла Project1.A51 и сохраним его. Мы вернулись к исходному окну, но с заданным нами именем Progect1.A51. Закроем файл Project1.A51, находящийся в рабочем окне, через пункт главного меню File→Close или щелкнем по крайней справа кнопке в строке главного меню.
Созданный нами файл необходимо ввести в проект. Это можно сделать через пункт главного меню Project→Targets, Groups, Files… или щелкнув правой кнопкой мыши в окне Project Window и выбрав Targets, Groups, Files…. В открывшемся окне Targets, Groups, Files… выбираем закладку Groups/Add Files и во внутреннем окне Available Groups щёлкаем мышкой по Source Group1 (источник группы 1) и выбираем ставшую активной кнопку Add Files to Group… (добавить файлы в группу). В открывшемся окне Add Files to Group ‘Source Group 1’ в строке Files of type выбираем All files (*.*). В директории Progect находятся три файла, в том числе и наш исходный Project1.A51. Щелчком левой кнопки мыши выбираем файл Project1.A51, его имя появляется в строке File name. Нажимаем на кнопку Add, и затем закрываем окно кнопкой Close. Окно Targets, Groups, Files закрываем нажатием на кнопку ОК.
Мы опять вернулись к исходному состоянию окна VISION-2. В окне Project Window откроем директории Target1, Source Group1 и увидим наш рабочий файл Project1.A51, включенный в проект. Дважды щелкнув по имени файла Project1.A51открываем его в рабочем окне.
Обобщим что нами сделано:
1. Создан рабочий файл Project1.A51 — в нем мы напишем нашу программу.
2. Создан проект, в котором присутствуют среди других файлов Pro01.plg, Pro01.uv2, Project.A51.
Всё выше описанное можно проделать и несколькими другими путями. Позже каждый выберет для себя оптимальный. Однако пока не осознается обязательность и смысл каждого шага, следует придерживаться этой канвы, дабы потом мучительно не соображать, почему не сохранился файл в проекте или что-то подобное.
Для дальнейшего движения вперёд перейдем ненадолго от практических упражнений в область теории, а именно, поговорим об ассемблере Keil. Этот ассемблер имеет классические черты и индивидуальные особенности.
Проверка корректности программы будет тем более полной, сколь четко и ясно формализованы все средства, обеспечивающие получение исполняемого кода (hex-файла). Для получения hex-файла в проекте необходимо выполнить следующие действия: Project Option for Target ‘Target 1’, в появившемся окне Option for Target ‘Target 1’ выбираем закладку Output и ставим галочку в строке Create HEX File (создать HEX файл). Ассемблер проверяет правильность доступа к данным и коду программ, однако для этого он должен знать, к какому типу памяти относятся операнды. При написании программы программист размещает код и данные в сегментах [4].
Сегмент это область программной памяти или памяти данных, расположенная в некотором адресном пространстве. Каждый сегмент имеет назначаемое имя и может быть общим (перемещаемым) или абсолютным (неперемещаемым). Внутри программы код и данные бывают распределены между несколькими сегментами. При компоновке программы информация, размещенная в одноименных сегментах, будет сгруппирована в один непрерывный блок.
Функциональное назначение сегмента шире, чем простое разбиение программы на блоки кода, данных и стека. Сегментация является частью более общего механизма связанного с концепцией модульного программирования. Это понятие предполагает унификацию оформления объектных моделей, создаваемых компилятором из различных языков программирования, то есть можно объединить программы, написанные на языке С и на языке ассемблера.
Теперь можно вернуться в нашу программу и добавить несколько строк:
$NOMOD51
$INCLUDE (REG52.h)
NAME PROGECT1
PROG_MIG SEGMENT CODE
?STACK SEGMENT DATA
RSEG ?STACK
DS 10H
CSEG AT 0
USING 0
JMP NACHALO
RSEG PROG_MIG
NACHALO: MOV SP,#?STACK–1
Вы видите, что строка, с которой мы начали писать нашу программу, оказалась последней, а перед ней появились еще 11 строк. Забегая вперед надо сказать, что это только часть информации, которую программист должен сообщить ассемблеру.
Теперь подробно о каждой строке:
$NOMOD 51 — отмена всех предыдущих определений, то есть, наша программа начинается с чистого листа.
$INCLUDE (REG52.h) — указание ассемблеру аппаратных средств, на которых будет реализована в итоге наша программа. В данном случае это стандартный набор регистров 8052. Если, например, программа будет выполняться на микроконтроллере P89LPC915, подключаемый файл будет уже другим, хотя они и похожи, отличия все же есть. В некоторых случаях может потребоваться указание полного пути, тогда эта строка для микроконтроллера P89LPC915 будет выглядеть так: $INCLUDE (C:\Keil\C51\INC\Philips\REG932.h).
NAME PROGECT1 — имя нашей программы, которое теперь стало известно ассемблеру.
PROG_MIG SEGMENT CODE — данная строка определяет сегмент программы с именем PROG_MIG и классом памяти CODE, сегмент расположен во внутреннем ПЗУ контроллера.
?STACK SEGMENT DATA — данная строка определяет сегмент стека с именем ?STACK и классом памяти DATA, сегмент расположен во внутреннем ОЗУ контроллера.
RSEG ?STACK — выбирает сегмент с именем ?STACK, который является перемещаемым, то есть, его конкретное место в ОЗУ определяется ассемблером и компоновщиком.
DS 10H — эта инструкция определяет размер сегмента стека равный 16 байтам.
CSEG AT 0 — данная инструкция указывает, что команда JMP NACHALO, следующая за ней, будет расположена с 00H адреса памяти программы. В памяти программ контроллера существует ряд жестко определенных адресов — это адрес старта, адреса прерываний, а также дополнительные назначаемые программистом адреса, все они определяются данной инструкцией.
USING 0 — обозначает, что в программных кодах будет использоваться нулевой банк регистров. Данная инструкция не обязательная, она установлена по умолчанию.
RSEG PROG_MIG — выбирает сегмент с именем PROG_MIG. Сегмент PROG_MIG перемещаемый, его конкретное место в памяти программ определяется ассемблером и компоновщиком.
JMP NACHALO — указывает, что следующей будет выполняться команда MOV SP,#?STACK–1, которая обозначена меткой NACHALO:.
Теперь можно продолжить написание программы. Пример взят самый простой: формируем на выходах P0.4 и P0.5 микроконтроллера AT89S53 прямоугольные импульсы, сдвинутые по фазе на 180°, с периодом равным 2 сек.
При набивке программы не следует забывать о сохранении данных, кнопка сохранения расположена на панели инструментов File рис. 2 (третья слева). Она поможет Вам избавиться от неприятностей. Там же на рис. 2 показаны кнопки: отменить ввод и отменить удаление, необходимые при редактировании текста программ.
Шрифты можно установить через пункт главного меню View→Options→Colors&Fonts. В этом окне в строке Font выбираем шрифт Courier New. Становятся доступными русские буквы.
Продолжим ввод нашей программы:

NACHALO: MOV SP,#?STACK–1
DAT1 EQU P0.5
DAT2 EQU P0.4
NACHAL1: SETB DAT2
CLR DAT1
CALL DEL1S
CLR DAT2
SETB DAT1
CALL DEL1S
JMP NACHAL1
DEL1S: CALL DEL200mS
CALL DEL200mS
CALL DEL200mS
CALL DEL200mS
CALL DEL200mS
RET
DEL200mS: CALL DEL50mS
CALL DEL50mS
CALL DEL50mS
CALL DEL50mS
RET
DEL50mS: CALL DEL10mS
CALL DEL10mS
CALL DEL10mS
CALL DEL10mS
CALL DEL10mS
RET
DEL10mS: MOV R1,#255
LREX: MOV R2,#18
LRIN: DJNZ R2,LRIN
DJNZ R1,LREX
RET
END

Несколько замечаний по программе: ассемблерные инструкции в среде Vision2 (в отличие от TASM) пишутся без точки перед ними. Все инструкции при вводе выделяются цветом, то есть, если набрана инструкция, и она не окрасилась, значит, была допущена ошибка при наборе — удобный и быстрый контроль.
Инструкция CALL заменяется ассемблером на инструкцию ACALL или LCALL автоматически.
В нижней строке среды VISION-2 рис. 1 расположена строка состояния. В ней отображаются все выполняемые нами действия.
Следующий этап работы трансляция программы.
На рис. 3 показана панель инструментов компоновки программы.

 


Рис. 3
Щелчок по левой кнопки панели осуществит компиляцию текущего файла программы. Также можно воспользоваться пунктом главного меню Project→Translate.
Для компиляции модифицированных файлов и создания проекта необходимо щелкнуть по второй слева кнопке панели инструментов компоновки рис. 3. Также можно воспользоваться пунктом главного меню Project→Build target.
Для компиляции всех файлов и создания проекта необходимо щелкнуть по третьей слева кнопке панели инструментов компоновки рис. 3. Также можно воспользоваться пунктом главного меню Project→Rebuild all target files.
Следующая кнопка останавливает трансляцию и компоновку программы.
Фактически теперь мы приступаем к отладке нашей программы. Нажатие на кнопку Build target вызовет появление сообщений в окне вывода рис.1.

Build target 'Target 1'
assembling Progect1.A51...
linking...
Program Size: data=24.0 xdata=0 code=76
"Pro01" - 0 Error(s), 0 Warning(s).

Наличие ошибок в программе вызовет появление сообщений об ошибках в окне вывода, двойной щелчок мышкой по любому из этих сообщений установит стрелку-указатель напротив строки с ошибкой в рабочем окне.
На первых порах основными ошибками будут синтаксические. Здесь потребуется внимание и терпение. Нажав на закладку Books, в окне проекта мы получим доступ к справочной информации. Двойной щелчок мышью по строке Assembler/Utilities выведет на экран PDF файл описания ассемблера. В нем можно найти информацию, которая позволит исправить ошибки. Когда все ошибки будут исправлены, сообщение в окне вывода должно соответствовать, сообщению показанному выше.
До сих пор мы работали с тремя окнами. На самом деле окон больше, однако, не все они понадобились нам на данном этапе.
Ниже приводится описание меню View и Project.
На рис. 4 показано меню View. Оно разбито на пять групп.


Рис. 4
В первой группе 4 команды:
Status Bar — показывает или скрывает строку состояния (строка в самой нижней части экрана).
File Toolbar — показывает или скрывает панель инструментов File (это вторая сверху строка на экране).
Build Toolbar — показывает или скрывает панель инструментов компоновщика (третья строка сверху).
Debug Toolbar — показывает или скрывает панель инструментов отладчика. В нашем примере она была закрыта. Тема отладчика будет раскрыта в следующей статье.
Во второй группе 3 команды. Все они продублированы кнопками на панели инструментов File.
Project Window — показывает или скрывает окно проекта (окно в левой верхней части экрана).
Output Window — показывает или скрывает окно вывода (окно в нижней части экрана).
Source Browser — окно исходного текста.
В третьей группе 9 команд, обеспечивающих отладку программы в режиме симуляции. Этот тема следующей статьи.
В четвертой группе 1 команда. Она обеспечивает обновление окна отладки во время выполнения программы.
В пятой группе 2 команды.
Work Book Mode — показывает окна в виде книжки. Этот режим целесообразно использовать при разработке проектов, состоящих из нескольких модулей, для удобства переключения между ними.
Options… — настройки цветов, шрифтов, функций редактора и т.п. С этим пунктом мы уже успели познакомиться.
Следует отметить хорошую организацию рабочего поля экрана, с одной стороны есть все необходимое, и оно под рукой, с другой стороны экран не загроможден. Все основные, наиболее употребляемые команды дублированы в виде кнопок на панели инструментов. Каждый пользователь легко может работать в своем ему привычном стиле. Программа защищена от несанкционированных действий, иными словами, если при нажатии на кнопку отсутствует реакция, значит действие выполнено не верно.
На рис. 5 показано меню Project. Оно разделено на пять групп.

 


Рис. 5
Рассмотрим отдельные команды:
New Progect… — создает новый проект.
Import VISION-2 Project… — импортирует проект из предыдущей версии.
Open Project — открывает ранее разработанный проект.
Close Project — закрывает проект.
Target, Groups, Files — включает файлы и группы файлов в проект.
Select Device for Target ‘Target 1’ — выбор устройства для проекта.
Option for Target ‘Target 1’ — изменение установок в проекте.
Clear Group and File Option — удаление файлов и групп файлов из проекта.
В четвертой группе перечисляются разработанные проекты, и обеспечивается быстрый доступ к ним.
В заключение данной статьи приводим таблицы функциональных альтернативных клавиш и клавиш редактора, использование которых создает удобство и приятное разнообразие в работе, для любителей постучать по клавиатуре.
Функциональные клавиши.
Ctrl+N — создание нового файла.
Ctrl+O — открытие существующего файла.
Ctrl+P — печать текущего документа
Ctrl+S — сохранение текущего документа.
F5 — переход к следующей точке останова.
F7 — компиляция и компоновка проекта.
Ctrl+F7 — компиляция текущего файла.
Alt+F7 — открытие окна установок проекта.
Клавиши редактора
Ctrl+A — выбор всего текста.
Ctrl+C — копировать выбранный текст в буфер обмена.
Ctrl+F — поиск текста.
Ctrl+H — замена текста.
Ctrl+V — вставить текст из буфера обмена.
Ctrl+X — вырезать текст в буфер обмена.
Ctrl+Y — поместить строку в буфер обмена
Ctrl+Z — отмена ввода.
Ctrl+[ — поиск ответной скобки.
Shift+Ctrl+Z — отмена удаления.
Ctrl+Home — перемещении курсора в начало строки.
Ctrl+End — перемещение курсора в конец файла.
Ctrl+ — перемещение курсора на одно слово влево.
Ctrl+ — перемещение курсора на слово вправо.
Ctrl+F2 — установка закладки в текущую строку.
F2 — перемещение курсора к следующей закладке.
Shift+F2 — перемещение курсора к предыдущей закладке.
F3 — поиск следующего словосочетания.
Shift+F3 — поиск предыдущего словосочетания.
Ctrl+F3 — поиск слова у курсора.
 

Авторы:
Андрей Сошкин
Андрей Мамонтов


ЛИТЕРАТУРА
1. А.В. Фрунзе. Микроконтроллеры? Это же просто! 1 том.—М.: ООО «ИД СКИМЕН», 2002.
2. Э. Кэспер. Программирование на языке Ассемблера для микроконтроллеров семейства i8051. — М.: Горячая линия — Телеком, 2004.
3. В. Юров. Ассемблер. — СПб: «Питер», 2000.
4. www.keil.com