Joystick mit ein PIC

Begonnen von ^Cobra, 12.01.2026, 10:14:28 CET

Vorheriges Thema - Nächstes Thema
Joystick

^Cobra

Guten morgen,

ich habe mich (mal wieder) mit den Gedankten beschäftigt mir ein Joystick zu bauen.
Nicht weil es unbedingt nötig wäre sodern viel mehr aus Intresse.
Ich habe dazu mich im NEtz nun bisschen umgeschaut.

Natürlich ist sowas Möglich. Keine Frage. Doch das wie ist entscheident.
Um es Einfach zu halten, suchte ich nach Möglichkeiten sowas recht einfach in ein Win11 Rechner zu intigrieren.
Dafür bin ich nun auf folgendes gestoßen:
vJoy                       - Software für die Erzeugung eines viuellen Joysticks
vJoySerialFeeder  - "Treiber" um die Seriellen Daten (USB TO Serial Converter) auf die Achsen bzw. Knöpfe                                     des virtuellen Joysticks zu mappen
IBUS-Protokoll      - Der Treiber  vJoySerialFeeder enthält bereits fertige Protokolle. Das IBUS ist eins                                        davon. Das Protokoll hat diesen Aufbau:
00x20
Protokoll-Länge (fix 32 Bytes)
10x40
Befehlscode (0x40 für Steuerdaten)
2 - 3Kanal 1 (L / H)Wert 1000 bis 2000 (Little Endian)
4 - 5Kanal 2 (L / H)Wert 1000 bis 2000
.........
28 - 29Kanal 14 (L / H)Wert 1000 bis 2000
30 - 31Checksumme16-Bit Checksumme (Little Endian)

AntiMicroX            - Softeware um durch drücken der Knöpfe Tasten Kombis zu nutzen

Nun habe ich also reichlich an Lesestoff, um zu überlegen wie das ganze umzusetzen wäre.
Meine erste Überlegung dazu: Das Pic Programm soll weitestgehend in C geschrieben werden. Einfach aus dem Grunde das viele Assembler nicht mehr anfassen wollen :D . Da ich mit C selbst kaum Erfahrung habe, wird das für mich eine Große Aufgabe werden.
Eventuell erzeugen wir ja eine (gute) alternative zu den Arduino Lösungen.

Da mein anderes Projekt (PV Steuerung) ebenfalls noch läuft, wird es zwar nur Lansam weiter gehen, aber ich glaube habe ein neues Ziel vor den Augen und freue mich auf Anteilnahme.

Gruß
Cobra

Peter

Versuch es mal hier: Link
Im Suchfeld Joystick eingeben. Da findest du einiges an Projekten und
dazu gehörige Software in verschiedenen Sprachen.
Vielleicht hilft es dir weiter.

^Cobra


^Cobra

Ich war ein bisschen fleißig.

Ich habe (in C *Stolz bin*) ein Programm geschrieben der den Comport mit 19200 aktiviert und auch immer wieder das gesamte Telegram schickt. 
Mit mein Windows Porgramm kann ich auch diese Telegramme sehen. 

Leider sagt der vJoySerialFeeder "Serial Port Read Timeout" . Es scheint also irgendetwas nicht IBUS Komform zu sein, dass das die Daten, die ankommen nicht genommen werden. Schade :P . Versuche nun also herrauszufinden was hier Falsch läuft. Die erste Idee, dass die Checksumme Falsch gebildet wird, kann ich (so glaube ich zumindest) ausschließen da ich einmal es nach gerechnet habe und auf das gleiche Ergebnis kam. (Es sei natürlich das ich selbst ebenfalls falsch gerechnet habe :D ). Was mir aufgefallen ist: Die Channels, die ich nicht benutzt (Derzeit) hatte ich in der Header Datei auf 1000 gesetzt, dies wurde aber anscheinend nicht genommen. Nun werden diese in Main auf 1000 geschrieben. 

Wenn einer noch eine Idee hat,, gerne her damit. 

Gruß
Cobra 

^Cobra

Nachtrag: Fehler gefunden, die Checksumme errechnet sich Byteweise, nicht Word weise.
Ich habe FFFF- Channel immer gerechnet. Man muss aber FFFF- Lowbyte von Channel und - Highbyte vom Channel rehcnen und das Natürlich von allen channels. 

Ich habe Testweise ein Analoges Signal (Achse Z) und ein Channel als Taster(Schalter) gemacht und diese entsprechend beschaltet. 
Nach dem Kalibrieren in dem vJoyFeeder war das Analoge Signal wirklich von 0-100% :) Dann noch den vJoy Device Kalibriert, und schon passte es auch da. 
Mein Port für die Schalter wird durch die Testplatine auf High gezogen und beim drücken auf Low gelegt, somit kommt es erstmal so an als ob die Taste die ganze Zeit gedrückt ist. Man kann aber auch im vJoy Feeder das ganze invertieren um es "richtig rum" zu haben. 
Nächster Test: Den vJoy Device in MSFS2020 für eine Funktion nutzen. (erstmal ohne Tasten Kombi sondern reine Joystick Tasten). 

^Cobra

Es ist vollbracht. Ein kurzer Test zeigte: Ich konnte mit mein PIC das Licht beim FLugzeug ein und ausschalten :D . 
Jetzt muss das ganze "nur" noch Hübsch gemacht werden und dann könnte mann...  8)

pic18

