USB-Programmierung

(erweitert 4.10.02)

Immer mehr Anwender beschäftigen sich mit dem USB. Und deshalb tauchen auch häufiger Fragen auf. Hier sollen einige zusammengefasst werden.

1. Wo findet man Softwarebeispiele zum USB in C++?

In c´t Heft 19/2002 ist unter dem Titel "Angegrillt" ein konkretes Hardwareprojekt mit dem Portchip zu finden. Über den Portbaustein wird ein Grillmotor gesteuert, um eine Webcam zu drehen. Besonders interessant sind die Software-Beispiele in Microsoft Visual C++ 6.0 und in Delphi (Soft-Link 0219196) www.heise.de/ct/ftp/02/19/196/ Die Beispiele sind ohne großen Aufwand auf das CompuLAB-USB anwendbar, denn letztlich ist der selbe Treiber am Werk.

Wer sich ernsthafter mit der Materie auseinandersetzen möchte, sollte sich das Starterkit von Anchor-Chips (jetzt unter Cypress, www.cypress.com) zum EZ-USB (AN2131) ansehen. Cypress bietet das komplette Manual und die Beispielsoftware mit allen Quelltexten in C++ zum freien Download an. Das passende Entwicklungssystem ist unter der Bezeichnung SERAI-USB bei Modul-Bus zu bekommen.

Neu: Von Herrn Rolf Sauder kommt ein Programmbeispiel in Borland C++ Builder 4.0. Das Zip-Archiv enthält außerdem weitere Hinweise zur Ansteuerung des USB unter Windows 2000. Portusb_BC.zip (22KB)


2. Warum gibt es mit den VB-Beispielen Probleme unter Windows 2000 ?

Die bisherigen VB-Beispiele hatten eine Schwäche, die unter Windows 98/ME keine Auswirkungen hatte. Mehrere Anwender haben Lösungsansätze geschickt. Der entscheidende Tipp kam von Herrn Dr. Igor Holländer:

"Bei der Deklaration von CreateFile muss unbedingt ein ByVal Modifikator vor dem Parameter lpSecurityAttributes stehen, und dann kann es auch weiterhin als long deklariert werden, also

    ...

    ByVal lpSecurityAttributes As long, _

    ...

Für W2K gilt eindeutig, wenn Security NULL ist, dann bekommt das Objekt einen default security Descriptor (siehe Microsoft Platform SDK: File Storage). Da aber in dem ursprünglichen Text von CLAD10 eine Variable gestanden ist (Security), und Visual Basic die Parameter defaultmässig als ByRef übergibt, wurde nicht '0' (wie beabsichtigt), sondern wahrscheinlich eine undefinierte Konstante übergeben (auch wenn die undeklarierten Variablen - bei fehlender Option Explicit - auf 0 initialisiert werden sollen.) Für W95/98 usw. gab es dieses Problem nicht, weil dort lpSecurity_Attributes anders (einfacher) behandelt wurde. Also zusammengefasst, die Deklaration von CreateFile muss so ausschauen:

Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, _

                                  ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _

                                  ByVal lpSecurityAttributes As Long, _

                                  ByVal dwCreationDisposition As Long, _

                                  ByVal dwFlagsAndAttributes As Long, _

                                  ByVal hTemplateFile As Long) As Long

und die Aufrufe so:

DeviceHandle = CreateFile("\\.\CompuLABusb_0", GENERIC_WRITE, _

                 FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)

 

Dann geht's."

Für diese fundierten Informationen ganz herzlichen Dank! Folgende VB-Beispiele wurden entsprechend angepasst:

Ansteuerung des USB-Port: port.zip
Ansteuerung des USB-Port-2: port2.zip
10-Kanal-Messung mit dem CompuLAB-USB: clab10.zip
Software-Download und Ansteuerung des AD-Wandlers beim EZ-USB: vbserusb.zip


3. Kann man beim USB-Port den Sink-Strom einstellen?

