VUSB: Software-USB für AVRs

von Ralf Beesner, DK5BU                      
Elektronik-Labor   Projekte   AVR 




Serielle Schnittstellen an PCs sterben so langsam aus. Man muss sich daher zunehmend mit gängigen USB-Seriell-Wandlern behelfen. Es gibt aber auch eine reine Software-Lösung: Ein kleines Unternehmen aus Österreich (www.obdev.at) entwickelte eine USB-Library für AVR-Mikrocontroller, stellte sie unter die GPL und kümmert sich beständig um die Weiterentwicklung. In dem bereitgestellten Softwarepaket sind einige Beispiel-Implementierungen enthalten und auf der Website befinden sich Links zu weiteren Projekten, die mit dieser Library geschaffen wurden. Leider ist der Code nicht in Bascom, sondern in C geschrieben. Einige VUSB-Projekte lassen sich jedoch gut in eigene Bascom-Projekte einbinden, wenn man die Aufgabe auf zwei Mikrocontroller verteilt.


AVR-Ressourcen


Da das USB-Protokoll recht aufwendig und zeitkritisch ist, bindet die Library einen großen Teil der AVR-Systemressourcen und benötigt einen relativ hohen Controller-Takt. Auch muss z.B. sichergestellt sein, dass die Interrupts des USB-Systems Priorität haben.

Der USB stellt zwar 5 V Betriebsspannung zur Verfügung, die beiden USB-Datenleitungen arbeiten aber mit 3,3 V Pegel. In den Schaltungsvorschlägen wird daher entweder die Spannung auf den Datenleitungen mit 3,6 V-Z-Dioden begrenzt oder die gesamte Schaltung mit 3,3 V betrieben, indem man die 5 V durch zwei Si-Dioden oder eine rote LED um etwa 1,5 V herabsetzt (im letzteren Fall sollte laut Datenblatt der Controllertakt nicht wesentlich mehr als 12 MHz betragen). 

Die älteren VUSB-Implementierungen erfordern den Betrieb mit einem Quarztakt von 12 MHz, in den neueren Versionen sind auch einige höhere Taktraten wie z.B. 18 oder 20 MHz zulässig, und besonders interessant ist eine Variante für AtTiny 45 und 85, die mit 16,5 MHz "peripheral clock" (PCK) arbeitet. Der Takt für die Timer wird dann mit der selten verwendeten PLL-Schaltung dieser AtTinys erzeugt, die aus 8,25 MHz des internen RC-Oszillators zunächst die achtfache Frequenz (also 66 MHz) gewinnt und diese auf den  gewünschten Takt herunterteilt (in diesem Falle auf 16,5 MHz, die doppelte Frequenz des RC-Oszillators).

Wegen der eigentlich zu geringen Genauigkeit des RC-Oszillators wird bei Start des AtTiny-Programms zunächst eine Synchronisation mit dem USB-Takt vorgenommen und der RC-Oszillator über das OSCCAL-Register feinabgeglichen. Man spart sich so nicht nur den Quarz, sondern gewinnt auch zwei der knappen IO-Pins.





Virtuelle HID-Keyboards

Unter den auf http://www.obdev.at/products/vusb/projects-de.html vorgestellten Projekten fand ich besonders die Lösungen interessant, die ein HID-Keyboard emulieren. Anders als gängige USB-Seriell-Wandler können sie direkt in PC-Anwendungsprogramme (z.B. eine Textverarbeitung oder eine Tabellenkalkulation) hineinschreiben.  Man benötigt also kein Terminalprogramm, das einlaufende Daten erst einmal in eine Datei schreibt, die man dann weiterverarbeiten kann, und man muss auch keine eigene PC-Software entwickeln, die sich mit einem virtuellen COM-Port "unterhält", sondern der Mikrocontroller erzeugt Tastendrücke, die beliebige PC-Programme bedienen können.

Obwohl ich keine Ahnung von C habe, konnte ich einige C-Programme minimal verändern und sie für das Zusammenspiel mit eigenen Bascom-Projekten "aufwerten". Da es sich um GPL-Software handelt, sind nicht nur die geänderten Quelltexte, sondern das komplette jeweilige Originalpaket beigefügt. In jedem Paket gibt es ein HEX-File, so dass man die Software nutzen kann, wenn man keinen AVR-GCC istalliert hat. 



