Auteur Sujet: PIC18F2550 et gamepad  (Lu 3243 fois)

Hors ligne Iro

  • Alias le Rouston Masqué
  • Staff
  • Dieu de l' Arcade
  • *****
  • Messages: 100286
  • Localisation: Chilly Mazarin
  • 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
    • Hardcore Gamer
    • *
    • Messages: 1786
    • Localisation: Bourges/Paris
    • 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: 100286
    • Localisation: Chilly Mazarin
    • 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
    • Hardcore Gamer
    • *
    • Messages: 1786
    • Localisation: Bourges/Paris
    • 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: 100286
    • Localisation: Chilly Mazarin
    • 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: 4090
    • Localisation: Besançon (prononcez "B'zançon")
    • « 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: 100286
    • Localisation: Chilly Mazarin
    • 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: 4090
    • Localisation: Besançon (prononcez "B'zançon")
    • « 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: 100286
    • Localisation: Chilly Mazarin
    • 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: 3098
    • Localisation: Carrières Sur Seine (78)
      • 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: 100286
    • Localisation: Chilly Mazarin
    • 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
    • Hardcore Gamer
    • *
    • Messages: 1786
    • Localisation: Bourges/Paris
    • 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: 100286
    • Localisation: Chilly Mazarin
    • 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: 4090
    • Localisation: Besançon (prononcez "B'zançon")
    • « 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: 100286
    • Localisation: Chilly Mazarin
    • 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: 100286
    • Localisation: Chilly Mazarin
    • 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