Hallo :) Ich möchte einen Gamecube-Controller zu USB-Converter bauen, um den Controller am PC anschließen zu können. Dafür setze ich einen ATTiny45 ein. Dieser wird über einen Spannungsregler mit 3,3V versorgt. Das Protokoll habe ich von http://int03.co.uk/crema/hardware/gamecube/gc-control.htm Wie auf dem Bild zu sehen ist, funktioniert die Kommunikation, der linke teil stammt vom tiny, der rechte Teil ist die Antwort des Gamecube-controllers. Das Problem ist nur das einlesen der Werte. Dafür ist die ASM-Funktion ReadControllerByte zuständig. Wenn ich den Controller nicht anschließe, wird das Gerät korrekt als USB-Tastatur erkannt. Sobald ich aber den Controller anschließe, erkennt der PC das Gerät nicht mehr. Der Controller kann sich aber nicht aufgehängt haben, da er immernoch regelmäßig den Controller abfragt. Also muss in der Funktion der Fehler bei "ReadStart" liegen, denn diese Marke wird nur erreicht, wenn der Pin LOW ist (wenn der Controller diesen Pin runterzieht). Zum Protokoll: Bit 1 senden: 1µS LOW, 3µS HIGH Bit 0 senden: 3µS LOW, 1µS HIGH Die Funktion ReadControllerByte läuft zuerst in einer Warteschleife, bis der Controller den Pin auf LOW zieht. Danach wartet die Funktion 2µS (bei 16,5Mhz -> 33 Takte) und fragt dann den Pin ab. Beim 0-Bit sollte das eine 0 sein, beim 1-Bit eine 1. Der Code ist im wesentlichen von 1-Key-Keyboard abgeschrieben, nur an der Funktion buildReport und checkButtonChange habe ich etwas geändert Hoffe, ihr könnt mir da weiterhelfen :)
keiner eine idee? könnte es an den negativen spannungsspitzen liegen?
Zum einen das, zum Anderen benutzt du einen USB-Softwarestack, der sich durch andere Interrupts oder als atomare Operationen geschriebene IO-Funktionen durchaus beirren und aus dem Timing bringen lässt. Hast du noch einen zweiten Tiny da? Dann lass einen Tiny den Gamecube-Controller abfragen und das Ergebnis dieser Abfrage über den UART raus pusten. Den zweiten Tiny lässt du mit dem USB-Client laufen, jedesmal wenn ein neues Byte im Empfangsregister des UART steht, wird eine entsprechende "Taste" der virtuellen Tastatur gedrückt. mfg mf
hm, am liebsten würde ich an der schaltung nichts mehr ändern, da ich sie schon aufgebaut habe :) ansonsten eine gute idee. ich könnte das aber mal auf dem steckbrett aufbauen. ist es eigentlich normal, dass das USB-gerät an einem usb-hub nicht erkannt wird?
Hallo ich habe es nochmal getestet, das abfragen dauert ca 400µS, wenn ich ein 400µS delay einfüge, wird das USB-gerät nicht erkannt. wird das USB-gerät so oft abgefragt? mainloop:
1 | for(;;) |
2 | {
|
3 | wdt_reset(); |
4 | usbPoll(); |
5 | |
6 | if(usbInterruptIsReady() && reportCount < 2) |
7 | { /* we can send another key */ |
8 | buildReport(); |
9 | usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); |
10 | }
|
11 | checkButtonChange(); // <- hier wird der controller für 400µS gefragt |
12 | timerPoll(); |
13 | }
|
eigentlich solte die reihenfolge ja egal sein?
sry für tripplepost, aber es geht jetzt. habe das auslesen in C geschrieben. nun kann ich zeichen zum PC senden, leider nicht die richtigen, da es wohl ein hardware-scancode statt ASCII ist, aber immerhin :) Nun wollte ich die HID-Deskriptoren von V-USB Gamecube/N64 zu USB übernehmen, leider ohne erfolg. (projekt: http://www.raphnet.net/electronique/gc_n64_usb/index_en.php ) mein code sieht bisher so aus: http://codepad.org/rQCSrolL durch das flag USE_OWN kann ich umstellen welcher deskriptor genutzt wird. das USB-gerät wird mit dem anderen deskriptor jedoch nicht erkannt. was ist den jetzt wieder falsch?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.