Forum: Mikrocontroller und Digitale Elektronik LUFA ohne virtuellen COM Port


von sebi707 (Gast)


Lesenswert?

Hallo,

für ein zukünftiges Projekt möchte ich einen ATmega16U2 einsetzen und 
das USB Interface zum Datenaustausch mit dem PC verwenden. Dabei scheint 
die LUFA Bibliothek ziemlich beliebt zu sein. Da mehrere MB Daten 
zwischen µC und PC ausgetauscht werden, soll es für den PC eine Software 
geben mit der man Lese/Schreibvorgänge starten und in Dateien umleiten 
kann.

Jetzt könnte man natürlich die "Virtual Serial Device" Klasse von LUFA 
nutzen. Da mein PC aber ohnehin schon mit virtuellen COM Ports zugemüllt 
ist habe ich mich gefragt, ob man das nicht auch ohne virtuelle COM Port 
machen kann. Also der µC meldet sich beim Anstecken an den PC als ein 
USB Gerät an und die Software für den PC stellt fest, dass ein 
entsprechend programmierter µC angeschlossen ist und kann sich mit 
Diesem verbinden. Am besten sollte dies direkt mit Standardtreibern 
funktionieren. Kann man so etwas mit dem ATmega16U2 und LUFA 
realisieren?

von sebi707 (Gast)


Lesenswert?

Kennt sich damit niemand aus? Jedes bessere USB Gerät erscheint doch 
heutzutage nicht mehr als virtueller COM Port.

von Stephan B. (matrixstorm)


Lesenswert?

sebi707 schrieb:
> Also der µC meldet sich beim Anstecken an den PC als ein
> USB Gerät an und die Software für den PC stellt fest, dass ein
> entsprechend programmierter µC angeschlossen ist und kann sich mit
> Diesem verbinden. Am besten sollte dies direkt mit Standardtreibern
> funktionieren. Kann man so etwas mit dem ATmega16U2 und LUFA
> realisieren?

Ja, geht - sogar vergleichsweise einfach im Gegensatz zu Standardklassen 
(wie CDC).
Man muss sich halt im Klaren sein, das man auf der Hostseite selbst eine 
Applikation entwickeln darf. Dafuer hat man (fast) beliebige Freiheiten 
im Protokolldesign.
Fuer die Applikation auf Hostseite gibt es libusb.

Die meisten VUSB Projekte machen das (notgedrungen, da lowspeed USB und 
damit kein bulk) so.

Letzter Punkt von http://matrixstorm.com/avr/tinyusbboard/#examples

Nachtrag: Wenn es (unter Windows) komplett ohne Treiber auskommen soll, 
faellt man z.B. auf HID zurueck.

MfG

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

sebi707 schrieb:
> Kennt sich damit niemand aus?

Das Problem ist nicht ganz trivial. "Es soll mit Standardtreibern 
funktionieren" lässt vermuten, dass dir der USB Bus noch nicht so ganz 
klar ist. In der Wikipedia findest du einen recht guten Artikel darüber. 
Lies ihn und überlege dann, welche der Standard Klassen für dich in 
Frage kommt. Dann findest du heraus, welche Funktionen dein Client 
können muss und kannst den Aufwand abschätzen. Und du kannst sehen, ob 
LUFA deine Klasse unterstützt (und wie es geschieht).

von Jim M. (turboj)


Lesenswert?

Jedes USB Gerät braucht einen Treiber. Da gibt es (IMO bessere) 
Alternativen zu VCOM, Google Stichworte: WinUSB, Libusb, Libusb-win32.

WinUSB braucht auch nicht viel mehr als eine .inf Datei auf modernem 
Windows,
ab Win8 kann man das USB Gerät gar so programmieren dass es automagisch 
den WinUSB Treiber lädt (WCID).

Für die höheren Ebene der Software gibt es genügend Beispiele im Netz zu 
finden.

von Chris R. (hownottobeseen)


Lesenswert?

Hi,

je nachdem, wie du es genau vorhast, würde ich dir entweder ein 
Standard-HID oder Mass Storage (bzw. Bulk Transfer) empfehlen. Ersteres 
habe ich selbst schon gemacht und geht relativ einfach, mit letzterem 
habe ich noch keine Erfahrung.

