ich habe jetzt den Steuerzyklus für meinen AD Wandler (MAX187) von den LPT Write/Read Funktionen zu denen des IO Warriors übertragen, allerdings erhalte ich nicht die gewünschte Bitsequenz bzw garnichts.
Für die Druckerport DLL sah der (funktionierende) Steuerzyklus folgendermaßen aus:
adr ist das Data Register, adr+1 demnach das Status Register und Bit 64 der Pin "Ack" über den der AD Wandler die Bitsequenz zurückgeschickt hat.
Code: Select all
DlPortWritePortUchar(adr,24);{8+16=Ub.. and CS = Low}
{Wait for end of conversion (=Data high)}
while DlPortReadPortUchar(adr+1) AND 64<>64 do begin end;
{extra startclock}
DlPortWritePortUchar(adr,25);{Clock low2high}
for j:=1 to 8 do begin end; {delay}
DlPortWritePortUchar(adr,24);{Clock high2low}
for j:=1 to 8 do begin end; {delay}
for i:=1 to 12 do
begin
DlPortWritePortUchar(adr,25);{Clock low2high}
for j:=1 to 8 do begin end;{delay}
for j:=1 to 2 do if DlPortReadPortUchar(adr+1) AND 64 = 64 then a:=1 else a:=0;
b:=b+a*bits[i];
DlPortWritePortUchar(adr,24);{Clock high2low}
for j:=1 to 8 do begin end;{delay}
end;
Dann würde Bit 24 am LPT, "not 12" am IOW entsprechen, 25 wäre "not 13" und 64 wäre 65407.
Danach habe ich dann den Steuerzyklus folgendermaßen für den IO Warrior umgeschrieben:
Code: Select all
FillChar(Report, IOWKIT24_IO_REPORT_SIZE, $FF);
Report.ReportID := 0;
Report.Bytes[0] := Report.Bytes[0] and not (12);{8+16=Ub.. and CS = Low}
IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT24_IO_REPORT_SIZE);
IowKitReadImmediate(IOWarrior,&bit);
{Wait for end of conversion (=Data high)}
while bit AND 65407<>65407 do begin end;
{extra startclock}
Report.Bytes[0] := Report.Bytes[0] and not (13);{Clock low2high}
IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT24_IO_REPORT_SIZE);
for j:=1 to 8 do begin end; {delay}
Report.Bytes[0] := Report.Bytes[0] and not (12);{Clock high2low}
IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT24_IO_REPORT_SIZE);
for j:=1 to 8 do begin end; {delay}
for i:=1 to 12 do
begin
Report.Bytes[0] := Report.Bytes[0] and not (13);{Clock low2high}
IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT24_IO_REPORT_SIZE);
for j:=1 to 8 do begin end;{delay}
IowKitReadImmediate(IOWarrior,&bit);
for j:=1 to 2 do if bit AND 65407 = 65407 then a:=1 else a:=0;
b:=b+a*bits[i];
Report.Bytes[0] := Report.Bytes[0] and not (12);{Clock high2low}
IowKitWrite(IOWarrior, IOW_PIPE_IO_PINS, PChar(@Report), IOWKIT24_IO_REPORT_SIZE);
for j:=1 to 8 do begin end;{delay}
end;
Vielen dank schonmal!!
gruss michael