Этим Вы окажете большую помощь науке и медицине. См. подробнее: http://solidstate.karelia.ru/~yura/pyldin/yura/computing.htm |
Курсовая работа 2 курса.
Подключение измерительного прибора к компьютеру.
Темой и целью курсовой работы, начатой на 2 курсе, было подключение измерительного прибора к компьютеру через КОП (канал общего пользования) и написание программы, считывающей показания прибора на компьютер.
Сначала планировалось продолжить работу на 3 курсе, совершенствовать программу, написать отчёт и т.д. К концу учебного года (8 мая 1997 г.) была сделана работающая версия программы (PRB4.PAS), которая читает показания прибора и выводит их на экран компьютера. Однако на 3 курсе, в октябре 1997 года, в связи с необходимостью развития на факультете информационных технологий и дистанционного обучения, работа над этой программой дальше не продолжилась (научный руководитель дал новую тему курсовой работы). Отчёт так и не был написан. Осталось лишь несколько справочных таблиц из руководства к универсальному измерительному прибору.
Заключительная версия программы PRB4.PAS от 8 мая 1997 года находится в архиве examples.zip.
Для компиляции программы использовался Turbo Pascal 6.0. Измерительный прибор подключался к компьютеру 8086, с частотой процессора 4,77 MHz. Есть фотография этого компьютера и измерительного прибора - см. картинку computer.jpg.
Далее приведены справочные таблицы из руководства к универсальному измерительному прибору:
Таблица 10
| Дистанционное сообщение | Сигнал УП | Шестнадцатеричный код | Примечания |
| Команда НПМ | Да | 3F | Снятие предыдущей адресации |
| Адрес МАП | Да | От 20 до 3F | Адресация прибора на приём |
| БТД | Нет | 46 | Режим fA |
| БТД | Нет | 41 | Режим |
| БТД | Нет | 33 | Время счёта 103 |
| ПС | Нет | 0A | Ограничитель БТД |
| Команда НПМ | Да | 3F | Снятие адресации |
Примечание к таблице 10:
В этой таблице рассмотрен пример. Эта последовательность команд, приведённая в таблице 10, - пример, если необходимо включить прибор в режим измерения частоты по каналу А со временем счёта 103 мкс синхронно с другими устройствами.
Таблица 11
Вид | Формат сообщения в символах по ГОСТ 13052-74 | |||||||||||
| ЗД | ТД | ОД | ||||||||||
| Вид информации | Пробел | Единицы измерения | Пробел | Знак числа | Ноль | Точка | Цифры | Символ порядка | Знак порядка | Величина порядка | Ограничитель | |
| Безразмерная величина | + | 0 | . | 0 1 2 | E | + - | 0 0 1 2 | ПС | ||||
| Частота | F | _ | GHZ MHZ KHZ HZ | _ | - | 3 4 5 | 1 3 4 5 | |||||
| Интервал времени | T | NS MKS MS S | 6 7 8 9 | 6 7 8 9 | ||||||||
Примечания к таблице 11:
Таблица 12
| Номер бита | ЛД7 | ЛД6 | ЛД5 | ЛД4 | ЛД3 | ЛД2 | ЛД1 | ЛД0 |
| Назначение | x | Сообщение ОБЗ | x | x | Отмена адресации | x | Ошибка программирования | x |
Примечание к таблице 12: x - бит не используется.
Немного далее будет приведён полный листинг заключительной версии программы PRB4.PAS от 8 мая 1997 года, а ниже - краткое описание констант, переменных, функций и процедур в этой программе:
Описание констант в программе | ||
| Константа в программе | Значение в двоичном коде | Назначение |
| UP = 1 | 0000 0001 | Интерфейсная команда (прогр. КОП). (1 - команда, 0 - данные). |
| ZO = 2 | 0000 0010 | Запрос на обслуживание |
| OI = 4 | 0000 0100 | Очистить интерфейс |
| DP = 8 | 0000 1000 | Данные приняты (0 - да, 1 - нет). |
| GP = 16 | 0001 0000 | Готов ли прибор к приёму (1 - готов, 0 - не готов). |
| SD = 32 | 0010 0000 | Синхронизация данных |
| KP = 64 | 0100 0000 | Конец передачи |
| DU = 128 | 1000 0000 | Если равен 1, то блокирует ручное управление |
port[$3E0] - шина данных.
port[$3E2] - управление.
Назначение процедур и функций в программе:
KINI - инициализация КОП'а.
P_and - отключить биты.
P_or - включить биты.
WR - передача данных/интерфейса.
RD - читает.
MAP - вызывает прибор для приёма.
MAI - ждёт данных от прибора.
NPM - не принимать.
NPR - не передавай.
P_BIT - проверка, установлен ли бит.
Полный листинг программы PRB4.PAS от 8 мая 1997 года (см. архив examples.zip):
program prb_x;
uses crt;
const UP=1; ZO=2; OI=4; DP=8; { УП, ЗО, ОИ, ДП }
GP=16; SD=32; KP=64; DU=128; { ГП, СД, КП, ДУ }
Cnizm=200; Cmax=55.0; Cmin=0.01;
var
x,z,y,Vg,Vbeg,Vend,Vstep,Vbuff : real;
Ntes,RelMas : word;
i2,zx,c,i,j,Nizm,Buff : integer;
Quest : char;
Vflag : boolean;
comstr,s,s2 : string[100];
a : array [1..255] of byte;
Tes : array [0..1,0..16] of byte;
TesCod : array [0..2,0..1] of byte;
TesVolt : array [0..2] of real;
Bit : array [1..16] of word;
Xizm,Yizm : array [1..200] of real;
procedure kini; { Инициализация }
begin
port[$3E2]:=0; port[$3E2]:=OI; port[$3E2]:=DU
end;
procedure p_and(nport,maska : byte); { снять бит(ы) }
begin
case Nport of
0: port[$3E0]:=port[$3E0] and ( 255 - maska ); { шина данных }
2: port[$3E2]:=port[$3E2] and ( 255 - maska ); { упpавление }
end;
end;
procedure P_or( Nport, maska : byte); { установить бит(ы) }
begin
case Nport of
0: port[$3E0]:=port[$3E0] or maska; { шина данных }
2: port[$3E2]:=port[$3E2] or maska; { упpавление }
end;
end;
Procedure WR(S : byte);
Begin
port[$3E2]:=port[$3E2] and 129;
delay(500);
{ While (port[$3E2] and GP) = GP do ;
begin
write('ПРИБОР НЕ ГОТОВ К ПРИЕМУ'#13); delay(10)
end;
writeln(' '); }
While (port[$3E2] and DP) = 0 do ;
port[$3E0]:=S;
port[$3E2]:=(port[$3E2] and 129) + SD;
While (port[$3E2] and GP) = 0 do ;
While (port[$3E2] and DP) = DP do ;
port[$3E2]:=(port[$3E2] and 129);
end;
Procedure WR2(S : byte);
Begin
port[$3E2]:=port[$3E2] and 129;
While (port[$3E2] and GP) = GP do write('GP') ;
While (port[$3E2] and DP) = 0 do ;
port[$3E0]:=S;
port[$3E2]:=(port[$3E2] and 129) + SD;
delay(200);
While (port[$3E2] and GP) = 0 do ;
While (port[$3E2] and DP) = DP do ;
port[$3E2]:=(port[$3E2] and 129);
end;
Procedure WR1(S : byte);
Begin
While (port[$3E2] and GP) = GP do ;
While (port[$3E2] and DP) = 0 do ;
port[$3E0]:=S; Delay(30);
port[$3E2]:=(port[$3E2] and 129) + SD;
While (port[$3E2] and DP) = DP do ; Delay(30);
port[$3E2]:=(port[$3E2] and 129);
end;
Function RD : byte;
Begin
{ port[$3E2]:=DU+DP+GP; }
port[$3E2]:=DU+DP;
delay(500);
{ While (port[$3E2] and SD) = 0 do ; }
RD:=port[$3E0];
port[$3E0]:=0; delay(10);
port[$3E2]:=(port[$3E2] and 129)+DP+GP; delay(1);
port[$3E2]:=(port[$3E2] and (129+GP)); delay(1);
while (port[$3e2] and sd) = sd do ;
port[$3E2]:=(port[$3E2] and 129)+GP+DP;
port[$3E2]:=(port[$3E2] and (129+DP));
end;
Function RD1 : byte;
Begin
port[$3E2]:=152; port[$3E2]:=136;
delay(10);
While (port[$3E2] and SD) = 0 do ;
RD1:=port[$3E0];
port[$3E0]:=0;
port[$3E2]:=(port[$3E2] and 129)+DP+GP;
port[$3E2]:=(port[$3E2] and (129+GP));
While (port[$3E2] and SD) = SD do ;
{ port[$3E2]:=(port[$3E2] and 129)+GP+DP;
port[$3E2]:=(port[$3E2] and (129+DP)); }
end;
Procedure MAP(adres : byte);
Begin P_or(2,UP); WR(32+adres); P_and(2,UP); end;
Procedure MAP1(adres : byte);
Begin P_or(2,UP); WR(32+adres); P_and(2,UP); end;
Procedure MAI(adres : byte);
Begin P_or(2,UP); WR(64+adres); P_and(2,UP); end;
Procedure COM1;
var ii : integer;
Begin For ii:=1 To Ord(ComStr[0]) Do WR1(ord(ComStr[ii])) end;
Procedure COM;
var ii : integer;
Begin For ii:=1 To Ord(ComStr[0]) Do WR(ord(ComStr[ii])) end;
Procedure NPM;
Begin P_or(2,UP); WR(63); P_and(2,UP); end;
Procedure NPM1;
Begin P_or(2,UP); WR(63); P_and(2,UP); end;
Procedure NPR;
Begin P_or(2,UP); WR(95); P_and(2,UP); end;
Function P_bit( Nport , maska : byte) : boolean; { установлен ли бит ? }
{ Nport=0 - шина данных, Nport=2 - упpавление }
Begin P_bit:=(port[$3E0+Nport] and maska ) <> 0; End;
Function R742 : real;
Var x : real;
c : integer;
Begin
Vflag:=True;
S:='';
S:=chr(rd and 63);
For c:=1 to 10 do s:=s+chr(RD);
c:=rd;
val (s,x,c); if c<>0 then begin Write(s,' '); Vflag:=False; End;
R742:=x;
end;
Function Rv743 : real;
Var x : real;
c : integer;
Begin
c:=rd1 and 47;
if c > 43 Then s:='-' else s:='+';
For c:=1 to 9 do s:=s+chr(RD1);
c:=rd1;
val (s,x,c); if c<>0 then writeln ('R743-error ',c,' ',s);
Rv743:=x;
end;
{ --------------------------------------------------- }
procedure decode;
label 1,2;
var ip:byte;
begin
dec(a[i]);
if comstr[1]='T' then goto 1;
{ case a[3] of
71: a[3]:=77;
77: a[3]:=75;
79: a[3]:=32
end;
a[4]:=a[4]-5; a[5]:=a[5]-5; } goto 2;
1: { if (a[3]=ord('M')) and (a[4]=ord('O'))
and (a[5]=ord('W')) then
begin
for ip:=5 to 250 do a[ip-1]:=a[ip];
a[3]:=ord('N'); a[4]:=ord('S'); goto 2
end;
if (a[3]=ord('M')) and (a[4]=ord('W')) then
begin
for ip:=250 downto 5 do a[ip+1]:=a[ip];
a[3]:=ord('M'); a[4]:=ord('K');
a[5]:=ord('S'); goto 2
end;
if a[3]=ord('W') then
begin
for ip:=250 downto 4 do a[ip+1]:=a[ip];
a[3]:=ord('M'); a[4]:=ord('S'); goto 2
end; }
{ for i:=3 to 5 do if
if (a[3]=87) and (a[4]=27) and (a[5]=37) then
begin
a[3]:=ord('S'); a[4]:=32; a[5]:=32
end;
if (a[3]=75) and (a[4]=74) and (a[5]=82) then
begin
a[3]:=ord('S'); a[4]:=32; a[5]:=32
end;
if (a[3]=87) and (a[4]=27) and (a[5]=37) then
begin
a[3]:=ord('S'); a[4]:=32; a[5]:=32
end; }
2: end;
{ --------------------------------------------------- }
begin
clrscr; writeln('*************************************':55);
kini; { инициализация адаптера КОП }
map(5); comstr:='FA1X'#10;
com; npm; writeln;
for i:=1 to 1 do
begin
mai(5); zx:=0;
repeat
j:=rd1;
if j>100 then j:=j-31-86+48;
inc(zx); a[zx]:=j;
{ writeln(chr(j),' ',j);
write(port[$3e2] and kp);
Quest:=Chr(Rd1);
Delay(700);
S:=S+Quest; }
until (port[$3e2] and kp) = kp;
decode;
for i2:=1 to zx-1 do write(chr(a[i2]):4);
writeln;
for i2:=1 to zx-1 do write(a[i2]:4);
s:=''; writeln; writeln; writeln;
for i2:=1 to zx do s:=s+chr(a[i2]);
writeln(s,#10#10#10'ДЛИНА: ',ord(s[0]));
npr; map(5); com; npm
end;
kini
end.