<< Вернуться к списку курсовых работ
Подключите Ваш компьютер к проекту распределённых вычислений!
Этим Вы окажете большую помощь науке и медицине.
См. подробнее: 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:

  1. Для безразмерной величины сообщение начинается со знака числа.
  2. Объём сообщения, соответствующий колонке "Цифры", от 1 до 18 цифр.
  3. Максимальная длина сообщения - 32 байта.
  4. ПС - символ перевода строки по ГОСТ 13052-74. Передаётся одним байтом - код 10 ($0A).


Таблица 12

  Номер битаЛД7ЛД6ЛД5ЛД4ЛД3ЛД2ЛД1ЛД0
  НазначениеxСообщение
ОБЗ
xxОтмена
адресации
xОшибка
программирования
x

Примечание к таблице 12:    x - бит не используется.

 

Немного далее будет приведён полный листинг заключительной версии программы PRB4.PAS от 8 мая 1997 года, а ниже - краткое описание констант, переменных, функций и процедур в этой программе:

Описание констант в программе

Константа в программеЗначение в
двоичном коде
Назначение
  UP = 10000 0001 Интерфейсная команда (прогр. КОП).  (1 - команда, 0 - данные).
  ZO = 20000 0010 Запрос на обслуживание
  OI = 40000 0100 Очистить интерфейс
  DP = 80000 1000 Данные приняты (0 - да, 1 - нет).
  GP = 160001 0000 Готов ли прибор к приёму (1 - готов, 0 - не готов).
  SD = 320010 0000 Синхронизация данных
  KP = 640100 0000 Конец передачи
  DU = 1281000 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.