PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C mit IO-Warrior 24



toemchen
19.11.2006, 09:52
Hallo,

ich will ein paar Servos und ein paar andere Sachen über USB steuern, und hab dazu ein kleines Board mit einem IO-Warrior 24 und einem Servocontroller SD20 gebaut. Die anderen Sachen, direkt über I/o-Pins des Warriors gesteuert, funktionieren schon, da hatte ich mich schon einmal durch die Bibliotheken des Windows-SDK für den Warrior gekämpft.

Aber für die I2C-Absteuerung des SD20 stehe ich noch vor einer Wand. Ih wollte das mitgelieferte Beispielprogramm (Visual Basic) zur I2C-Ansteuerung mit dem Warrior benutzen, aber bei dem Telegramm, das ich schicken will:

1. Byte: dez195 (Start und Stop, 3 Datenbytes)
2. Byte: dez194 (Adresse des SD20)
3. Byte: dez001 (Erster Servo)
4. Byte: dez127 (Wert)

steigt mir das Progrämmchen aus.

Was mache ich falsch?

Arbeitet hier überhaupt jemand mit dem IO-Warrior?

Danke schonmal...

Gruß
Tom.

toemchen
20.11.2006, 23:23
Hgrmpf, scheint kaum jemand zu interessieren... muß ich also selbst ran.

Erstens: Quellcode angeschaut, Programm in der VB-Umgebung laufenlassen: Es müssen Hexwerte statt Dezimalwerte eingegeben werden.

Zweitens: In der VB-Umgebung am Schreibtischrechner verkündet das Programm fröhlich, das alle 3 Bytes acknowledged sind. Als compiliertes Programm am Laptop im Bastelraum heißt es aber IIC write error. Seltsam. Morgn wird weitergeforscht.

eevox
21.11.2006, 14:33
Also mich interessierts auf jeden fall. Auch wenn kein anderer was dazu schreibt, ich höre dir gerne zu. Also schreib bitte fleißig weiter und viel glück schonmal!

toemchen
22.11.2006, 10:36
So, jetzt läufts.

Wahrscheinlich war alles nur Fehlbedienung des Progrämmchens. Mit Dezimalwerten gehts natürlich nicht, anschließend hab' ichs mit Hexwerten probiert und dabei aber vielleicht im ersten Byte die Bits für Start- und Stopkondition weggelassen, weiß ich nicht mehr so genau. Mit folgender Sequenz gehts jetzt:

1. Byte: C3 (Bits gesetzt für Start, Stop, und 3 folgende Datenbytes)
2. Byte: C2 (Adresse des SD20)
3. Byte: 1 (erster Servo)
4. Byte: 80 (ein etwa mittiger Wert für die Position)

und Hurra, es meldet 3 Bytes acknowledged und das Servo saust in die Position.

Ein weiterer Verdacht für die vorherigen Probleme: Spannungslage am USB. Der Laptop liefert schon 4,98V, aber nach dem zwischengeschalteten Hub sinds nur noch 4,63. Jaja, zur Entkopplung der vom Host gelieferten USB-Versorgungsspannung und der eventuell am Hub eingespeisten Spannung dient einfach eine (immerhin Schottky) Diode. Aber mit dem Einspeisen von 5V in den Hub gabs auch seltsame Effekte, so daß ich zwischendurch schon befürchtete, den USB-Port am Laptop zerschossen zu haben.

Mein Problem war auch, daß ich an den normalen IO-Ports des Warriors einige PNP-Transistoren hängen hatte, deren Emitter aber an von anderer Seite zugespeisten 5V hing. Warum diese PNP-Schaltung? Weil die Ports des Warriors im inaktiven Zustand von internen Pullups auf High gezogen werden, und im inaktiven Zustand diesen Ports kein Strom nach GND gezogen werden sollte. Nun aber das Problem: Die Differenz zwischen 4,6V (Warrior-Port High) an der Basis der PNPs und den externen 5,15V am Emitter reichte schon halb zum Schalten des Transistors, genau das, was ich nicht wollte. Nun hängen die Emitter auch alle an der USB-Spannung, die Funktion ist jetzt sauber, aber der USB des Hosts ist halt mit zusätzlich ca. 8mA belastet. Das Ganze nur mal so erzählt, vielleicht hat mal irgendjemand beim Blättern und Suchen nach seinem Problem hier einen Aha-Effekt.

Gruß
Tom.