Auteur Sujet: PIC18F2550 et gamepad  (Lu 2868 fois)

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2550 et gamepad
« 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


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 <:)
« Modifié: Mercredi 11 Février 2015, 14:07:07 pm par Iro »
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne sushy18

  • ✌(◕‿◕)✌ Donateur 2018 Bootlegger de cendrier Dealer de tokens
  • VIP
  • *
  • Messages: 1672
  • Dans l'arcade de pere en fils depuis aout 2014
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #1 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 ?
Si tu ne sais pas demande, si tu sais partage !!
Faudrait pas perdre de vue qu'une borne d'arcade c'est pas une console, c'est rarement plug n play, plus souvent plug n pschitt... (Funkycochise 2008)
"Gratuit ? C'est déjà trop cher !!" ( Crying Freeman 2016)

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #2 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
<:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne sushy18

  • ✌(◕‿◕)✌ Donateur 2018 Bootlegger de cendrier Dealer de tokens
  • VIP
  • *
  • Messages: 1672
  • Dans l'arcade de pere en fils depuis aout 2014
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #3 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 ?
Si tu ne sais pas demande, si tu sais partage !!
Faudrait pas perdre de vue qu'une borne d'arcade c'est pas une console, c'est rarement plug n play, plus souvent plug n pschitt... (Funkycochise 2008)
"Gratuit ? C'est déjà trop cher !!" ( Crying Freeman 2016)

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #4 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
<:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne f4brice

  • ✌(◕‿◕)✌ Donateur 2018
  • Arcade Kingmaster
  • *
  • Messages: 4052
  • « Matériel inconnu ? Touche à ton cul ! »
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #5 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...  ;)
« Modifié: Vendredi 30 Janvier 2015, 19:36:24 pm par f4brice »

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #6 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
« Modifié: Vendredi 30 Janvier 2015, 10:40:54 am par Iro »
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne f4brice

  • ✌(◕‿◕)✌ Donateur 2018
  • Arcade Kingmaster
  • *
  • Messages: 4052
  • « Matériel inconnu ? Touche à ton cul ! »
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #7 le: Vendredi 30 Janvier 2015, 19:31:24 pm »
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...

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #8 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 <:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne BigPanik

  • Hi-Score Buster
  • *
  • Messages: 3057
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #9 le: Vendredi 30 Janvier 2015, 22:58:24 pm »
pour moi y a juste à mettre en commentaire la ligne
Citer
hid_report_in[5]=0x00;   

BP

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #10 le: Samedi 31 Janvier 2015, 08:09:44 am »
OK je tente <:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne sushy18

  • ✌(◕‿◕)✌ Donateur 2018 Bootlegger de cendrier Dealer de tokens
  • VIP
  • *
  • Messages: 1672
  • Dans l'arcade de pere en fils depuis aout 2014
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #11 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  =:))
Si tu ne sais pas demande, si tu sais partage !!
Faudrait pas perdre de vue qu'une borne d'arcade c'est pas une console, c'est rarement plug n play, plus souvent plug n pschitt... (Funkycochise 2008)
"Gratuit ? C'est déjà trop cher !!" ( Crying Freeman 2016)

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #12 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 .
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne f4brice

  • ✌(◕‿◕)✌ Donateur 2018
  • Arcade Kingmaster
  • *
  • Messages: 4052
  • « Matériel inconnu ? Touche à ton cul ! »
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #13 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 :


  • cas 1 : le bouton n'est pas appuyé => il n'est pas présent dans les données envoyées en USB
  • cas 2 : le bouton est vu appuyé pour la 1ère fois => il est présent dans les données USB
  • cas 3 : le bouton est toujours appuyé => il n'est plus présent dans les données USB
  • cas 4 : idem cas 3
  • cas 5 : le bouton est relaché => toujours pas présent dans les données USB

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.

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2250 et gamepad
« Réponse #14 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
<:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO   

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 17420
  • Iro, chevalier Judaï
    • Voir le profil
PIC18F2550 et gamepad
« Réponse #15 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 pour ceux que cela intéresse

<:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF

LES TUTOS DE GAMO