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

ПСМПС (лаб)

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

131

содержимое TLx меняется с FFh на 0), происходит увеличение на 1 регистра THx. Когда происходит переполнение таймера, то в «1» устанавливается соответствующий флаг переполнения таймера TFx. Если прерывания от таймера разрешены (ETx = 1), то автоматически вызывается соответствующая подпрограмма обработки.

В третьем режиме (M1 = 1, M0 = 0) таймеры также работают одинаково. В этом режиме регистр TLx работает как 8-разрядный счетный регистр. После переполнения он автоматически перезагружается значением из регистра THx, которыйприэтомсвоегозапрограммированногозначениянетеряет.

2.3. Отладочные функции среды µVision2

Мощным аспектом среды µVision2 является использование отладочных функций (debug functions). Эти функции также как и подключаемые модули позволяют существенно расширить возможности отладчика среды разработки. С помощью отладочных функций можно генерировать внешние прерывания, сохранять дамп памяти микроконтроллера в файле, периодически обновлять сигналы на цифровых и аналоговых входах микроконтроллера, а также последовательно подавать данные на вход асинхронного приемопередатчика.

Для создания отладочных функций используется подмножество языка Си. Это подмножество языка Си обладает следующими особенностями:

в отладочных функциях может использоваться полный набор опера-

торов управления ходом программы: IF, ELSE, WHILE, DO, SWITCH, CASE, BREAK, CONTINUE и GOTO;

в отладочных функциях можно объявлять только локальные скалярные переменные, областью видимости которых является сама функция, аналогично тому, как это определено в стандарте ANSI C.

Среда µVision2 содержит встроенный редактор отладочных функций, который открывается с помощью команды главного меню Debug (Debug | Function Editor). При запуске редактора запрашивается имя нового или существующего файла, в котором будут размещаться отладочные функции проекта. Если в опциях проекта, которые можно настроить с помощью команды меню Project (Project | Option For Target), в поле Initialization File указано имя существующего файла с отладочными функциями, то при запуске редактора функций открывается именно этот файл.

Редактор дает возможность ввести текст функций, скомпилировать их, отслеживать ошибки компиляции, открывать и сохранять файлы с отладочными функциями (рис. 7.2).

132

Рис. 7.2. Редактор отладочных функций

Среда µVision2 поддерживает следующие три класса функций: предопределенные, пользовательские и сигнальные.

Предопределенные функции (predefined functions) выполняют полезные задачи, такие, как ожидание периода времени, вывод сообщений, заполнение ячеек памяти, запрос ввода значений от пользователя. Предопределенные функции не могут быть удалены или переопределены. Набор предопределенных функций может рассматриваться как библиотека времени исполнения для языка отладочных функций. Функции пользователя (user functions) создаются пользователем для расширения возможностей отладчика на основе вызовов предопределенных функций, использования операторов языка Си и манипуляции объектами микроконтроллера (регистры и флаги). Сигнальные функции (signal functions) являются особым видом пользовательских функций, которые моделируют поведение сложных генераторов сигналов и позволяют симулировать различные входные сигналы от внешних устройств. Сигнальные функции выполняются в фоновом режиме во время исполнения отлаживаемой программы. Выполнение сигнальных функций синхронизировано со счетчиком тактов процессора, который имеет разрешение, эквивалентное длительности одной инструкции. При отладке проекта одновременно может быть запущено не более 64 сигнальных функций.

Как только исходный текст функций будет задан в редакторе, а затем скомпилирован, их идентификаторы (имена) заносятся во внутреннюю таблицу доступных для использования пользовательских или сигнальных функ-

133

ций. Для вывода в командное окно списка всех доступных отладочных функций можно воспользоваться командой DIR FUNC. Команда DIR SIGNAL показывает имена всех сигнальных функций (рис. 7.3).

Рис. 7.3. Список отладочных функций среды µVision2

Предопределенные отладочные функции можно разделить на несколько типов: функции запроса у пользователя ввода некоторых значений, функции вывода данных в окно вывода, математические функции, функции приостановки выполнения сигнальных функций, а также многочисленные функции чтения и записи различных типов данных. Полный перечень и описание предопределенных отладочных функций можно найти в документе Keil Software µVision2:Getting Started в главе Chapter 6 – Debug Function.

