Ich habe mich auf das Gebiet "USB" gewagt, indem ich mir ne einfache Testplatine für den PIC18F4550 gebaut und mich mit den Tutorials und Demos von Microchip beschäftigt habe. Dabei hab ich zunächst eine virtuelle serielle Schnittstelle als CDC-Class aufgebaut, die wunderbar läuft.
Nun wollte ich ein HID-Device versuchen und das Summensignal meiner Modellbaufernsteuerung auf ein USB-Gamepad umlegen.
Die Routine zur Aufteilung des Summensignals in Einzelsignale liegt in einem Interrupt, erfolgt mit dem CCP1-Modul und hat eine Laufzeit von 2,6µs bei 48MHz. Danach habe ich die Capture-Werte in einem Integer-Array mit 7 Elementen.
Die Funktion dieses Codeteils hab ich bereits mit der CDC-Firmware getestet, die Daten werden sauber eingelesen.
Jetzt habe ich die HID Demo genommen und den Summensignal-Code integriert, den HID-Report-Descriptor umgeschrieben, sodass die Platine als Joystick mit X, Y, Z-Achse, Rotation um Rx, Ry, Rz und einem Slider erkannt wird, und die Daten mit 16bit übertragen werden.
Mit USBlyser kann ich nachvollziehen, dass alles richtig erkannt wird. Ebenso sagt Windows Vista, dass es genau der Controller ist.
Hier beginnt das Problem. Die Daten werden regelmäßig per Interruptrequest abgeholt. In dem Moment, wo ich den Sender anstöpsel (Summensignal mit 5V Pegeln, Masse verbunden, Signal an RC2, Platine USB-powered), kann ich sehen, dass die Daten übertragen werden, aber schon sehr bald (zwischen 1 und 10sek) nachdem ich den Sender aktiviere und die Sticks bewege, friert der Controller scheinbar ein, es gibt keine USB-Übertragung mehr.
Ich bin etwas ratlos, was es sein könnte oder wie man es beheben könnte.
Hier nochmal meine modifizierte Main-Routine. Der Rest stammt aus der "USB Device - HID - Joystick - C18 - PIC18F Starter Kit 1" Demo. Verändert wurde noch der Descriptor, sodass das System mit anderen Hebeln/Slidern benutzt werden kann. Vorsicht, durch die Microchip Kommentare ist es sehr langatmig. Ich habe die YourHighPriorityISRCode Funktion modifiziert, sowie meine Input_Capture() hinzugefügt.
Problem gelöst. Scheinbar war das gesteckte Kabel, was den Modellbausender mit der Platine verbunden hat, das Problem. Scheinbar haben winzige Wakelkontakte oder so den Controller einfrieren lassen. Ich habe das Kabel kurzerhand verlötet und habe seitdem keine Probleme mehr mit abstürzen.
Nach einingem Hin und Her und probieren mit den Deskriptoren klappt die Geschichte nun auch recht gut. Ich habe mich etwas eingearbeitet und schon stand das erste USB-Device. Also kein Grund mehr Angst vor USB zu haben (solange man sich an vorbereitete Klassen hält, die keinen Treiber brauchen).
Lesezeichen