Gamoover

Forums " WORKSHOP" => Jamma, cablages, contrôleurs, interfaces & hacks => Microcontrôleurs et électronique => Discussion démarrée par: Iro le Mercredi 21 Janvier 2015, 16:12:11 PM

Titre: PIC18F2550 et gamepad
Posté par: Iro le Mercredi 21 Janvier 2015, 16:12:11 PM
Hello,
J'ai trouvé sur le net , un schéma de pad USB à base de PIC18F2550 avec les sources (microchip)
Il fonctionne correctement à une chose prêt : Il est en autofire.
L'appui long d'un bouton répète l'action au lieu de ne le faire qu'une fois.

1ére chose qui m'étonne, c'est que ce ne soit pas gérer de base. A moins que le source que j'ai récupéré ai été modifié. Il est ici (http://www.gamoover.net/redacteur/Iro/Krayt-Pad/Krayt-Pad.zip)


Après quelques recherches sur le net et réflexions, il faudrait "bypasser" ou faire un "delay" pour ne pas prendre en compte le même appui précédent. Mais je suis totalement noob sur le sujet et finalement paumé  :-\

Savez vous comment faire pour résoudre ce problème ou connaissez vous un site qui explique le fonctionnement d'un pad USB ?

Merci <:)
Titre: PIC18F2250 et gamepad
Posté par: sushy18 le Mercredi 28 Janvier 2015, 23:50:22 PM
salut iro,
en regardant "USB HID Protocol" comme ici :

http://www.rennes.supelec.fr/ren/fi/elec/docs/usb/hid.html

tu aura les infos que tu veux ? ou tu recherche un truc spécifique aux pad 18f2550 et 18f4550 ?
Titre: PIC18F2250 et gamepad
Posté par: Iro le Jeudi 29 Janvier 2015, 08:18:35 AM
Je jette un oeil et te dis <:)
Mais rapidos, c'est plutôt une info sur le fonctionnement d'un gamepad dont j'ai besoin.
Je pense sur la temporisation des validations de touches, dans la boucle principale (USB_POLL ?)
A mon avisu mon probléme n'est pas spécifique au PIC
<:)
Titre: PIC18F2250 et gamepad
Posté par: sushy18 le Jeudi 29 Janvier 2015, 13:27:22 PM
la rémanence des touches l'est pour toute les entrées ?
tu as le schéma ou le .hex ?
Titre: PIC18F2250 et gamepad
Posté par: Iro le Vendredi 30 Janvier 2015, 07:22:07 AM
Il me semble .. Je vais vérifier.
Tout est disponible ici
http://cytron.com.my/p-pr26
<:)
Titre: PIC18F2250 et gamepad
Posté par: f4brice le Vendredi 30 Janvier 2015, 08:20:41 AM
Dans la partie "variable", tout en haut du source, ajouter :

BYTE waitRelease = 0xFF;

Juste avant la fonction "void Emulate_Joystick(void)", ajouter cette fonction :



static BYTE checkButtonPressed(BYTE buttons, BYTE maskButton, BYTE maskHid)
{
  if( buttons&maskButton )
  {
     /* button is not pressed */
     waitRelease |= maskButton;
  }
  else
  {
     /* button is pressed */
     if( waitRelease&maskButton )
     {
        waitRelease &= ~maskButton;
        return maskHid;
     }
  }

  return 0;
}




Et enfin replacer ça :



//button 1:up1 button 2:right1 button 3:down1 button 4:left1
//button //button 5:start button 6:select button 7:b_5 button 8:b_6
hid_report_in[5]=0x00; //initialized all button as 0

if (ConfBoutonNormal == TRUE)
     {if(!b_1)hid_report_in[5] |=0x01; //if b_1 is pressed, send report to button and set bit0 as 1
   else hid_report_in[5] &=0xFE; //if not, clear bit0 to 0
 if(!b_2)hid_report_in[5] |=0x02; //if b_1 is pressed, set bit1 as 1
  else hid_report_in[5] &=0xFD; //if not, clear bit1 to 0
 if(!b_3)hid_report_in[5] |=0x04; //if b_1 is pressed, set bit2 as 1
   else hid_report_in[5] &=0xFB; //if not, clear bit2 to 0
     if(!b_4)hid_report_in[5] |=0x08; //if b_1 is pressed, set bit3 as 1
else hid_report_in[5] &=0xF7;} //if not, clear bit3 to 0
   else
    {if(!b_1)hid_report_in[5] |=0x08; //if b_1 is pressed, send report to button and set bit0 as 1
   else hid_report_in[5] &=0xF7; //if not, clear bit0 to 0
 if(!b_2)hid_report_in[5] |=0x01; //if b_1 is pressed, set bit1 as 1
  else hid_report_in[5] &=0xFE; //if not, clear bit1 to 0
 if(!b_3)hid_report_in[5] |=0x02; //if b_1 is pressed, set bit2 as 1
   else hid_report_in[5] &=0xFD; //if not, clear bit2 to 0
     if(!b_4)hid_report_in[5] |=0x04; //if b_1 is pressed, set bit3 as 1
else hid_report_in[5] &=0xFB;} //if not, clear bit3 to 0


