Как превратить персональный компьютер в измерительный комплекс - Гёлль Патрик (полная версия книги .txt) 📗
10 REM — 12BITS —
20 KEY OFF: CLS
30 B=&H3F8: REM COM1:
40 N=12: REM число разрядов
50 OUT B+4,1
60 FOR T=0 TO 100: NEXT T
70 OUT B+3,64
80 TOR T=0 TO 500: NEXT T
90 GOTO 200
100 OUT B+4,0: D=0: REM ACQUISITION
102 OUT B+4,2: OUT B+4,0
103 OUT B+4,2: OUT B+4,0
104 OUT B+4,2: OUT B+4,0
110 FOR F=0 TO N-1
120 OUT B+4,2
130 E=INP(B+6) AND 16
140 OUT B+4,0
150 IF E=16 THEN D=D+2^(N-1-F)
160 NEXT F
170 D=5*D/(2^N-1)
180 OUT B+4,1:RETURN
190 REM (c) 1997 Patrick GUEULLE
program douzebits;
uses crt;
var n,f,e: byte;
b,g: integer;
d: real;
procedure init;
begin
b:=$3F8; n:=12;
port[b+4]:=1;
delay(100);
port[b+3]:=64;
delay(500);
end;
procedure acquisition;
begin
port[b+4]:=0; d:=0;
port[b+4]:=2; port[b+4]:=2;
port[b+4]:=2; port[b+4]:=0;
port[b+4]:=2; port[b+4]:=2;
port(b+4):=2; port[b+4]:=0;
port(b+4):=2; port[b+4]:=2;
port[b+4]:=2; port[b+4]:=0;
for f: = 0 to n-1 do
begin
port[b+4]:=2;
e:=port[b+6] and 16;
port[b+4]:=0;
if e=16 then d:=d+exp((n-1-f)*ln(2));
end;
d:=(5*d)/(exp((n)*ln(2))-1);
port[b+4]:=1;
end;
procedure affiche;
begin
acquisition;
d:=(int(1000*d))/1000;
writeln(d);
delay(500);
end;
begin
clrscr;
init;
for g: =1 to 20 do
begin
affiche;
end;
end.
(* COPYRIGHT 1997 Patrick GUEULLE *)
С АЦП МАХ 1241 (рис. 4.6) будут работать программы MAXIM12.BAS на языке BASIC и MAXIM12.PAS на языке TurboPASCAL.
10 НЕМ — MAXIM12 —
20 KEY OFF: CLS
30 B=&H3F8: REM COM1:
40 N= 12: RЕМ число разрядов
50 OUT B+4,1
60 FOR T=0 TO 100: NEXT T
70 OUT B+3,64
80 FOR T=0 TO 500: NEXT T
90 GOTO 200
100 OUT B+4,0: D=0: REM ACQUISITION
105 OUT B+4,2: OUT B+4,0
110 FOR F=0 TO N-1
120 OUT B+4,2
130 E=INP(B+6) AND 16
140 OUT B+4,0
150 IF E=16 THEN D=D+2^(N-1-F)
160 NEXT F
170 D=5*D/(2^N-1)
180 OUT B+4,1: RETURN
190 REM (c) 1997 Patrick GUEULLE
program maxim12;
uses crt;
var n,f,e: byte;
b,g: integer;
d: real;
procedure init;
begin
b:=$3F8; n:=12;
port[b+4]:=1;
delay(100);
port[b+3]:=64;
delay(500);
end;
procedure acquisition;
begin
port[b+4]:=0; d:=0;
port[b+4]:=2; port[b+4]:=2;
port[b+4]:=2; port[b+4]:=0;
for f:=0 to n-1 do
begin
port[b+4]:=2;
e:=port[b+6] and 16;
port[b+4]:=0;
if e=16 then d:=d+exp((n-1-f)*ln(2))
end;
d:=(5*d)/(exp((n)*ln(2))—1);
port[b+4]:=1;
end;
procedure affiche;
begin
acquisition;
d:=(int(1000*d))/1000;
writeln(d);
delay(500);
end;
begin
clrscr;
init;
for g:=1 to 20 do
begin
affiche;
end;
end.
(* COPYRIGHT 1997 Patrick GUEULLE *)
Здесь будет продемонстрировано, как добавление нескольких строк программы к вышеописанным драйверам приносит полезные практические результаты. Читатели должны будут самостоятельно вносить требуемые изменения (часто минимальные), которые определяются конкретными задачами пользователя. В любом случае объединение соответствующего драйвера и прикладной программы выполняется по команде MERGE (в языке BASIC).
Для использования программы VOLTS.BAS совместно с АЦП ADC 10, например, на языке GWBASIC или эквивалентном надо написать следующие строки:
load "ADC10" (загрузка драйвера);
затем
MERGE "VOLTS" (добавление прикладной программы).
По команде RUN запускается полученная программа, которую можно сохранить целиком по команде:
SAVE "ИМЯ", А (если желательно сохранить файл в текстовом формате);
или просто:
SAVE "ИМЯ" (если желательно сохранить его в наиболее компактном виде).
Будет целесообразно произвести полную компиляцию составленной программы, а также и программы на языке TurboPASCAL, в файл ИМЯ.EXE, исполняемый непосредственно под DOS или Windows. Для этого надо иметь в распоряжении какой-нибудь компилятор, например, Turbo BASIC или Quick BASIC.
Цифровой вольтметр
Очень короткая программа VOLTS.BAS прекрасно подходит для первых шагов в изучении только что собранного или купленного АЦП, но она также пригодна и для более общих задач.
200 REM VOLTS
210 GOSUB 100
220 D=INT(100*D)/100
230 LOCATE 1,1
240 PRINT USING "##.##"; D
250 GOTO 210
260 REM (c) 1997 Patrick GUEULLE
Программа выводит в верхнем левом углу экрана величину напряжения (в вольтах), поданного на вход модуля преобразователя. Эта величина подвергается простейшей обработке, поэтому данная программа — одна из самых быстродействующих в «библиотеке», даже при использовании очень медленных ПК.
Применение команды LOCATE, каждый раз возвращающей курсор в верхний левый угол экрана, приводит к замещению старого значения новым. При этом индикация постоянно обновляется со скоростью, равной частоте взятия выборок, т. е. совершенно так же, как в классическом цифровом вольтметре.
Надо обратить внимание на способ, посредством которого измеренная величина округляется до двух знаков после запятой (строка 220), а потом выводится в жестком формате, наиболее соответствующем выбранной точности (строка 240). Подобное решение будет часто использоваться и в дальнейшем.
Эта программа рассчитана на работу совместно с 8- или 10-разрядным АЦП (точность 1 %), но ее можно оптимизировать и для работы с 12-раз рядным АЦП, исправив строки 220 и 240 следующим образом и обеспечив при этом три индицируемых знака после запятой (т. е. точность 0,1 %):
220 D=INT(1000*D)/1000
240 PRINT USING "##.###"; D
Не стоит также упускать из виду, что драйвер не выполняет никаких округлений, полностью соблюдая точность преобразователя. Только прикладная программа в соответствии с поставленной задачей должна так или иначе использовать получаемую точность, и не более того. Вывод трех знаков после запятой для 8-разрядного АЦП будет излишним, так как третий знак при этом не несет никакого смысла.
200 REM — BARRE —
210 LOCATE 6,1
220 FOR H=1 TO 5
230 PRINT "I….!..";
240 NEXT H
250 PRINT " I "
260 LOCATE 7,1
270 PRINT "0___1___2___"
280 PRINT "3___4___5"
290 GOSUB 100
300 D=INT(10*D)
310 LOCATE 5,1
320 PRINT SPC (D);" I";
330 PRINT SPC (50-D)
340 GOTO 290
350 REM (c) 1997 Patrick GUEULLE
Программа BARRE.BAS, в свою очередь, показывает, как легко можно организовать вывод аналоговой штриховой шкалы.