Forum: Mikrocontroller und Digitale Elektronik Gamecube Controller auslesen


von gamecube (Gast)


Angehängte Dateien:

Lesenswert?

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 :)

von gamecube (Gast)


Lesenswert?

keiner eine idee?

könnte es an den negativen spannungsspitzen liegen?

von Achim M. (minifloat)


Lesenswert?

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

von gamecube (Gast)


Lesenswert?

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?

von gamecube (Gast)


Lesenswert?

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?

von gamecube (Gast)


Lesenswert?

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?

von gamecube (Gast)


Lesenswert?

push :)

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.