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

ПСМПС (лаб)

.pdf
Скачиваний:
20
Добавлен:
10.06.2015
Размер:
1.42 Mб
Скачать

111

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

Рис. 6.10. Окно Watch Window

Закладка Locals позволяет просматривать все переменные текущей исполняемой подпрограммы. Закладки Watch отображают значения переменных, которые добавляются на контроль пользователями. Идентификаторы переменных и регистров могут быть добавлены в окно Watch вручную или автоматически из редактора кода с помощью команды контекстного меню (Add to Watch Window). Для удаления переменных используется клавиша Delete или одноименная команда контекстного меню окна Watch Window.

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

Рис. 6.11. Закладка Regs менеджера проектов

112

Необходимым средством любого отладчика, в том числе отладчика среды µVision2 является инструмент наблюдения за содержимым памяти, который реализован в виде окна просмотра содержимого ячеек памяти (Memory Window). Окно памяти (команда View | Memory Window …) отображает содержимое различных областей памяти программ, данных или локального стека приложения. Окно имеет четыре закладки для независимого одновременного просмотра различных областей памяти (рис. 6.12.)

Рис. 6.12. Окно просмотра памяти

При тестировании и отладке любого проекта также крайне необходимым является наблюдение за состоянием регистров специальных функций, которые ассоциированы с периферийными устройствами, такими как, порты ввода/вывода, универсальный асинхронный приемопередатчик (последовательный порт), таймеры и подсистема прерываний. Среда µVision2 располагает простыми и наглядными средствами просмотра регистров специальных функций периферийных устройств, которые доступны в режиме отладки программы в виде команд меню Peripherals.

Для наблюдения за параллельными портами в/в используются диалоговые окна Parallel Port доступные с помощью команд главного меню Peripherals (Peripherals | I/O-Port | Port xxx) (рис. 6.13), где ххх – номер порта.

Рис. 6.13. Диалоговое окно наблюдения за параллельным портом

113

Каждый «флажок» в этом окне ассоциирован с физической линией порта (Pins) или битом регистра-защелки (Рххх). Сбрасывая и устанавливая соответствующие «флажки» можно эмулировать простые изменения сигналов внешних устройств. Изменения состояния выводов портов со стороны самого микроконтроллера также отображаются в ходе исполнения отлаживаемой программы.

При программировании таймеров/счетчиков имеется возможность отслеживать состояние управляющих регистров и флагов таймера/счетчика, а а также наблюдать за текущим значением счетчика устройства. Эти функции доступны из диалогового окна Timer/Counter (Рис. 6.14.) которое вызывается с помощью команды меню (Peripherals | Timer | Timer xxx), ххх – номер таймера/счетчика.

Рис. 6.14. Диалоговое окно наблюдения за таймером/счетчиком

Здесь отображается текущие режимы таймера, которые могут быть изменены в ходе отладки, а также содержимое регистров TCON, TMOD THxxx:TLxxx, а также флаги TFххх, TRххх, GATE и INTxxx.

Для управления подсистемой прерываний и последовательным каналом также имеются диалоговые окна Interrupt System и Serial Channel, которые также позволяют просматривать и изменять состояние этих периферийных устройств.

Кроме симуляции внутренней периферии среда Keil µVision2 позволяет симулировать работу внешних по отношению к микроконтроллеру устройств, таких как светодиоды, семисегментные индикаторы, ЖКИ-модули, ЦАП и АЦП и т.п. Дополнительные инструменты симуляции устройств должны быть реализованы в виде специальной динамически загружаемой

114

библиотеки – подключаемого модуля (Plug-In module), который интегрируется со средой разработки µVision2. Такие подключаемые модули позволяют имитировать все тонкости работы внешнего устройства, что делает их весьма мощными инструментом отладки.

В настоящее время широко известен набор простых некоммерческих подключаемых модулей для среды Keil µVision2, которые разработаны Михаэлем Бальдшвайлером (Германия). Данные модули предназначены для симуляции светодиодных и ЖК-индикаторов, а также модули, представляющие собой виртуальные приборы: генератор внешних сигналов и многоканальный осциллограф.

2.3. Макрокоманды ассемблера A251/51

Макрокомандой или макросом является символическое имя, которое назначается одной или более ассемблерным инструкциям. Ассемблер A251/51 имеет возможность определять и использовать макрокоманды. При определении макрокоманды необходимо задать текст, который будет ассоциирован с именем макроса. Для включения этого текста макроса в исходный текст программы необходимо указать имя макроса, т.е. выполнить макроподстановку. Ассемблер автоматически замещает имя макроса на его тело перед компиляцией программы.

Использование макрокоманд дает следующие преимущества при написании программ:

использование макросов может сократить количество ошибок при программировании, поскольку один макрос используется неоднократно и ошибки в его коде, как правило, уже локализованы;

пространство имен, используемое макросом, ограничено самим макросом, поэтому в теле макрокоманды могут повторяться ранее использованные имена основной программы;

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

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

115

Для поддержки макросов в ассемблере А251/51 имеется несколько специальных директив.

Для определения макроса используются две директивы, MACRO и ENDM, задающие начало и конец макроса соответственно. Шаблон определения макрокоманды выглядит следующим образом:

<name> MACRO [<para1>, <param2>, … <paramN>] ; тело макроса

ENDM

Например:

mymacro MACRO P mov A, #P mov r0, A

ENDM

При построении эффективных макрокоманд используется директива REPT, которая позволяет повторить некоторое заданное количество раз код, заключенный в этой директиве. Например:

WAIT MACRO X

; макроопределение

REPT X

; генерировать Х раз инструкций NOP

nop

 

 

 

ENDM

;

конец

REPT

