A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
King Sauce
Posts: 22
Joined: Mon Jan 05, 2009 6:13 pm

A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by King Sauce »

Guten Abend,
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;
Anstelle der LPT Ports D0,D1,D3 und D4 habe ich die ersten vier Ports des IOWarriors genommen (0.0-0.3) und den 0.7 Port anstelle des Ack Ports der Druckerschnittstelle genommen.
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;
Wäre nett wenn mir jemand sagen könnte was an meiner Umwandlung falsch ist (Denn dort muss ja irgendwo der Fehler liegen). Am Druckerport lief der A/D Wandler wie gesagt einwandfrei mit dem obigen Steuerzyklus

Vielen dank schonmal!!

gruss michael
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by Guido Körber »

Also die erste Frage die mir da einfällt ist warum Sie nicht die SPI Funktion des IOW24 verwenden? Mit dem Herumschubsen der einzelnen Bits wird das extrem langsam, dafür ist der USB nicht gut geeignet.
King Sauce
Posts: 22
Joined: Mon Jan 05, 2009 6:13 pm

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by King Sauce »

Mir schien das mit den normalen Funktionen am einfachsten, weil ich den vorher benutzten Steuerzyklus am liebsten einfach 1:1 umsetzen wollte.
Die Geschwindigkeit wäre wohl auch erstmal kein Problem, den ein Ergebnis sollte man ja trotzdem erhalten, oder nicht?
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by Guido Körber »

Also ehrlich gesagt verstehe ich nicht ansatzweise wie das funktionieren soll.

Die Delay Schleifen sind sinnlos, die werden auf jedem halbwegs aktuellen Prozessor so schnell ausgeführt, dass es keinerlei Unterschied macht.

Auf das Ende der Conversion zu prüfen macht keinen Sinn. Laut Datenblatt des MAX187 braucht der maximal 8,5µsec für eine Wandlung. Das nächste Datenpaket über den USB kann aber frühestens nach 200µsec eintreffen (USB 2.0 über einen Hub mit ordentlichen TTs). Abgesehen davon wird sich der Wert von bit in der while Schleife nicht von alleine verändern.

Die Bitoperationen sind mir völlig unklar. Was ist das überhaupt für eine Programmiersprache? Was tut "Report.Bytes[0] := Report.Bytes[0] and not (13)" mit dem Wert von Report.Bytes[0]?
King Sauce
Posts: 22
Joined: Mon Jan 05, 2009 6:13 pm

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by King Sauce »

Bei der Programmiersprache handelt es sich um Delphi und ich weiß nicht ob ich das schon geschrieben habe, aber der Code wurde nicht von mir entwickelt. Der war im Original in TurboPascal geschrieben wobei die damals unter windows95 wohl noch funktionierenden port[..] Funktionen eingesetzt wurden. Ich habe die Funktionen dann gegen die der portio.DLL ausgetauscht um den gleichen Zyklus unter Windows XP benutzen zu können.
Ich dachte mir deshalb das ich die Funktionen der portio.DLL wiederum einfach gegen die der IOW API austauschen könnte.
Das Array "bits" ist ein array[1..12] of integer = (2048,1024,512,256,127,64,32,16,8,4,2,1) und die Schleife zählt dieses offensichtlich durch.

Der Teil: "Report.Bytes[0] := Report.Bytes[0] and not (13)", ist aus dem SimpleIO Delphi Beispiel übernommen, nur das ich die Variablen gegen konstante Werte, sprich die jeweiligen Bits ausgetauscht habe:
Im Original:

// set the bit to 0 to switch the LED on
Report.Bytes[LEDByte] := Report.Bytes[LEDByte] and not (1 shl I)
Mit den Delay Schleifen haben sie natürlich recht.

Auch wenn das Benutzen der SPI Funktionen eigentlich der logischste Schritt wäre (da ja beides kompatibel ist), weiß ich nicht ob ich das so einfach aus 2 Datenblättern heraus umsetzen könnte...
Von daher wollte ich am Liebsten den im Prinzip funktionierenden, fertig programmierten Zyklus benutzen.

Oder geht es gerade darum, dass der Zeitraum zwischen Auftrag und Umsetzung beim USB so groß ist, dass der AD Wandler frühzeitig aufhört bzw garnicht erst anfängt zu arbeiten und somit garnicht mit der "Bitschieberei", also dem alten Zyklus, klarkommt?
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by Guido Körber »

Es geht darum, dass der Sourcecode keinen Sinn ergibt.

Da der Schaltplan nicht bekannt ist, kann ich auch nicht nachvollziehen was denn wo angeschlossen sein soll und was die Bits eigentlich tun würden. Aber:
Report.Bytes[0] and not (13)
Report.Bytes[0] and not (12)
macht schon keinerlei Sinn, da werden mehrere Portpins auf Null gesetzt und bleiben dann da.

Mit dem SPI wäre das Ganze deutlich einfacher, niedrigste Datenrate einstellen und einen Schreib-/Lesebefehl mit zwei Dummy Bytes an den IO-Warrior. Zurück kommen dann die gewünschten Daten. Zum Ausprobieren einfach mal SimpleHIDwrite verwenden, damit kann man die Reports von Hand bauen.
King Sauce
Posts: 22
Joined: Mon Jan 05, 2009 6:13 pm

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by King Sauce »

Guido Körber wrote:Mit dem SPI wäre das Ganze deutlich einfacher, niedrigste Datenrate einstellen und einen Schreib-/Lesebefehl mit zwei Dummy Bytes an den IO-Warrior. Zurück kommen dann die gewünschten Daten. Zum Ausprobieren einfach mal SimpleHIDwrite verwenden, damit kann man die Reports von Hand bauen.
Ok das hört sich gut an ;) Dann werde ich das nachher erstmal ausprobieren.
Vielen Dank.

achso das hier ist die Schaltung für den AD Wandler:
Image
Mit dem IOW vorne dran ist dann bei mir SCLK an 0.0, /CS an 0.1, /SHDN an 0.2+0.3 und DOUT an 0.7.

Und um das SPI Interface zu verwenden muss ich jetzt nur SCK->SCLK, /DRDY->/CS und MISO<-DOUT verbinden?
Guido Körber
Site Admin
Posts: 2878
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by Guido Körber »

/SS -> /CS

/DRDY wird nicht benötigt. Wie gesagt niedrigste Datenrate auswählen. CPOL und CPHA richtig hin zu kriegen kann beim SPI ein paar Minuten Spaß machen, das geht oft durcheinander.
King Sauce
Posts: 22
Joined: Mon Jan 05, 2009 6:13 pm

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by King Sauce »

Alles klar vielen dank für die Hilfe, dann setz ich mich da mal ran ;)
Ich hoffe mal, dass das nun was wird. Die Benutzung des SPI scheint mir sowieso schöner als die Bitschieberei.
Ganz nach dem KISS Prizip.
King Sauce
Posts: 22
Joined: Mon Jan 05, 2009 6:13 pm

Re: A/D Wandler Steuerzyklus läuft am IO Warrior24 nicht?!

Post by King Sauce »

alles klar, vielen dank! Mit dem SPI Interface scheint es wirklich SEHR viel einfacher zu gehen.
Ich habe es heute angeschlossen und nach einiger Spielerei und mit den General HID Tools bekam ich auch endlich Daten zurück.
Nochmal vielen dank für den Anstoß in die richtige Richtung.
gruss Michael
Post Reply