if(!b_8)hid_report_in[5] |=0x10; //if select is pressed, set bit4 as 1
else hid_report_in[5] &=0xEF; //if not, clear bit4 to 0
if(!b_7)hid_report_in[5] |=0x20; //if start is pressed, set bit5 as 1
else hid_report_in[5] &=0xDF; //if not, clear bit5 to 0
if(!b_6)hid_report_in[5] |=0x40; //if b_6 is pressed, set bit6 as 1
else hid_report_in[5] &=0xBF; //if not, clear bit6 to 0
if(!b_5)hid_report_in[5] |=0x80; //if b_5 is pressed, set bit7 as 1
else hid_report_in[5] &=0x7F;


par ça :



  hid_report_in[5] = 0x00;
  if( ConfBoutonNormal )
  {
      /* Ordre 1234 */
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x01, 0x01);  //b1
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x02, 0x02);  //b2
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x04, 0x04);  //b3
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x08, 0x08);  //b4
  }
  else
  {
      /* Ordre 4123 (NeoGeo) */
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x01, 0x08);  //b1 reported as b4
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x02, 0x01);  //b2 reported as b1
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x04, 0x02);  //b3 reported as b2
      hid_report_in[5] |= checkButtonPressed(PORTB, 0x08, 0x04);  //b4 reported as b3
  }

  hid_report_in[5] |= checkButtonPressed(PORTB, 0x10, 0x80);  //b5
  hid_report_in[5] |= checkButtonPressed(PORTB, 0x20, 0x40);  //b6
  hid_report_in[5] |= checkButtonPressed(PORTB, 0x40, 0x20);  //b7
  hid_report_in[5] |= checkButtonPressed(PORTB, 0x80, 0x10);  //b8


On peut faire plus propre, mais là je dois aller au taf...  ;)
Titre: PIC18F2250 et gamepad
Posté par: Iro le Vendredi 30 Janvier 2015, 08:28:09 AM
Merci  :-)= :-)=
Je test dés que possible !!

EDIT : L'ordre qui te parait chelou est pour inverser logiciellement les boutons :D
Pour passer de 1234 à 4123 pour une disposition Neogeo
Titre: PIC18F2250 et gamepad
Posté par: f4brice le Vendredi 30 Janvier 2015, 19:31:24 PM
Citation de: Iro le Vendredi 30 Janvier 2015, 08:28:09 AM
EDIT : L'ordre qui te parait chelou est pour inverser logiciellement les boutons :D
Pour passer de 1234 à 4123 pour une disposition Neogeo

Dans ce cas, c'est bon !
Je pensais que la notion d'inversion faisait passer de 1234 à 4321...
Titre: PIC18F2250 et gamepad
Posté par: Iro le Vendredi 30 Janvier 2015, 20:17:35 PM
J'ai reprogrammé le PIC avec la modif mais les touches ne sont plus détectées
Voici la modif
http://www.gamoover.net/redacteur/Iro/Krayt-Pad/main.c

Merci <:)
Titre: PIC18F2250 et gamepad
Posté par: BigPanik le Vendredi 30 Janvier 2015, 22:58:24 PM
pour moi y a juste à mettre en commentaire la ligne
Citationhid_report_in[5]=0x00;   

BP
Titre: PIC18F2250 et gamepad
Posté par: Iro le Samedi 31 Janvier 2015, 08:09:44 AM
OK je tente <:)
Titre: PIC18F2250 et gamepad
Posté par: sushy18 le Samedi 31 Janvier 2015, 09:19:51 AM
BIG PANIC , F4brice. ... il manque liodel et de ce post il va en ressortir un .hex aux petits oignons  =:))
Titre: PIC18F2250 et gamepad
Posté par: Iro le Samedi 31 Janvier 2015, 10:37:21 AM
Bon maintenant, c'est tous les boutons qui sont appuyés :D
C'est impératif de mettre à blanc à ce niveau non ? Sinon le programme garde en mémoire les précédentes touches .
Titre: PIC18F2250 et gamepad
Posté par: f4brice le Samedi 31 Janvier 2015, 14:06:42 PM
Pour moi, le "hid_report_in[5]=0x00;" est important car sinon le PIC va envoyer n'importe quoi au PC...