ENDM

;

конец

MACRO

Для проверки и сравнения передаваемых в макрос параметров может быть использован а директива IF… ENDIF:

WAIT MACRO X

; макроопределение

IF NUL X

; проверяем на наличие параметра

EXITM

; если нет – выход из макроса

ENDIF

 

REPT X

; генерировать Х раз инструкций NOP

NOP

 

ENDM

; конец REPT

ENDM

; конец MACRO

116

Для объявления локальных меток адресов в макросах используется директива LOCAL, которая описывает имена локальных меток:

CLRMEM MACRO ADDR, LEN

LOCAL LOOP mov R7, #LEN mov R0, #ADDR mov A, #0

LOOP: mov @R0, A inc R0

djnz R7, LOOP

ENDM

Весьма гибкой и полезной является директива IRP, которая позволяет повторить блок для каждого отдельного аргумента, переданного в эту директиву. Например:

CLRREGS MACRO

; макроопределение

IRP RNUM, <R0, R1, R2, R3, R4, R5, R6, R7>

mov RNUM, #0

 

 

ENDM

;

конец IRP

ENDM

;

конец MACRO

Результатом работы такого макроса будет следующий код:

mov R0, #0 mov R1, #0 mov R2, #0 mov R3, #0 mov R4, #0 mov R5, #0 mov R6, #0 mov R7, #0

Макрокоманды также допускают вложенные определения макрокоманд. Вызов макроса выполняется простым упоминанием имени ранее определенного макроса в тексте программы так, как если бы это была инструкция.

117

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

3.1.Управление линейкой светодиодов

Рассмотрим простой пример управления светодиодами, подключенными к порту Р2 микроконтроллера, как это показано на рис. 6.2а. Реализуем программу, которая последовательно, один за другим, зажигает и с течением времени гасит светодиоды.

1. Для создания нового проекта необходимо выполнить действия, аналогичные тем, что были описаны в лабораторной работе № 5. При выборе модели микроконтроллера, можно указать любой из семейства MCS-51 c достаточным числом линий ввода/вывода, например Intel 8051АН или Atmel AT89C51.

Исходный текст управляющей программы приведен ниже:

; присваиваем символьные имена рабочим линиям порта P2 LED0 BIT P2.0

LED1 BIT P2.1

LED2 BIT P2.2

LED3 BIT P2.3 LEDPORT EQU P2

; объявляем сегменты main SEGMENT CODE var SEGMENT DATA stack SEGMENT IDATA

CSEG AT 0 USING 0 ORG 0 jmp RESET

;-----------------------------------------------------------

;СЕГМЕНТ КОДА

RSEG main

;ИНИЦИАЛИЗАЦИЯ КОНТРОЛЛЕРА

RESET:

;инициализация стека

118

mov SP, #stack - 1 ; гасим светодиоды mov LEDPORT, #00h mov LEDPORT, #0FFh

; ОБЛАСТЬ ФОНОВЫХ ЗАДАЧ

forever:

 

call RunLights

; бесконечный "бегущий огонь"

sjmp forever

 

; ПОСЛЕДОВАТЕЛЬНОЕ ЗАЖИГАНИЕ и ГАШЕНИЕ СВЕТОДИОДОВ

RunLights:

 

clr LED0

; зажигаем светодиод

mov delay, #100

; устанавливаем задержку

call wait

; задержка в виде вложенных циклов

setb LED0

; гасим светодиод

clr LED1 ; аналогичные действия с другими линиями mov delay, #100

call wait setb LED1

clr LED2

mov delay, #100 call wait

setb LED2

clr LED3

mov delay, #100 call wait

setb LED3 ret

; ПРОГРАММНАЯ ЗАДЕРЖКА wait:

ww2:

mov R7, delay ww1: djnz R7, ww1

djnz delay, ww2

119

ret

;-----------------------------------------------------------

;СЕГМЕНТ ДАННЫХ

RSEG var

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

;(хранит значение счетчика циклов задержки)

delay: DS 1

;-----------------------------------------------------------

; СЕГМЕНТ СТЕКА

RSEG stack DS 10h

END

2.При пошаговой отладке программы можно видеть сброс и установку соответствующих линий порта Р2, к которым должны быть подключены светодиоды. Для удобства необходимо использовать команду пошагового исполнения с заходом в подпрограмму (Debug | Step) или клавишу F11. Для отладки в пошаговом режиме лучше уменьшить до минимума задаваемую в программе задержку между зажиганием и гашением светодиода. Наблюдать за работой алгоритма программы можно также при непрерывном пошаговом выполнении, которое начинается после команды (Debug | Go) . В последнем случае величину задержки можно оставить такую же, как в исходном варианте программы.

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

Если данный модуль правильно присоединен к среде Keil µVision2, то в режиме отладке доступна команда (Debug | Led). Активизация данной команды позволяет отобразить окно LED Menu. Для добавления в это окно светодиодов необходимо воспользоваться командой контекстного меню (Add LED), которая отображает другое диалоговое окно LED Setup (рис. 6.15). Основным назначением этого диалогового окна является возможность ассоции-

120

ровать светодиод или сегмент светодиодного индикатора с выводом порта ввода/вывода.

Рис. 6.15. Диалог LED Setup модуля Led Debug Module

Для наглядной отладки данного проекта необходимо добавит четыре светодиода в окно LED Menu и ассоциировать их с линиями порта Р2, указав в строке редактирования окна LED Setup для каждого светодиода номер линии порта, в следующем виде: P2^ххх, где ххх – номер линии . При пошаговой отладке можно наблюдать зажигание и гашение соответствующих светодиодов (рис. 6.16).

Рис. 6.16. Использование LED модуля для отладки приложения