А как проверить ...
function chtenie_iz_porta(pdw:dword):byte;
var by:byte;
begin
pdw:=$80000000+pdw;
asm
mov eax,43
mov ecx,pdw
int $40
mov by,bl
end;
chtenie_iz_porta:=by;
end;
... наиболее простыми средствами, или
тут на 100% всё в порядке?
KolibriOS на производстве
-
Last edited by VitZ on Sat Jun 15, 2013 4:25 pm, edited 1 time in total.
mov [by],bl
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
... thanks.
procedure rc(var s:string);
Spoiler:
Code: Select all
procedure rc(var s:string);
var c:char; i,t:dword;
begin s:=''; i:=1; t:=0;
repeat
while (In1021 and 1)<>1 do begin
t:=t+1;
if (t>2000) then exit;
end;
c:=chr(In1016);
if c=chr(13) then break;
s[0]:=chr(i);
s[i]:=c;
i:=i+1;
if (i>30) then break;
t:=0;
until false;
end;
Last edited by VitZ on Fri Jul 12, 2013 4:46 pm, edited 9 times in total.
... А гадкий LPT при включении компьютера посылает включающий сигнал на все свои выходы ...
ТБ - вот с чего должна была начаться эта тема !!!
(как, кстати, суметь потушить огнетушителем с электропроводящим
содержимым неотключённую от электросети производственную
электроустановку?)
ТБ - вот с чего должна была начаться эта тема !!!
(как, кстати, суметь потушить огнетушителем с электропроводящим
содержимым неотключённую от электросети производственную
электроустановку?)
Last edited by VitZ on Wed Jan 29, 2014 8:28 pm, edited 1 time in total.
Ну а ты куда смотрел?... А гадкий LPT при включении компьютера посылает включающий сигнал на все свои выходы ...
Да, некоторые BIOSы играют сигналами на LPT-шине, по стандарту IEEE1284.
А Винда в течение первой минуты после начала загрузки периодически опрашивает отклик ECP-устройств по древнему PnP протоколу.
Прежде чем подключать железяку - проверь дефолтные состояния и игру сигналов при включении/выключении, это же азы!
Евангелие от Иоанна: стих 1[/size]
Code: Select all
; В начале было Слово:
B32: mov ax, os_stack ; Selector for os
function In1016:byte;
var by:byte;
begin
asm
mov dx,1016
in al,dx
mov [by],al
end;
In1016:=by;
end;
k.writeNumber(5,125,$33F1F1F1,0,5,In1016) в 3-ем пункте k.waitForEvent'a
- даёт устойчивый приём последовательности одинаковых байтов,
приходящих из второго компа (DOS'a):
DOScom -> comKOS
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ... или
15, 15, 15, 15, 15, 15, 15, 15, 15, 15 ... и т. пр.
var by:byte;
begin
asm
mov dx,1016
in al,dx
mov [by],al
end;
In1016:=by;
end;
k.writeNumber(5,125,$33F1F1F1,0,5,In1016) в 3-ем пункте k.waitForEvent'a
- даёт устойчивый приём последовательности одинаковых байтов,
приходящих из второго компа (DOS'a):
DOScom -> comKOS
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ... или
15, 15, 15, 15, 15, 15, 15, 15, 15, 15 ... и т. пр.
Last edited by VitZ on Mon Aug 26, 2013 8:08 pm, edited 4 times in total.
function In1021:byte;
var by:byte;
begin
asm
mov dx,1021
in al,dx
mov [by],al
end;
In1021:=by;
end;
procedure open_com;
begin
{}
zapis_v_port(1019,$80);
zapis_v_port(1016, (1 and $FF) );
zapis_v_port(1017, ((1 and $FF00) shr 8 ) );
zapis_v_port(1019,3);
zapis_v_port(1017,0);
zapis_v_port(1018,7);
{}
zapis_v_port(1018,1);
end;
<< open_com; >> надо записать сразу после захвата портов
в основной части программы (между основными BEGIN и END)
var by:byte;
begin
asm
mov dx,1021
in al,dx
mov [by],al
end;
In1021:=by;
end;
procedure open_com;
begin
{}
zapis_v_port(1019,$80);
zapis_v_port(1016, (1 and $FF) );
zapis_v_port(1017, ((1 and $FF00) shr 8 ) );
zapis_v_port(1019,3);
zapis_v_port(1017,0);
zapis_v_port(1018,7);
{}
zapis_v_port(1018,1);
end;
<< open_com; >> надо записать сразу после захвата портов
в основной части программы (между основными BEGIN и END)
Last edited by VitZ on Wed Jun 12, 2013 1:19 pm, edited 1 time in total.
Всё; работает;
посылаю из компа запрос '$01M' с конечным байтом 13,
а приходит ответ '!017042' с конечным байтом 13
(<<i7042>> - это и есть имя устройства, висящего на адресе 1 ПЛ).
посылаю из компа запрос '$01M' с конечным байтом 13,
а приходит ответ '!017042' с конечным байтом 13
(<<i7042>> - это и есть имя устройства, висящего на адресе 1 ПЛ).
Last edited by VitZ on Wed Sep 04, 2013 8:22 pm, edited 3 times in total.
Поздравляю. Теперь можете писать любые драйвера для устройств на EIA485 и EIA232? Думали про USB<->EIA485 и EIA232<->USB?
PPro - это минидельфи в RTOS (KOS).
Следующим шагом подключим устройство i7017
и построим график (напряжения на [Vin0+ __ Vin0-]
его входе).
При запуске этой программы и нажатии на кнопку в окне
должна появиться строка (чуть ниже в окне) -
!027017
- а это значит: устройство многоканального АЦП
подключено к ПЛ (115200) и имеет адрес 02.
Следующим шагом подключим устройство i7017
и построим график (напряжения на [Vin0+ __ Vin0-]
его входе).
Spoiler:
Code: Select all
program hello96; uses kolibri; var k:TKolibri;
const header:string='HelloWorld test'#0;
procedure zapis_v_port(pdw:dword; b:byte);
begin asm
mov eax,43
mov bl,b
mov ecx,pdw
int $40
end; end;
procedure draw_window;
begin k.BeginDraw;
k.DefineWindow(10,40,350,350,$33FFFFFF,0,integer(@header[1]));
k.DefineButton(5,5,65,25,7,7);
k.EndDraw; end;
procedure zachvat_portov;
begin asm
mov eax,46
mov ebx,0
mov ecx,1016
mov edx,1023
int $40
end; end;
procedure otdatj_porti;
begin asm
mov eax,46
mov ebx,1
mov ecx,1016
mov edx,1023
int $40
end; end;
procedure open_com;
begin
zapis_v_port(1019,$80);
zapis_v_port( 1016,(1 and $FF) );
zapis_v_port( 1017,((1 and $FF00) shr 8) );
zapis_v_port(1019,3);
zapis_v_port(1017,0);
zapis_v_port(1018,7);
zapis_v_port(1018,1);
end;
function In1016:byte;
var by:byte;
begin
asm
mov dx,1016
in al,dx
mov [by],al
end;
In1016:=by;
end;
function In1021:byte;
var by:byte;
begin
asm
mov dx,1021
in al,dx
mov [by],al
end;
In1021:=by;
end;
procedure sc(s:string);
var i,t:dword;
begin i:=1; t:=0;
if ( (length(s)<1) or (length(s)>30) ) then exit;
while (i<>length(s)+1) do begin
while (In1021 and $20)=0 do begin
{t:=t+1;
if (t>200000000) then exit;}
end;
zapis_v_port(1016,ord(s[i]));
i:=i+1; t:=0;
end;
while (In1021 and $20)=0 do begin
{t:=t+1;
if (t>200000000) then exit;}
end;
zapis_v_port(1016,13);
end;
procedure rc(var s:string);
var c: char; i,t:dword;
begin s:=''; i:=1; t:=0;
repeat
while (In1021 and 1)<>1 do begin
{t:=t+1;
if (t>200000000) then exit;}
end;
c:=chr(In1016);
if c=chr(13) then break;
s[0]:=chr(i);
s[i]:=c;
i:=i+1;
if (i>30) then break;
t:=0;
until false;
end;
var s1,s2:string; key,j:dword;
BEGIN draw_window; j:=1;
zachvat_portov;
open_com;
s1:='$02M';
while true do case k.waitforevent of
1:draw_window;
2:k.getkey(key);
3:begin
if j=1 then begin
j:=2;
sc(s1);
rc(s2);
k.writeText(5,125,0,0,s2);
end;
end;
end;
otdatj_porti;
END.
должна появиться строка (чуть ниже в окне) -
!027017
- а это значит: устройство многоканального АЦП
подключено к ПЛ (115200) и имеет адрес 02.
Last edited by VitZ on Mon Aug 26, 2013 8:06 pm, edited 3 times in total.
График будем рисовать прямоугольничками (DrawBar(x,y,width,height,color)):
каждые 3 секунды надо
посылать строковый запрос устройству i7017: <<каково напряжение на твоём нулевом входе?>>,
принимать ответ (в строку s2),
вышифровывать из s2 пришедшее число вольтов (0 .. 10В) в переменную chislo_voltov_1 (integer),
масштабировать его по оси <<- y>> на наш график (chislo_voltov_2: integer)
(при повторении этого алгоритма через следующие 3 с - надо отступить вправо на 10 пикселей).
[Снаружи - необходим реостатик, задающий напряжение - по известной схеме].
Процесс этот желательно как-то закончить при <<дохождении>>
прямоугольничками самописца до правого края окна.
каждые 3 секунды надо
посылать строковый запрос устройству i7017: <<каково напряжение на твоём нулевом входе?>>,
принимать ответ (в строку s2),
вышифровывать из s2 пришедшее число вольтов (0 .. 10В) в переменную chislo_voltov_1 (integer),
масштабировать его по оси <<- y>> на наш график (chislo_voltov_2: integer)
(при повторении этого алгоритма через следующие 3 с - надо отступить вправо на 10 пикселей).
[Снаружи - необходим реостатик, задающий напряжение - по известной схеме].
Процесс этот желательно как-то закончить при <<дохождении>>
прямоугольничками самописца до правого края окна.
Last edited by VitZ on Mon Aug 26, 2013 8:03 pm, edited 4 times in total.
function sch_vr:dword;
var t:dword;
begin
asm
mov eax,26
mov ebx,9
int $40
mov [t],eax
end;
sch_vr:=t;
end;
...
sch_vr_2:=sch_vr;
if (sch_vr_2 > (sch_vr_1+299)) then {прошло 3 секунды} begin sch_vr_1:=sch_vr_2; Alg1; end;
...
var t:dword;
begin
asm
mov eax,26
mov ebx,9
int $40
mov [t],eax
end;
sch_vr:=t;
end;
...
sch_vr_2:=sch_vr;
if (sch_vr_2 > (sch_vr_1+299)) then {прошло 3 секунды} begin sch_vr_1:=sch_vr_2; Alg1; end;
...
Last edited by VitZ on Thu Jun 20, 2013 2:04 pm, edited 1 time in total.
Кроме "прямоугольничков" график можно рисовать любыми ASCII-маркерами
с помощью 4-й функции (ecx=0x00RRGGBB, esi = 1)
Code: Select all
☼ ► ¤ ◄ ▲ ▼ ♥ ♦ ♣ ♠ • ○ Ж W o
... http://www.icpdas.com/download/7000/manual.htm - страница с документацией по i7, некоторые файлы перепутаны местами ...
(В случае управления мотором ПК лишь посылает <<число_угловых_градусов_в_секунду>>,
а одно из устройств серии i7000 (контроллер) выполняет <<шимовую>>
функцию - для пущей реальности времени.
Хотя, поначалу управление техпроцессом лучше осуществлять
контроллерами, и по месту, так, чтобы крах системы был невозможен
из-за отказа сервера сбора инфы (колибри) - при отказе сервера (колибри)
потеряется только инфа (при этом управление сохранится по месту)).
На запрос '#020' устройство i7017 ответит '>+001.23'.
(То есть на нулевом входе устройства АЦП сейчас 1,23 В и
коль оно пришло в комп - его можно как-то визуализировать на экран.)
Chislo_voltov_1:=str5_to_num(s2[3]+s2[4]+s2[5]+s2[7]+s2[8]).
(В случае управления мотором ПК лишь посылает <<число_угловых_градусов_в_секунду>>,
а одно из устройств серии i7000 (контроллер) выполняет <<шимовую>>
функцию - для пущей реальности времени.
Хотя, поначалу управление техпроцессом лучше осуществлять
контроллерами, и по месту, так, чтобы крах системы был невозможен
из-за отказа сервера сбора инфы (колибри) - при отказе сервера (колибри)
потеряется только инфа (при этом управление сохранится по месту)).
На запрос '#020' устройство i7017 ответит '>+001.23'.
(То есть на нулевом входе устройства АЦП сейчас 1,23 В и
коль оно пришло в комп - его можно как-то визуализировать на экран.)
Chislo_voltov_1:=str5_to_num(s2[3]+s2[4]+s2[5]+s2[7]+s2[8]).
Last edited by VitZ on Sun Nov 02, 2014 4:10 pm, edited 22 times in total.
Who is online
Users browsing this forum: No registered users and 3 guests