Update 17.9.12: in den AtTiny45- Schaltbildern waren die beiden USB- Datenleitungen vertauscht



Slideshow Presenter

Der Slideshow Presenter dient dazu, bei einem Vortrag eine Powerpoint-Präsentation oder ein PDF weiter-oder zurückzublättern. Er hat nur zwei (oder drei) Tasten, die über ein längeres Kabel oder eine Infrarot-bzw. Funkstrecke angebunden sind, so dass man sich bei einem Vortrag vom Notebook entfernen kann (und auch nicht versehentlich auf eine falsche Taste der Notebook-Tastatur drückt). 

Eine RC5-Infrarot-Strecke lässt sich recht einfach mit zwei Attiny 13 und Bascom realisieren -siehe  Infrarot.html
 





Auf der Website http://blog.flipwork.nl/?x=entry:entry100224-003937 ist die Originalschaltung "4-Key-Keyboard" beschrieben. Mit vier Tastern an einem Attiny 45 lassen sich die Tastendrücke "1" bis "4" an den PC senden.

Ich habe einen Taster weggelassen (er hängt am Reset und man müsste den Reset "wegfusen", um den Pin zu nutzen) und den Sourcecode minimal geändert. Auf den drei verbleibenden Eingängen liegen nun die Signale für "Bild auf" (an PB4), "Bild ab" (an PB3) und "F9" (an PB1). Die  Taster (bzw. der Bascom-Mikrocontroller) müssen die Pins jeweils gegen Masse ziehen.




EasyLogger

Der Easylogger ist eines von Obdevs Beispielprojekten; es ist ebenfalls mit einem AtTiny 45 realisiert. Ein ADC-Eingang (PB3) wird etwa im Sekundentakt abgefragt. Der ADC-Wert wird mit 2,5 multipliziert, mit einem Return abgeschlossen und als Tastendruck an den PC gesendet. Die  Werte können z.B. in eine Spalte eines Tabellenkalkulationsblatts direkt untereinander geschrieben werden; in den Nachbarspalten kann man dann mit diesen Werten allerlei Berechnungen anstellen. Als Spannungsreferenz wird die interne 2,56V-Referenz des AtTiny verwendet. Aufgrund der Multiplikation mit 2,5 erfolgt die Messwert-Ausgabe in mV-Schritten von 0 mV ... 2560 mV.

Ein Eingangspin (PB1) erzeugt den Start-Stop-Impuls, wenn er gegen Masse gezogen wird. Ein Ausgangspin (PB4) zeigt an, ob der Logger aktiv ist. Will man das Messintervall auf einen anderen Zeittakt ändern, muss man den C-Quellcode ändern und den Controller neu flashen.

Durch meine kleine Änderung des Quellcodes wird pro Startimpuls nur ein einziger Messwert erzeugt. Den Startimpuls kann man mit einem Timer-IC  oder einem weiteren Mikrocontroller und einem kleinen Bascom-Programm erzeugen und so das Messintervall in weiten Bereichen einstellbar machen (z.B. über ein Mäuseklavier oder eine serielle Schnittstelle). Es ist  auch möglich, das Messintervall in Abhängigkeit von externen Ereignissen zu verändern.

Einige Schaltbeispiele erläutern, wie man den Messbereich des Easyloggers auf eine höhere Spannung (25 V) erweitert, den Stromfluss durch einen Widerstand in eine Messpannung umsetzt (der Operationsverstärker verstärkt die Spannungsdifferenz um den Faktor 10, so dass an dem Messwiderstand nur max. 256 mV abzufallen brauchen) oder eine Temperaturmessung mit dem LM335 durchführt (da er 10 mV Ausgangsspannung pro Kelvin liefert, also bei Zimmertemperatur ca 3 V, wird die Spannung auf die Hälfte geteilt, damit sie in den Messbereich des ADC fällt).







EasyLogger mit zwei Kanälen

Sparkfun http://www.sparkfun.com vertreibt einen leicht veränderten EasyLogger unter dem Namen AVR-Stick. Die dort erhältliche Software fragt zwei ADC-Kanäle ab und gibt nach dem ersten Wert einen TAB aus; nach dem zweiten Wert ein RETURN. Auf diese Weise kann man z.B. in einem Tabellenkalkulationsblatt zwei Zahlenkolonnen "herunterschreiben" lassen.