Пользовательские функции начинаются с ключевого слова FUNC и определяются следующим образом:

FUNC <return_type> <funcname> ([<paramlist>])

{

<statements>; return <value>;

}

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

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

134

FUNC void MyRegs(void)

{

printf(“----------

MyRegs---------

\n”);

printf(“R0 R1

R2

R3\n”);

 

printf(“ %04x

%04x

%04x

%04x \n”, R0, R1, R2,

R3);

 

 

 

printf(“------------------------

 

 

\n”);

{

Для вызова этой функции необходимо набрать в командном окне следующее:

MyRegs()

Следующей командой можно также определить кнопку на панели инструментов (рис. 7.4), которая позволит вызывать пользовательскую функцию:

DEFINE BUTTON “Мои регистры”, “MyRegs()”

Рис. 7.4. Палитра инструментов с командной кнопкой вызова отладочной функции

Сигнальные функции выполняются в фоновом режиме, в то время как отладчик µVision2 моделирует поведение программы. Поэтому сигнальные функции должны в некоторый момент времени вызывать функцию TWATCH (SWATCH, RWATCH, WWATCH), чтобы сделать паузу и позволить отладчику µVision2 выполнять программу. Функции TWATCH и SWATCH задают интервал задержки отладочной функции в виде определенного числа тактов процессора или секундах соответственно, тогда как RWATCH и WWATCH останавливают выполнение функции до тех пор, пока не будет прочитано или записано значение определенной ячейки памяти. Отладчик сообщает об ошибке, если сигнальная функция никогда не вызывает соответствующей функции.

135

Сигнальные функции начинаются с ключевого слова SIGNAL и определяются следующим образом:

SIGNAL void <funcname> ([<paramlist>])

{

<statements>;

}

Сигнальные функции имеют следующие ограничения:

типом возвращаемого значения сигнальной функции должен быть

void;

сигнальная функция может иметь не более 8 параметров;

сигнальная функция не может вызывать другую сигнальную функ-

цию.

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

SIGNAL void StuffS0in (void)

{

while (1)

{

S0IN = ‘A’; twatch (1000000);

}

}

После запуска сигнальная функция StuffS0in помещает символ ‘A’ во входной буфер последовательного порта и ждидает 1000000 тактов процессора, затем повторяет все сначала.

Для управления выполнением сигнальных функций отладчик µVision2 имеет очередь активных сигнальных функций. Сигнальная функция может находиться в одном из двух состояний – в режиме простоя или режиме выполнения. Сигнальная функция, находящаяся в режиме простоя – это функция, выполнение которой приостановлено, пока она ожидает истечения интервала, заданного при вызове функции типа TWATCH. Сигнальная функция, находящаяся в режиме выполнения, выполняет операторы, заданные в ее теле. Когда сигнальная функция вызывает функцию типа TWATCH, то она переходит в режим простоя на количество тактов процессора (или время), за-

136

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

Когда вызывается сигнальная функция, отладчик µVision2 добавляет ее в очередь и помечает как функцию в режиме выполнения. Сигнальная функция может быть активизирована один раз. Для просмотра состояния активных сигнальных функций можно воспользоваться командой SIGNAL STATE. Для удаления активной сигнальной функции из очереди существует инструкций командной строки SIGNAL KILL.

Следующий пример демонстрирует сигнальную функцию, которая изменяет сигнал на аналоговом входе процессора со встроенным АЦП. Эта функция увеличивает и уменьшает входное напряжение на 0.1 В от 0 до верхнего порога, который задается параметром при вызове сигнальной функции. Сигнальная функция повторяет свою работу в бесконечном цикле, делая задержку на 200 000 тактов после каждого шага по напряжению.

SIGNAL void analog0 (float limit)

{

float volts;

printf(“Analog0 (%f) entered.\n", limit);

while (1)

{

volts = 0;

while (volts <= limit)

{

ain0 = volts; twatch (200000); volts += 0.1;

}

volts = limit; while (volts >= 0)

{

ain0 = volts; twatch (200000); volts -= 0.1;

}

}

137

}

Сигнальная функция analog0 может быть запущена следующим обра-

зом:

>alalog0(5.0)

Команда SIGNAL STATE показывает текущее состояние функции

1 idle

Signal = alalog0 (line 8)

µVision2 показывает внутренний номер функции, статус сигнальной функции: простой или выполнение (idle или running) и номер строки, которая выполняется в данный момент.

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

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

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

иособенности пошаговой отладки в среде µVision2.

1.Создадим проект и введем в файл проекта следующий исходный код программы:

mcode SEGMENT CODE stack SEGMENT IDATA mdata SEGMENT DATA CSEG AT 0

USING 0

ORG 000h ljmp start ORG 0003h ljmp int0serv

RSEG mcode

start:

 

138

mov SP, #stack - 1

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

mov R0, #table

; начальный адрес таблицы

setb EX0

; разрешение от INT0 по уровню

setb EA

; глобальное разрешение прерываний

forever:

 

sjmp forever

 

int0serv:

 

clr IE0

; сброс флага прерывания

mov A, P2

; перенос в А значения из Р2

mov @R0, A

; запись в элемент таблицы в памяти

inc R0

; встаем на следующий элемент

reti

; возврат из прерывания

; сегмент данных

 

RSEG mdata

 

table: DS 10

 

RSEG stack

 

DS 10h

 

END

 

2. Перейдем в режим отладки. Откроем редактор отладочных функций (Debug | Function Editor ) и введем текст следующей сигнальной функции:

signal void leotest()

{

//пишем случайное значение в порт Р2

//используем предыдущее значение Р2 для инициации

//функции случайных чисел rand

port2 = rand(port2);

//устанавливает линию INT0 port3 |= 0x04;

//выдерживаем 30 тактов twatch (30);

//сбрасываем линию INT0 port3 &= ~0x04;

//вновь выдерживаем 30 тактов

139

twatch (30);

}

Используя команду Save файл с отладочной сигнальной функцией в каталоге проекта и выйдем из режима отладки.

Откроем диалог опций проекта (Project | Option for Target) и перейдем в закладку Debug, а поле Initialization File выберем имя ранее сохраненного файла с отладочными функциями проекта. Это позволит загружать пользовательские отладочные функции автоматически при переключении в режим отладки проекта.

3. Вновь перейдем в режим отладки (Debug | Start/Stop debug session) и в строке ввода командного окна введем команду для определения кнопки, с которой ассоциирована ранее созданная сигнальная функция:

DEFINE BUTTON "INT0", "leotest()"

Закончим ввод команды нажатием клавиши Enter. Затем выберем команду главного меню View (View | Toolbox), при этом на экране отобразится панель инструментов с заданной кнопкой.

4. С помощью команды главного меню View (View | Memory Window) откроем окно просмотра памяти. Далее откроем окна просмотра портов P2 и P3 (Peripherals | I/O-Ports) и начнем пошаговую отладку проекта. После прохождения подпрограммы инициализации, когда курсор отладчика попадет в область фоновых задач, нажмем кнопку INT0 в палитре инструментов

ToolBox.

После нажатия переключимся в редактор кода и продолжим пошаговую отладку (F10). Через 30 циклов после нажатия активизации сигнальной функции должен произойти переход в векторную таблицу программы и передача управления на обработчик внешнего прерывания INT0 – подпрограмму int0serv. При этом в окне наблюдения за памятью по адресу D:0x08 должно появится случайное значение, считанное из порта Р2 (рис. 7.5)

После окончания работы обработчика и выхода в область фоновых задач необходимо отсчитать еще не менее 30 машинных тактов и повторить вызов сигнальной функции и все остальные действия, при этом по адресу D:0x09 запишется очередное случайное значение. Для наблюдения за машинными циклами удобно воспользоваться закладкой Regs менеджера проектов (значение states).

140

Рис. 7.5. Главное окно среды µVision2 при отладке проекта

3.2. Использование таймера-счетчика T/C0 для отсчета временных интервалов

Следующий проект демонстрирует основные моменты инициализации и использования таймеров/счетчиков для формирования временных интервалов. Данная управляющая программа реализует переключение уровней на выводе P2.1 микроконтроллера. Время удержания низкого и высокого логического уровней определяется настройками таймера счетчика. В данном примере время импульса в два раза выше, чем время между импульсами.

1. Создадим новый проект и введем следующий исходный код:

main SEGMENT CODE stack SEGMENT IDATA