Das Standard-HID ist vergleichsweise einfach, wenn du z.B. ein 
Request-Response-"Verfahren" machst, bekommst du die Anfrage in einer 
Methode, baust den Response zusammen und schickst ihn zurück an den PC. 
Dürfte sogar noch einfacher als ein virtueller COM-Port/CDC sein. 
Weiterer Pluspunkt: Keinerlei Treiber nötig, das Betriebssystem bringt 
alles mit. Nachteil: eher langsam.

Mass Storage dürfte aufgrund von Bulk transfer deutlich schneller sein, 
aber ist vermutlich auch etwas komplizierter, weil du auf dem 
Mikrocontroller etwas mehr machen musst (Dateisystem - wenn man es so 
nennen will - bereitstellen, Dateigrößen vorab berechnen, etc.).

Dann gibt's da noch den reinen Bulk transfer, von dem ich nur weiß, dass 
es ihn gibt und dass er am schnellsten sein dürfte. Wie es genau 
funktioniert kann ich allerdings nicht sagen. In den LUFA-Downloads 
gibt's aber Beispiele.

Noch ein Tipp: in Atmel Studio gibt's ein Plugin für LUFA, das die 
Arbeit etwas erleichtern soll.

Noch ein anderer Tipp: Nimm den Atmega32u2 - der ist unwesentlich teurer 
aber du musst dir deutlich weniger Gedanken über Speicher machen. (Tipp: 
Lass den DFU-Bootloader drin, der ist kompakt, gut und stört bei 32KByte 
nicht wesentlich!)

HTH

Chris

Edit: Würde dir gerne ein Beispiel geben, darf es allerdings nicht, da 
es eine Auftragsarbeit war... :/

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Chris R. schrieb:
> entweder ein
> Standard-HID oder Mass Storage (bzw. Bulk Transfer) empfehlen. Ersteres
> habe ich selbst schon gemacht und geht relativ einfach, mit letzterem
> habe ich noch keine Erfahrung.

Keine Erfahrung mit Mass Strorage, aber trotzdem eine Empfehlung? WTF?

USB Mass Storage macht man i.A. nur, wenn da auch wirklich ein 
Massenspeicher wie eine SD Karte am µC dran hängt. Weil da noch SCSI 
dazwischen liegt, ist das nämlich recht kompliziert.

Bulk Transfer nimmt man, wenn einem die max. 64kB/sec bei Full Speed von 
HID nicht reichen. Viele Protokolle wickeln darüber ihnen Datenverkehr 
ab, z.B. VCOM oder auch Mass Storage. Das kann man mittels WinUSB oder 
LibUSB direkt benutzen.

von sebi707 (Gast)


Lesenswert?

Ok erstmal Danke für alle Antworten. Über die verschiedenen USB Klassen 
hab ich mal so grob drüber geguckt. Mass Storage scheint mir auch eher 
was zu sein Falls es um mehrere Dateien geht. In meinem Fall gibt es nur 
einen Datensatz der vom µC zum PC oder umgekehrt übertragen wird. HID 
hatte ich übersprungen, da ich dachte, dass es nur für Eingabegeräte 
ist. Werde ich mir nochmal genauer anschauen.


Stephan B. schrieb:
> Fuer die Applikation auf Hostseite gibt es libusb.

Und wie sieht es auf der Deviceseite aus? Gibts da ein Stichwort für USB 
Geräte abseits der Standardklassen?


Chris R. schrieb:
> Noch ein anderer Tipp: Nimm den Atmega32u2

Hab ich gestern auch gesehen. Die Software für den µC ist zwar abgesehen 
von dem USB Kram so einfach wie es fast nur geht aber mehr Speicher kann 
nie Schaden.

von Stephan B. (matrixstorm)


Lesenswert?

sebi707 schrieb:
> Und wie sieht es auf der Deviceseite aus? Gibts da ein Stichwort für USB
> Geräte abseits der Standardklassen?

Dafuer gibt es, wie du bereits angefordert hast, LUFA.
Statt Deviceklassen (Logik die auf einen bis vielen Endpunkten 
aufsitzt), nimmst du einfach "pure" Endpunkte (z.B. Bulk oder gar 
isochron) als "bitpipes".

Eine sehr grobe Analogie zu den Endpunkte sind die Portadressen aus der 
Netzwerkwelt.

MfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.