Ich habe auch diese Version so abgeändert, dass über einen Startimpuls an PB2 ein einzelner Messzyklus gestartet wird, es werden PB3 und PB4 abgefragt.
 


Terminal-Keyboard

Die universelle Lösung für Bascom-User ist das Terminal Keyboard von Neil Stockbridge: 

http://www.obdev.at/products/vusb/prjdetail.php?pid=82
bzw.
http://hobby-electrons.sourceforge.net/projects/terminal-keyboard/

Mit ihm kann man (fast) beliebige Signale als Tastatureingaben an ein PC-Programm senden. Einziger Schönheitsfehler: Das Terminal Keyboard ist für amerikanische Tastaturen  programmiert. Es setzt ASCII-Zeichen in Tastaturcodes um. Die PC-Tastaturcodes sind jedoch an die Lage der Taste auf der Tastatur gebunden, nicht an die Bedeutung der Taste. Diese wird erst durch den (deutschen oder amerikanischen) Tastaturtreiber festgelegt. Daher sind bei Nutzung an einem deutschsprachigen PC Y und Z vertauscht, statt Semikolon und Doppelpunkt erscheinen Umlaute, statt Minus ein Slash usw.

Ich habe daher versucht, die Tabelle, in der die ASCII-Werte in Tastaturcodes umgesetzt werden, für deutsche Tastaturen abzuwandeln. Bei den meisten Zeichen hat das geklappt; auf der Strecke geblieben sind folgende exotische Zeichen, die auf der deutschen Tastatur in Verbindung mit der Alt-Gr-Taste eingegeben werden:  '@`{|}~ \

Die beiden Zeichen  [  und  ]  funktionieren jedoch. Das Zeichen  [  ist wichtig, weil es für Escape-Befehle verwendet wird, mit denen man den Cursor manipulieren kann.

Damit kann man mikrocontrollergesteuert in Kalkulationsblättern herumnavigieren, also z.B.  mehrere Spalten in einer Zeile nacheinander ausfüllen und dann an den Anfang der nächsten Zeile springen, statt nur simpel eine vertikale Zahlenkolonne herunterzuschreiben.

Escape ist das Zeichen <0x27>. Mit den Zeichenfolgen <Escape>[A  bis  <Escape>[D  wird der Cursor um ein Zeichen nach oben, unten, rechts und links bewegt.

Die Zeichenfolgen  <Escape>[5  bis  <Escape>[8  erzeugen die Signale PgUp, PgDwn, Home, End. 

Falls der RS232-Eingang nicht benötigt wird, kann ein TTL-Signal über einen Schutzwiderstand von 1 kOhm bis 10 kOhm direkt auf Pin 2 des AtTiny2313 gegeben werden.

Die Geschwindigkeit des seriellen Eingangs beträgt beim Original-Code 57600 bit/s; ich habe sie in der deutschen Version auf 9600 bit/s herabgesetzt, da 9600 bit/s gebräuchlicher sind und für die meisten Zwecke ausreichen dürften.






Flashen der AtTinys

Da die Software unter der GPL steht, habe ich die Pakete komplett beigefügt. Für den, der sie nicht selbst kompilieren kann, ist in den 3 Paketen jeweils im Unterordner "firmware" ein HEX-File enthalten, das direkt in den Mikrocontroller gebrannt werden kann.

Unter AVRdude.html  ist beschrieben, wie man die Hardware des LP Mikrocontroller mit dem Kommandozeilentool avrdude.exe programmieren und umfusen kann.

Das erforderliche Fusebyte lautet für den AtTiny45: lfuse=0xe1 , es aktiviert die PLL.

Der komplette Aufruf lautet:
avrdude.exe -p t45 -c burkhard -P com1 -U lfuse:w:0xe1:m

Das erforderliche Fusebyte lautet für den AtTiny2313: lfuse=0xff , es aktiviert den Quarzoszillator.

Der komplette Aufruf lautet:
avrdude.exe -p t2313 -c burkhard -P com1 -U lfuse:w:0xff:m

Download: vusb-gpl-soft.zip


Elektronik-Labor   Projekte   AVR