gute Arbeit, möchtest Du das Programm vorstellen? Ich überlege, wie man mit Windows ein C - Programm zum Laufen bekommt, welchen C-Compiler man nimmt. Mit Linux sehe ich da kein Problem, da ist alles vorhanden. 

^Cobra

Sicher kann ich den auch diesen Stand mal zeigen.
Seit aber nachsichtig: Ist mein erstes C Programm.
MPLAB 5.35 und XC8  Compiler wurden genutzt.

Sagt mir mal, was man besser machen könnte usw. :)

Es ist wiegesagt der erste Test und noch nicht alles "fertig" gedacht. ( Daher kam bis jetzt noch nichts Online).
Aber eventuell macht es durchaus Sinn, jetzt mal zu drüber zu Sprechen ob das so "Zukunft" hat.

Gruß
Cobra

^Cobra

Jetzt ist mir ein (verrückter) Gedanke gekommen: Daten wie Höhe,Speed,Kurs usw. Vom Simulator zum Pic schicken um auf 7segment anzeigen es z.b. anzeigen zu lassen. 

Das wird aber wesentlich komplexer da der vjoyserialfeeder das nicht unterstützt. Die sauberste Lösung wäre es ein Windows Programm zu schreiben welches den vjoyserialfeeder enthält für den Empfang und dann zusätzlich die andere Seite.
Leider sind meine Erfahrungen mit programmieren von Anwendungen sehr eingeschränkt.... Kann das einer von euch rein zufällig?

pic18

Ich habe mal kurz das Prog. überflogen. Mir ist hier aufgefallen, dass der Kommentar hier falsch ist,
Zitat
TRISAbits.TRISA2 = 1; // RB0 als Eingang (für INT0)
hier beim Ausgang muss es LAT heißen falls Du einen Pic18 hast, ansonsten stimmt PORTB.bits
PORTBbits.RB5 = 0;    // LED aus
LATBbits.RB5 = 0;    // LED aus

hier sollte es so heißen
    INTF = 1; // Flankenerkennung auf steigender Flanke für INT0 (RB0)
    INTE = 1;  // INT0 Interrupt aktivieren

INTCON.INTF = 1; // Flankenerkennung auf steigender Flanke für INT0 (RB0)
 INTCON.INTE = 1;  // INT0 Interrupt aktivieren

hier sollte es so heißen
    TMR0 = 0; // Timer0 zurücksetzen
    T0IE = 0; // Timer0 Interrupt aktivieren (muss auch in INTCON/PIE1)

INTCONbits.TMR0 = 0; // Timer0 zurücksetzen
INTCOMbits.T0IE = 0; // Timer0 Interrupt aktivieren (muss auch in INTCON/PIE1)


in COM_PORT.c sollte noch SPBRGH initialisiert werden

^Cobra

Danke dir fürs drüber schauen!

Die Interrupt Routine war nur ein Test und ist Auskommentiert (zumindest die Routine selbst, die Init mit den TRISA usw. habe ich tasächlich vergessen....)

PIC16F690, somit gibts kein LAT ;) 
Interessant das es INTCONbits.TMR0 usw heißen soll, denn der Test hatte funktioniert... :o
Aber okay, werde ich ändern (wenn es noch nötig wird das einzubauen, im Moment glaube ich das nicht mal :P

Der letzte Hinweiß, SPBRGH noch zu initialisieren, ist ein guter Hinweiß, den habe ich völlig übersehen das es den gibt :P
 
Ich habe das Analoge Ergebnis noch zweimal nach rechts geschoben, nun passt das Format besser. :) 

pic18

Zitat von: ^Cobra in 02.02.2026, 20:48:47 CETdenn der Test hatte funktioniert
wundert mich, dass es funktioniert hat. Must schal schauen, ob sich das INTCON Byte auch wirklich ändert, wenn Du nur TMR0 = 0 schreibst. Ich arbeite ja mit dem alten C-18 Compiler, hier ist das beim PIC 18F4685 so hinterlegt:

extern volatile near unsigned char       INTCON;
extern volatile near union {
  struct {
    unsigned RBIF:1;
    unsigned INT0IF:1;
    unsigned TMR0IF:1;
    unsigned RBIE:1;
    unsigned INT0IE:1;
    unsigned TMR0IE:1;
    unsigned PEIE_GIEL:1;
    unsigned GIE_GIEH:1;
  };
  struct {
    unsigned :1;
    unsigned INT0F:1;
    unsigned T0IF:1;
    unsigned :1;
    unsigned INT0E:1;
    unsigned T0IE:1;
    unsigned PEIE:1;
    unsigned GIE:1;
  };
  struct {
    unsigned :6;
    unsigned GIEL:1;
    unsigned GIEH:1;
  };
} INTCONbits;


^Cobra

Bin erstaunt, es wurde 9 Mal runter geladen aber bis auf pic18 sind alle zufrieden und haben keine Anmerkungen  :P 
Ich bin am schauen welche Telemetrie Daten ich zurück schicke und was ich damit dann anstelle. 
Wird noch spannend.

picass


Herbert X

Hallo auch ich lese mit damit ich eventuell
irgendwan mal ein bischen C besser verstehe
und Anwenden kann.

LG. Herbert

^Cobra

Hallo Herbert,
freut mich ,wenn ich helfen kann. Meine c Erfahrung sind aber sehr eingeschränkt. Ob sich mein Code zum 'verstehen' eignet weiß ich nicht.

Gruß 
Cobra 

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

🡱 🡳