IIC und DS1803 DigiPoti
Moderator: Guido Körber
-
- Posts: 35
- Joined: Wed Feb 23, 2005 8:15 pm
- Location: Berlin
IIC und DS1803 DigiPoti
Hallo,
ist der adressierbare Dual digitale Potentiometer DS1803 von Dallas mit dem IO-Warrior40 kompatibel. Ich habe mal was von Clock-Jittering gelesen, bin mir aber nicht so sicher bei dem DS1803. Ist da jemandem was bekannt darüber, oder hat schon mal jemand mit dem DS1803 in Verbindung mit dem Warrior etwas gemacht. Ich kriege das Ding jedenfalls mit dem Warrior nicht zum Laufen.
Gruss
ist der adressierbare Dual digitale Potentiometer DS1803 von Dallas mit dem IO-Warrior40 kompatibel. Ich habe mal was von Clock-Jittering gelesen, bin mir aber nicht so sicher bei dem DS1803. Ist da jemandem was bekannt darüber, oder hat schon mal jemand mit dem DS1803 in Verbindung mit dem Warrior etwas gemacht. Ich kriege das Ding jedenfalls mit dem Warrior nicht zum Laufen.
Gruss
Den Chip hatte ich noch nicht in der Hand, habe aber mal in das Datenblatt gesehen und finde die Ansteuerung eigentlich nicht zu kompliziert. Für Java könnte ich eine Klasse für IOWJ erstellen, kann die aber nicht testen, weil ich den DS1803 nicht hier habe und 8,40 (Reichelt) mir nur zum Testen etwas zu teuer ist. Wenn Du möchtest, kann ich auch mal einen Blick auf Deine Sourcen werfen.
-
- Posts: 35
- Joined: Wed Feb 23, 2005 8:15 pm
- Location: Berlin
Vielen Dank für die Antwort.
Ja, die Ansteuerung und auch der Anschluss ist nicht sonderlich kompliziert. Ich habe nur das Problem, dass das Ding nicht reagiert. Normalerweise sollte er mir eine Spannung ausgeben, die max der VCC liegt und sollte diese in 256 Stufen runter oder rauf regeln können. das macht es halt nicht. Ich bekomme auf den Ausgang keine Spannung. Der IOW meldet auch keine Fehler zurück. Daher war meine Vermutung, dass der DS1803 keine interne Clock hat und somit der IOW mit ihm nicht klar kommt.
Mein Code ist mit Delphi erstellt. Ich weiss nicht ob Du damit zurecht kommst. Kann Dir aber mal gerne das Script schicken.
Gruss,
Guido
Ja, die Ansteuerung und auch der Anschluss ist nicht sonderlich kompliziert. Ich habe nur das Problem, dass das Ding nicht reagiert. Normalerweise sollte er mir eine Spannung ausgeben, die max der VCC liegt und sollte diese in 256 Stufen runter oder rauf regeln können. das macht es halt nicht. Ich bekomme auf den Ausgang keine Spannung. Der IOW meldet auch keine Fehler zurück. Daher war meine Vermutung, dass der DS1803 keine interne Clock hat und somit der IOW mit ihm nicht klar kommt.
Mein Code ist mit Delphi erstellt. Ich weiss nicht ob Du damit zurecht kommst. Kann Dir aber mal gerne das Script schicken.
Gruss,
Guido
Also ich verstehe das Datenblatt anders. Der Chip enthält zwei Potis, die je drei Anschlüsse habe (wie ein Poti eben so hat). Potis erzeugen keine Spannungen ;-). Ich würde zwischen L0 und W0 ein Ohm-Meter schalten und den Widerstand messen. Oder L0 mit GND und H0 mit Vcc verbinden. Dann kannst Du eine Spannung zwischen W0 und GND messen (0V nach anlegen der Betriebsspannung, 5V bei vorheriger Ausgabe einer 255 an Pot 0). Java Klasse ist übrigens fertig (Reklame).
-
- Posts: 35
- Joined: Wed Feb 23, 2005 8:15 pm
- Location: Berlin
Sorry, habe mich nicht richtig ausgedrückt.
Natürlich habe ich W0 gegen GND gemessen. Das heisst ich habe zuvor L0 mit GND verbunden und H0 mit VCC.
HEY.........HIPHIP :-) Es hat funktioniert. So ein dummer Fehler im Script (falsche Report ID). Ich wäre fast wahnsinnig geworden. Nun klappt es prima. Danke nochmals für die schnelle Response.
Natürlich habe ich W0 gegen GND gemessen. Das heisst ich habe zuvor L0 mit GND verbunden und H0 mit VCC.
HEY.........HIPHIP :-) Es hat funktioniert. So ein dummer Fehler im Script (falsche Report ID). Ich wäre fast wahnsinnig geworden. Nun klappt es prima. Danke nochmals für die schnelle Response.
Sorry für die "Belehrung", aber das Niveau hier im Forum streut doch ziemlich stark und so habe ich ein eher niedriges angenommen.
Interessant sind eigentlich nur die Reports. Einmal write() und read() sind erforderlich. Ich würde, um z.b. 128 auszugeben (müßte dann ca. 2,5V entsprechen), folgenden Report senden:
{2,0xc3,addr,cmd,128,0,0,0} (addr = 5 bei Device Address 0 und cmd = 0xA9 für pot 0)
und einen Report lesen (der sollte auch die id=2 haben), bei dem dann bit 7 vom 2. Byte getestet wird (1=error) und in den drei niederwertigen Bits vom 2. Byte müßten dann eine 3 stehen (für 3 gesendete Bytes). Sollte Bit 7 = 1 oder die 3 Bits != 3 sein, hat die Kommunikation nicht geklappt (Verkabelung und Device Address checken!).
Aber wie ich sehe, hast Du es ja hinbekommen und ich eine Klasse für IOWJ mehr (ist dann in der 0.9.5 enthalten, Reklame).
Interessant sind eigentlich nur die Reports. Einmal write() und read() sind erforderlich. Ich würde, um z.b. 128 auszugeben (müßte dann ca. 2,5V entsprechen), folgenden Report senden:
{2,0xc3,addr,cmd,128,0,0,0} (addr = 5 bei Device Address 0 und cmd = 0xA9 für pot 0)
und einen Report lesen (der sollte auch die id=2 haben), bei dem dann bit 7 vom 2. Byte getestet wird (1=error) und in den drei niederwertigen Bits vom 2. Byte müßten dann eine 3 stehen (für 3 gesendete Bytes). Sollte Bit 7 = 1 oder die 3 Bits != 3 sein, hat die Kommunikation nicht geklappt (Verkabelung und Device Address checken!).
Aber wie ich sehe, hast Du es ja hinbekommen und ich eine Klasse für IOWJ mehr (ist dann in der 0.9.5 enthalten, Reklame).
-
- Posts: 35
- Joined: Wed Feb 23, 2005 8:15 pm
- Location: Berlin
Ich finde im übrigen Dein IOWJ-Projekt Klasse !!!
Nun für all die jenigen die auch mal mit dem Poti-IC was basteln wollen und mit Delphi programmieren, das Snippet:
BDATA: array [0..7] of Byte;
BDATA[0] := $02;
BDATA[1] := $84;
BDATA[2] := $50;
BDATA[3] := $AA; //$A9
BDATA[4] := $FF; //MAX VALUE
for I := 5 to 7 do BDATA := $00;
DEVICE.WriteFile(BDATA, 8, W);
Nun für all die jenigen die auch mal mit dem Poti-IC was basteln wollen und mit Delphi programmieren, das Snippet:
BDATA: array [0..7] of Byte;
BDATA[0] := $02;
BDATA[1] := $84;
BDATA[2] := $50;
BDATA[3] := $AA; //$A9
BDATA[4] := $FF; //MAX VALUE
for I := 5 to 7 do BDATA := $00;
DEVICE.WriteFile(BDATA, 8, W);
Guido,
Recht herzlichen Dank für Deinen Zuspruch.
Dennoch würde ich über "BDATA[1] := $84;" gerne mit Dir diskutieren:
1. Warum generierst Du keine Stop (ergibt dann $Cx) ?
2. Warum die Länge 4 wenn Du nur 3 Byte Nutzdaten hast (ergibt dann $C3)? Bei BDATA[3] :=$A9 (write position to pot0) würdest Du so pot1 auf 0 gleich mit setzten, und das wolltest Du doch nicht, oder?
Gruß
Thomas
Recht herzlichen Dank für Deinen Zuspruch.
Dennoch würde ich über "BDATA[1] := $84;" gerne mit Dir diskutieren:
1. Warum generierst Du keine Stop (ergibt dann $Cx) ?
2. Warum die Länge 4 wenn Du nur 3 Byte Nutzdaten hast (ergibt dann $C3)? Bei BDATA[3] :=$A9 (write position to pot0) würdest Du so pot1 auf 0 gleich mit setzten, und das wolltest Du doch nicht, oder?
Gruß
Thomas
-
- Posts: 35
- Joined: Wed Feb 23, 2005 8:15 pm
- Location: Berlin
Hallo Thomas,
die Länge von 3 Bytes ist ausreichend und bis 6 Bytes (C3-C6) möglich, Stop ist nicht zwingend nötig. Byte[5]-[7] kann meinetwegen genauso $FF sein. Wenn Pot0 gesetzt werden soll, wird Byte[3] mit $A9 definiert, für Pot1 mit $AA und für beide Pot1/0 zusammen dann mit $AF. Brauche dann für beide Pots zusammen dann auch nicht mehr Bytes schreiben als für eines.
Gruss,
Guido
die Länge von 3 Bytes ist ausreichend und bis 6 Bytes (C3-C6) möglich, Stop ist nicht zwingend nötig. Byte[5]-[7] kann meinetwegen genauso $FF sein. Wenn Pot0 gesetzt werden soll, wird Byte[3] mit $A9 definiert, für Pot1 mit $AA und für beide Pot1/0 zusammen dann mit $AF. Brauche dann für beide Pots zusammen dann auch nicht mehr Bytes schreiben als für eines.
Gruss,
Guido
towaibw wrote:Guido,
Recht herzlichen Dank für Deinen Zuspruch.
Dennoch würde ich über "BDATA[1] := $84;" gerne mit Dir diskutieren:
1. Warum generierst Du keine Stop (ergibt dann $Cx) ?
2. Warum die Länge 4 wenn Du nur 3 Byte Nutzdaten hast (ergibt dann $C3)? Bei BDATA[3] :=$A9 (write position to pot0) würdest Du so pot1 auf 0 gleich mit setzten, und das wolltest Du doch nicht, oder?
Gruß
Thomas
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Hi,
habe noch einen IOW40 liegen gehabt.
Funktioniert aber irgentwie so nicht.
Habe das Beispiel aus der SDK genommen für IIC und folgende Änderung vorgenommen:
Report.ReportID := $02;
Report.Bytes[0] := $C3;
Report.Bytes[1] := $50;
Report.Bytes[2] := $AF;
Report.Bytes[3] := $88;
IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitRead(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT_SPECIAL_REPORT_SIZE);
Habe alle Adresseingänge auf Masse gelötet.
Gruss Jan
habe noch einen IOW40 liegen gehabt.
Funktioniert aber irgentwie so nicht.
Habe das Beispiel aus der SDK genommen für IIC und folgende Änderung vorgenommen:
Report.ReportID := $02;
Report.Bytes[0] := $C3;
Report.Bytes[1] := $50;
Report.Bytes[2] := $AF;
Report.Bytes[3] := $88;
IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitRead(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT_SPECIAL_REPORT_SIZE);
Habe alle Adresseingänge auf Masse gelötet.
Gruss Jan
-
- Site Admin
- Posts: 2879
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm