Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

Часть 3. Решение типовых задач локального управления

3.1 Формирование временной задержки с помощью цикла

3.1.1 Задание

Разработать программу, инвертирующую логический уровень на линии P0.7 через каждые 0,5 с. Задержку организовать с помощью цикла.

3.1.2 Общие рекомендации

Поставленная задача является простейшей с точки зрения программирования и в тоже время чрезвычайно распространенной. Рассматриваемое здесь решение важно для обучения программированию, но на практике применяется ограниченно из-за своих недостатков. Алгоритм программы показан на рисунке 3.1.1. Предлагается включить в программу цикл задержки, время выполнения которого примерно составляет 0,5 с. По окончании цикла выполнить команду инверсии требуемой портовой линии. Единственный аппаратный узел МК, с которым приходится взаимодействовать программе — это порт ввода-вывода.

 

Начало

 

 

1

 

 

Настройка портовых

 

 

линий P0.7P0.9

 

Да

2

Нет

k=1; k<N; k++

 

 

3

 

 

Инверсия P0.7

 

 

Рисунок 3.1.1 – Алгоритм программы формирования дискретного сигнала

3.1.3 Алгоритм программы

Перед началом работы выполнить подготовку, как это было описано в разделах 2.3.1–2.3.4.

В программе потребуется объявить одну переменную-счетчик целого типа int.

int Имя_переменной ;

1. Настройка состоит в переводе портовых линий P0.7–P0.9 в режим вывода путем записи единиц в соответствующие разряды регистра IO0DIR (см. раздел 1.10.1); а также установке низких логических уровней на тех же линиях путем записи единиц в соответствующие разряды регистра IO0CLR.

2. Команды блоков 2–3 помещаются в вечный цикл

while (1)

{

...

}

160

В начале вечного цикла организовать цикл задержки

for (k=0; k<N ; k++) ;

где N — число итераций, которое можно приближенно принять равным

100 000.

3. После цикла задержки инвертировать портовую линию с помощью команды сложения по модулю два.

IO0PIN^= Код ;

где Код содержит единственную единицу в седьмом разряде (соответственно разряду порта P0.7).

Провести компиляцию проекта (F7) исправить синтаксические ошибки, если они имеются.

3.1.4 Отладка

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

1.Перевести среду в режим отладки (Ctrl+F5). При этом работает симулятор. Запись программы в память микроконтроллера не производится.

2.Проследить за пошаговым выполнением программы (F11).

3.Установить точку останова на команду инверсии порта (двойной щелчок по серому полю слева). Открыть окно порта ввода-вывода (Periph-

erals GPIO Port 0).

4.Несколько раз запустить программу до точки останова (F5). Проследить периодическое изменение состояния портовой линии в окне.

5.Открыть окно логического анализатора (раздел 2.3.7). Получить осциллограмму сигнала лини P0.7.

6.Определить время выполнения одной итерации с помощью окна хронометража (раздел 2.3.7).

7.Вернуться в режим программирования (Ctrl+F5). Откорректировать предельное значение счетчика так, чтобы время итерации составило 0,5 с. Скомпилировать программу.

8.Вызвать свойства проекта. Выбрать в качестве инструмента внутрисхемный отладчик (раздел 2.3.3).

9.Перейти в режим отладки (Ctrl+F5). Переход будет сопровождаться загрузкой кода программы в память микроконтроллера.

10.Запустить программу нажатием кнопки F5. Убедиться в работоспособности программы.

3.1.5 Дополнительные сведения о формировании временной задержки

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

161

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

asm void Delay(int R0)

// Параметр R0 -

{

 

// число

повторов

subs R0, R0, #1

// Уменьшение счетчика на 1

bne

{PC}-4

// Повтор,

если не равен 0

bx

LR

// Возврат

из функции

}

 

 

 

Обращаем внимание на то, что в строках ассемблера необходим отступ хотя бы в один пробел.

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

while (1)

 

{

 

FIO0SET= Маска ;

// Высокий уровень

Delay( Числовая константа );

// Задержка

FIO0CLR= Маска ;

// Низкий уровень

}

 

Заметим, что здесь используется управление портом ввода-вывода через высокоскоростную шину (раздел 1.10.2).

Рисунок 3.1.2 – Осциллограмма импульсов с временной задержкой, полученной с помощью пустого цикла

Параметры импульса (период следования и длительность) могут быть рассчитаны по следующим формулам:

 

;

(3.1.1)

 

,

(3.1.2)

где

— длительность такта (по умолчанию

нс),

 

— числовая константа, передаваемая функции Delay в качестве пара-

метра;

— числа тактов, выделяемых для считывания команд из памяти,

которое по умолчанию равно 4 (о модуле ускорения памяти см. раздел 1.8).

162