ЛР2
.pdfОтчет по лабораторной работе № 2 по дисциплине «Технические средства автоматизации и управления»
на тему:
«Обмен данными между ЭВМ и внешними устройствами с прерыванием программы процессора»
Цель работы
Изучить методику обмена данными между оперативной памятью ЭВМ и интерфейсом внешнего устройства с прерыванием текущей программы процессора и технических средств, реализующих управление аппаратными прерываниями в автоматизированных системах на основе ЭВМ семейства IBM AT.
Задание
2. Разработайте алгоритм и программы:
a) ввода в реальном времени массива данных из модуля АЦП в ОЗУ ЭВМ с прерыванием фоновой программы от таймера L-154 (период дискретизации сигнала и канал мультиплексора указываются из табл. 2.2); б) расчета в фоновом режиме работы процессора значений функции (из таблицы 1.1 по указанию преподавателя);
в) преобразования значений кодов АЦП в значения напряжения UКВ по окончании ввода всего массива, а также определения оценок математического ожидания, дисперсии и размаха входного сигнала U;
г) вывода массива исходных данных и результатов расчета на экран терминала и сохранения их на диске.
Канал |
Период квантования сигнала, мкс |
4 |
320 |
Вид сигнала, U(i) |
Амплитуда, Umax. [В] |
Число точек на периоде, М |
|
|
|
Umaxexp(-3i/M), 0≤i≤M |
5,0 |
100 |
|
|
|
Выполнение
Uses Dos, crt, timer154; const M = 100; T=320
var U, Uvx:array[0..M] of integer; Ureal:array[0..M] of real;
OldIntB: pointer; count, i: integer; Umax,Umin,Um,Ud,dU:real; f:text;
Procedure wait(i:word); var j:word;
begin for j:=1 to i do end;
Procedure IntDAC; interrupt;
{Оперативная программа обслуживания прерываний.}
{Ключевое слово Interrupt приводит к генерации машинных команд, обеспечивающих сохранение в стеке всех регистров процессора при входе в процедуру IntDAC и извлечение их из стека перед выходом из нее}
Begin {Старт оперативной программы}
asm STI end;{Установка IF=1 в регистре флагов ЦП} Port[$302]:=$E3;
{Устанавливаем канал и режим измерения АЦП} wait(100); {Задержка на переключение} Port[$304]:=$FF; {Запуск АЦП на измерение} asm NOP end;
while (Port[$302]>=$F8) do ; {Проверка окончания измерения.} Uvx[count]:=Port[$300] {Считываем очередное значение} inc(count); {Инкремент программного счетчика} Port[$20]:=$20;{IS3=0 Сброс бита регистра ISR – OCW2}
End; {Конец оперативной программы}
Begin {Основная программа}
Port [$30F]:= 0; {Запрет генерации прерываний от платы L-154}
Port[$21]:=Port[$21] OR $8;{Запрет прерывания от входа IR3 в ПКП}
{генерация выборки}
for i:=1 to M do U[i]:=Round(2048+2000*exp(-3*i/M));
count:=1; {Текущий считываемый элемент ставим 1}
GetIntVec($B,OldIntB); SetIntVec($B,@IntDAC);
{Сохранен старый вектор прерывания от входа IR3 в переменной OldIntB. Установлен новый вектор прерывания от входа IR3 на процедуру IntADC}
Set_Time(T); {Запуск таймера}
Port[$30F]:=1; {Разрешение прерываний от таймера L154} Port[$21]:=Port[$21] AND (NOT ($8));
{Разрешены прерывания от IR3 в регистре IMR ПКП} i:=1 {Текущий выводимый элемент ставим 1}
{Фоновая программа} while count<=M do begin
PortW[$300]:= U[i]; {Запись очередного значения} inc(i);
if i>M then i:=1
end;
{Конец фоновой программы}
Port [$30F]:= 0; {Запрет генерации прерываний от платы L-154} SetIntVec($B,OldIntB); {Восстановление старого вектора прерываний от входа IR3}
{Обработка результатов}
2
{Расчет измеренных значений в вольтах}
for i:= 1 to M do Ureal[i]:=2.5*(Uvx[i]-2048)/1000;
{Расчет математического ожидания} Um:=0;
for i:= 1 to M do Um:=Um+Ureal[i]; Um=Um/M;
{Расчет дисперсии} Ud:=0;
for i:= 1 to M do Ud:= Ud + sqr(Ureal[i]-Um); Ud=Ud/M;
{Поиск минимума и максимума} Umax:= Ureal[1];
Umin:= Ureal[1];
for i:= 2 to M do begin
if Umax<Ureal[i] then Umax:= Ureal[i]; if Umin>Ureal[i] then Umin:= Ureal[i];
end;
{Расчет размаха} dU: = Umax – Umin;
{Вывод результатов в файл}
assign(f, ’c:\Results.txt’); {Объявляем файл} rewrite(f); {Создаем/перезаписываем файл} writeln(f, ’АЦП Напряжение’);
for i:= 1 to M do writeln(f, Uvx[i]:4,’ ’, Ureal[i]:6:3); {Запись в файл измеренных сигналов}
writeln(f, ’Математическое ожидание ’, Um:6:3); writeln(f, ’Дисперсия ’, Ud:6:3);
writeln(f, ’Размах ’, dU:6:3); close(f) {Закрываем файл}
End. {Конец основной программы}
Вывод
На лабораторной работе была изучена методика обмена данными между оперативной памятью ЭВМ и интерфейсом внешнего устройства с прерыванием текущей программы процессора и технических средств, реализующих управление аппаратными прерываниями в автоматизированных системах на основе ЭВМ семейства IBM AT.
3