mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gamecube Controller auslesen


Autor: gamecube (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 :)

Autor: gamecube (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine idee?

könnte es an den negativen spannungsspitzen liegen?

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gamecube (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gamecube (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
for(;;)
{
  wdt_reset();
  usbPoll();

  if(usbInterruptIsReady() && reportCount < 2)
  { /* we can send another key */
    buildReport();
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }
  checkButtonChange(); // <- hier wird der controller für 400µS gefragt
  timerPoll();
}

eigentlich solte die reihenfolge ja egal sein?

Autor: gamecube (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gamecube (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.