Этим Вы окажете большую помощь науке и медицине. См. подробнее: 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.