Je viens de simuler mon bout de code en python :


waitRelease = 0xFF
def checkButtonPressed(button, maskButton, maskHid):
  global waitRelease
  if button&maskButton:
    waitRelease |= maskButton
  else:
    if waitRelease&maskButton:
      waitRelease &= ~maskButton
      return  maskHid
  return 0


print "cas 1=%s" % checkButtonPressed(0xFF, 0x01, 123)
print "cas 2=%s" % checkButtonPressed(0xFE, 0x01, 123)
print "cas 3=%s" % checkButtonPressed(0xFE, 0x01, 123)
print "cas 4=%s" % checkButtonPressed(0xFE, 0x01, 123)
print "cas 5=%s" % checkButtonPressed(0xFF, 0x01, 123)



Et voici le résultat :

(https://gamoovernet.pixhotel.fr/pics_gamoovernet890px/20150131140029-f4brice-a.png) (https://gamoovernet.pixhotel.fr/pics/20150131140029-f4brice-a.png)


Mon bout de code fait ce qui est prévu : signaler l'appui du bouton uniquement la première fois qu'il est détecté.
Le bouton doit être relaché puis à nouveau appuyé pour être signalé en USB.
Titre: PIC18F2250 et gamepad
Posté par: Iro le Dimanche 01 Février 2015, 11:56:34 AM
Ok, je vais essayer de voir ce qui se passe avec la simulation de proteus
<:)
Titre: PIC18F2550 et gamepad
Posté par: Iro le Vendredi 20 Février 2015, 21:01:13 PM
Bon, à force de creuser , on trouve (je suis dans ma période minecraft :D)

C'était bien un anti-rebond qu'il fallait appliquer. Et à force de lire des sources et des explications, j'ai trouvé la fonction. Qui d'ailleurs revenaient régulièrement.

C'est un délai (en milliseconde) qu'il faut appliquer avant chaque lecture des inputs, dans la boucle principale

while(1)
    {
          ........
          ........
          ........
          DelayMs(50) ;
          LectureInput(); 
          ........
          ........
    }
   
J'ai essayè avec 50ms car c'était la valeur qui revenait. Cela a l'air de fonctionner plutôt bien en règle générale mais j'ai l'impression que c'est un peu poussif avec les appuis répétitif comme l'Electric Thunder de Blanka par exemple. Je vais réduire le délais et voir si il sort plus facilement.

Le header et le C sont dispo ici (http://www.gamoover.net/redacteur/Iro/DelayMS.zip) pour ceux que cela intéresse

<:)
Titre: PIC18F2550 et gamepad
Posté par: supernono le Samedi 21 Février 2015, 01:50:27 AM
je compatis  ;D ;D ;D

je suis en train d'expérimenter de mon coté avec PIC18F2550 + PICBASIC PRO (compileur)

le plus pénible c'est le hid descriptor  :-(( :-(( :-((

j'aimerais monter un guidon pour ma mamecab avec au moins 3 axes analogiques (direction gaz et frein)et quelques boutons (start action etc)

Titre: PIC18F2550 et gamepad
Posté par: Iro le Samedi 21 Février 2015, 08:59:08 AM
Je vais y venir car maintenant il faut que je puisse brancher 2 interfaces en même temps :D
Si jamais ce que tu fais n'est pas à but pédagogique, je peux te filer ce que j'ai fait :)
Titre: PIC18F2550 et gamepad
Posté par: supernono le Samedi 21 Février 2015, 13:19:48 PM
merci iro pour la proposition mais je travail avec un compilateur basic et il me semble que tu travail en "C" j'ai regardé les sources du gamepad CYTRON PR26 et je n'y ai pas compris grand chose !!!

je me suis monté un pcb de test pour étudier j'ai réussi a faire un gamepad 4 axes + boutons ainsi qu'un joystick

maintenant je voudrais utiliser "motorcycle simulation device" sous "simulation control" dans hid descriptor tool (DT) (http://www.usb.org/developers/hidpage#HID%20Descriptor%20Tool) mais je butte sur le descripteur pour le moment