Man kann, aber nur an einem einzelnen Pin, nämlich Port 1.3. Diese Eigenschaft ist sozusagen ein vergessenes Überbleibsel des Thermometerbeispiels von Cypress, aus dem die Firmware entwickelt wurde. Sie soll hier als die einzige bisher undokumentierte Eigenschaft des USB-Port und der CompuLAB-USB vorgestellt werden, weil viele Anwender danach gefragt haben. Die vielen möglichen Anwendungen sind in Elektor 1/02 für den USB-UART beschreiben wurden. Der USB-UART wurde speziell für Elektor ebenfalls aus dem Cypress-Thermometer entwickelt. und kann alle Portströme steuern. Leider kann mit dem USB-Port von Modul-Bus nur ein Ausgangsstrom gesteuert werden, dafür ist der Baustein preiswerter.

Ein Portpin P1.3 liefert im LOW-Zustand einen einstellbaren Sink-Strom zwischen 4,8 mA uns 15 mA. Diese Eigenschaft ist für die softwareseitige Steuerung der Helligkeit von LEDs vorgesehen. Man kann aber auch andere Dinge damit anfangen, z.B. einfache 4-Bit-DA- oder AD-Wandler aufbauen. Das VB-Beispiel Port2 wurde um einen Schieberegler für diesen Strom erweitert. Der Strom an P1.3 kann nun in 15 Stufen verstellt werden.

Private Sub HScroll1_Change()

  sFileName = "\\.\CompuLABusb_0"

  lIn = 14 + 256 * HScroll1.Value 'Isink P1.3

  lInSize = 2

  lOutSize = 1

  hgDrvrHnd = CreateFile(sFileName, GENERIC_WRITE Or GENERIC_READ, FILE_SHARE_WRITE _

         Or FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0)

  lTemp = DeviceIoControl(hgDrvrHnd, 4&, lIn, lInSize, lOut, lOutSize, lSize, gOverlapped)

  htemp = CloseHandle(hgDrvrHnd)

End Sub

Die erweiterte Software Port2.vbp (port2.zip, 3 KB, berichtigt 10.12.02)

Übrigens können Besitzer des CompuLAB-USB diese Funktion ebenfalls verwenden. Ein Test mit dem Programm Port2 zeigt es: Zwar kann man mit diesem Programm nicht auf die Ports zugreifen, aber die grüne LED am CompuLAB-USB lässt sich in der Helligkeit verstellen. Diese Eigenschaft ist nicht für äußere Verbraucher nutzbar, aber vielleicht fühlte sich ja jemand stark geblendet ...


4. Gibt es genauere Informationen zum Aufbau des Treibers?

Der Treiber für das CompuLAB-USB wird auch für den USB-Port verwendet. Ein erster Treiber wurde in dem Buch "MSR mit USB" ( www.b-kainka.de/msrusb.htm) beschreiben. Das entsprechende Kapitel 7 zur Treiberentwicklung soll hier zum freien Download angeboten werden, damit z.B. auch Linux-Programmierer eine Chance haben, die Bausteine anzusprechen.

Treiber.pdf (48 KB)

Der jetzt aktuelle Treiber ist übrigens gegenüber dem im Buch noch einmal weiter entwickelt worden und basiert auf dem Beispieltreiber des EZUSB von der Cypress-Homepage. Damit hat man die Möglichkeit, mehrere Geräte am USB anzumelden. Wie man solche Erweiterungen programmieren kann, zeigt der umgebaute Treiber für das USB-Thermometer auf der Homepage des Autors: www.b-kainka.de/usbdrv.htm


5. Geht es auch mit LabView?

Dr. Uli Wannek hat die Systemaufrufe der kernel32.dll aus dem VB-Programm in Labview eingebunden, um den Portbaustein anzusprechen. Hier sein Demoprogarmm: usb-demo.llb (usb-demo.zip, 74 KB)


Weitere Informationen zum Thema:

Informationen und Software zum Serai-USB: www.ak-modul-bus.de/technik/serusb.html
Neueste Software zum Serai-USB: www.hjberndt.de/soft/seraiusb.html
EZ-USB-Download in VB: www.ak-modul-bus.de/technik/ezusb.html
USB-Informationen und Literatur: www.b-kainka/usb.htm


Zurück zur Startseite der MB-News
Zurück zur Startseite AK-Modul-Bus