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

Сборка Часть2 / АВМиС / Лабораторные / Лабораторная работа_Таймер2010

.doc
Скачиваний:
52
Добавлен:
15.09.2014
Размер:
75.26 Кб
Скачать

Лабораторная работа УПРАВЛЕНИЕ ТАЙМЕРОМ 1

1. Цель работы 1

2. Темы для предварительного изучения 1

3. Постановка задачи 1

4. Порядок выполнения 1

5. Индивидуальные задания 1

6. Пример решения задачи 2

Лабораторная работа УПРАВЛЕНИЕ ТАЙМЕРОМ

1. Цель работы

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

2. Темы для предварительного изучения

  • Структура и назначение портов микросхемы конфигурации и таймера.

  • Установка вектора прерываний.

3. Постановка задачи

Построить модель аналого-цифрового преобразователя (АЦП), которая работает в реальном времени. Процесс, который дискретизируется, моделируется программой (программным блоком), который выполняет циклическое вычисление функции y=F(x), где x - номер итерации. Преобразователь моделируется программой, которая выполняет с заданной частотой (в реальном времени) прерывание процесса, считывание и запоминание текущего значения функции. Запомнить не меньше 80 значений функции. Обеспечить наглядное «двигающееся» представление результатов работы "АЦП".

4. Порядок выполнения

Порядок выполнения работы и содержание отчета определены в общих указаниях.

5. Индивидуальные задания

N пп

R

y = F(x)

Частота (гц)

1

0 - 10

y=((100-x)%100)*0.5+R+100

72.7

2

0 - 10

y=((77-x)%200)*0.1+R+150

145.5

3

0 - 10

y=40*(cos(x/10)+cos(x/6))+R+100

36.4

4

0 - 2

y=50*(cos(x/10)+R*cos(x/5))+150

54.5

5

0 - 2

y=50*sin(cos(x/10)+R)+150

90.9

6

0 - 1

y=0.5*(x%100)+100*sin(x/5)*R+150

72.7

7

0 - 1

y=0.5*(x%100)+50*sin(x/50)*(R+1)+150

145.5

8

0 - 1

y=50*sin(x/(10+R))+150

36.4

9

0 - 0.2

y=50*(fabs(sin(x/10))+R)+150

54.5

10

0 - 10

y=10*-1N*(x/100)+R+150

90.9

11

0 - 10

y=-1N*50*sin(x/10)+150+R

72.7

12

0 - 10

y=0.5*-1N*(x%200)*sin(x/10)+150+R

145.5

13

0 - 10

y=0.5*-1N*(x%200)+50*sin(x/10)+150+R

36.4

14

0 - 10

y=50*(sin(x/64)+sin(x/32)+ +0.1*sin(x/4)+0.1*sin(x/2))+R+150

54.5

15

0 - 10

y=50*(sin(x/64)+sin(x/32)+ +sin(x/2))+R+150

90.9

16

0 - 10

y=0.5*(x%100+-1N*x%200)+150+R

72.7

17

0 - 10

y=0.5*(-1N*x%100+x%200)+R+150

145.5

18

0 - 0.1

y=0.5*(-1N*x%100+200*R*sin(x/10))+150

36.4

Примечание: R - случайное вещественное число из последовательности, равномерно распределенной в указанном интервале.

Для получения более наглядного представления "процесса" допускается подбирать другие коэффициенты функции. Частоту дискретизации выдерживать с точностью до 1 гц.

6. Пример решения задачи

Индивидуальное задание.

  • функция - y=50*(sin(x/10)+cos(x/8))+R+150;

  • R - в диапазоне 0 - 10;

  • частота - 36.4 Гц.

Разработка алгоритма решения

Структура программы

Программа состоит из основной программы и трех функций.

  • void *readvect(int in) - функция читает вектор прерывания с номером in и возвращает его значение.

  • void writevect (int in, void *h) - функция устанавливает новый вектор прерывания in на новый обработчик этого прерывания по адресу h.

  • void interrupt newtime() - процедура нового обработчика прерывания таймера.

Описание переменных и констант

В этой программе применяются две константы:

  • TIMEINT=8 - номер прерывания таймера;

  • NN=100 - максимальное число показаний АЦП.

Переменные, глобальные для всей программы:

  • y - массив показаний АЦП;

  • ny - текущий индекс в массиве показаний;

  • yc - текущее значение функции;

  • kf - счетчик вызовов oldtime (oldtime вызывается каждые второй раз);

  • rr и sr - переменные, которые используются для задания значений регистров общего назначения и сегментных регистров, соответственно при вызове прерывания.

Переменные главной программы:

  • oldtic - старый коэффициент деления;

  • newtic - новый коэффициент деления (применяется для увеличения частоты вызова прерываний таймера);

  • x - аргумент заданной функции F(x);

  • dd - тип графического адаптера;

  • m - режим графики;

  • errorcode - код результата инициализации графики.

Описание алгоритма программы

Программу можно назвать моделью процесса АЦП. Главная программа постоянно вычисляет значения заданной функции F(x) при переменном аргументе, что имитирует непрерывный сигнал, а обработчик прерывания 8 имитирует преобразователь с постоянным шагом дискретизации по времени. Перед началом работы канал 0 таймера программируется на частоту в 2 раза большую обычной (записью в порт 43h управляющего байта 00110110b=36h, а потом посылкой в порт 40h нового значения коэффициента деления), таким образом, "частота дискретизации" составляет около 36.4 Гц. При поступлении следующего прерывания запоминается текущее значение функции F(x), старый обработчик прерывания oldtime вызывается не при кажндом прерывании, а лишь один раз из двух (переменная kf - счетчик по модулю 2), когда oldtime не вызывается, наш обработчик сам сбрасывает контроллер прерываний посылкой значения 20h в порт 20h. После набора 100 "показаний АЦП" восстанавливается старый вектор обработчика таймера, а результат аналого-цифрового преобразование выводится на терминал в графическом режиме в виде решетчатой функции.

Функция readvect() читает вектор заданного прерывания. Для чтения вектора применяется функция 35h DOS (прерывания 21h):

Вход:

AH = 35h; AL = номер вектора прерывания.

Выход:

ES:BX = адрес программы обработки прерывания.

Функция writevect() устанавливает новый вектор прерывания по заданному адресу. Для записи вектора применяется функция 25h DOS:

Вход:

AH = 25h; AL = номер вектора прерывания; DS:BX = 4-байтный адрес нового обработчика прерывания.

Текст программы

/*----------------Лабораторная работа ------------------*/

/*-----------------"Управление таймером"------------------*/

/* Подключение стандартных заголовков */

}

7. Результаты работы программы

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