Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Bus USB sur PIC24FJ64GB002



  1. #1
    Neilack

    Question Bus USB sur PIC24FJ64GB002

    Bien le bonjour !

    J'aimerais réaliser un bus USB qui me permettrais d'envoyer un caractère sur un notpad, le but final étant de commander un lecteur video par le biais de raccourci.
    Seulement mon problème est l'utilisation de la librairie fournie par Microchip dans son mla2015. J'ai voulu utiliser l'example "HID-keyboard" et le modifier.
    Voilà comment je me suis pris:
    -j'ai selectionner le pack exemple pour la board de développement (kit p24F) et ai modifier les define pour introduire le <p24fj64gb002>
    -dans les pragma (systeme.c), je l'ai ai modifier pour le composant p24fj64gb002. (je n'ai pas toucher au paramètre d'oscillo)
    -j'ai mis en commentaire tout ce que je n'utilise pas (led.c)
    -inclu le fichier "printrambuffer.h" dans main.c
    -et pour finir appelé la fonction PRINTChar.
    Le programme se compile et se charge sur ma board perso.
    Mais l'ordinateur ne détecte rien...
    J'ai oublié quelque chose ? Je suis à court d'idée...^^'

    coté hardware voici à quoi ressemble ma connexion USB:

    PIC VBUS-------VBUS(fil rouge)
    D- ----------------D- (fil vert)
    D+----------------D+(fil blanc)
    VSS--------------VSS(fil noir)

    VUSB--3v3

    Merci de votre attention !
    Toute idée, commentaire, suggestion son plus que bienvenu.
    le code ainsi que la librairie:
    https://www.sendspace.com/file/9q46lx

    -----


  2. Publicité
  3. #2
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Bonjour,

    Parlons nous bien de cette DevBoard ?
    J'ai du mal à comprendre, le p24fj64gb002 est sur une platine Perso ?
    Quelle est le schéma exacte utilisé ?
    Programmé par quelle Programmeur/Débogueur ?
    Le problème n'est pas forcément soft, la platine fonctionne t-elle avec le clignotement d'un simple led par exemple ?

  4. #3
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    Salut !

    Merci pour ta réponse ! Ca me redonne du peps quand on est à plusieurs sur un projet
    J'utilise une platine perso que j'ai tiré moi même. j'ai effectué plusieurs chose dessus tel que contrôler un moteur, allumer éteindre des leds grâce à une interruption externe ou grâce à un timer (à 1ms à peut prêt).
    Je charge mon programme par un Pickit3, et via MPLAB X.
    Je pense que le probleme est software, là j'ai utiliser un autre exemple du mla, le HID-custom. Vu qu'il utilise un pic24fj64gb004 et qu'il est de la même famille, j'ai juste modifier la clock (passer d'un DIV2 à un DIV8 vu que j'ai un quatrz de 32MHZ) et là mon pc reconnait un module connecté !!! Mais j'ai un message d'erreur comme quoi il n'est pas reconnu...
    Et là j'ai vérifié dans les periphérique connecté et il me dis qu'il n'a tout simplement pas de driver installé. J'ai voulu desinstallé et réinstallé manuelement le driver fourni dans
    mlav2015_05_15\utilities\usb_d rivers\mplab_comm\Windows mais il ne veut rien entendre...
    j'ai aussi utilisé
    mlav2015_05_15\apps\usb\device \utilities\windows_driver_inst aller_tool\bin\winusb_installe r
    mais même chose.


    pour le coté hardware voici le schéma:

    fs1.jpg
    Dernière modification par Antoane ; 28/07/2015 à 19h54. Motif: Rapatriement des PJ sur le serveur du forum

  5. #4
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Plusieurs pistes :
    Sur ton schéma as-tu bien 5V sur ta sortie VBUS ?
    comme l'exemple ci dessous :
    PIC24FJ64GB002.jpg
    Autre piste la déclaration complète comme dans l'exemple du type de périphérique custom.
    Je n'est pas vue ton code car je ne suis pas encore passé sous MPLAB X.

  6. #5
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    Pour les tensions, j'ai bel et bien mes 5V, ce qui veux dire que mon raccord VBUS et VSS sont bon. Dans la datasheet ils conseil de mettre une capa au lieu de resistance, ce que j'ai fait. Mais si c'est ça, ça pourrais rendre le système non reconnaissable ?
    Par contre sur le fil blanc j'ai 2v9.. je vais voir si c'est normal.

    Voilà le fichier de system.c
    Capture.PNG

    j'ai changé aussi les déclaration p24fj64gb004 en 002, mais rien n'a changé.
    A partir de maintenant je vais travaillé depuis le fichier HID-custom et mettre de coté le précédent (HID-keyboard).
    Je vais relire le pdf du mla et voir si j'ai loupé quelque chose.
    Je crois que je vais dessouder D+ et D- et les intervertir pour voir...juste au cas où...

  7. A voir en vidéo sur Futura
  8. #6
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    je n'ai pas trouvé le bouton édit... du coup je m'excuse pour le double post

    Interchanger D+ et D- n'a rien changé, j'ai le même message d'erreur.

    Maintenant ce que je me demande c'est si le problème ne serait pas la clock du système.

  9. Publicité
  10. #7
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Re,

    Je regarde tout cela demain, il et déjà tard.
    Il y à t-il l'ensemble de ton code dans le lien du 1° Post ?
    Le temps de monter une VMWare et installer la version X (Demain)

  11. #8
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    y'a pas l'hid-custom (celui qui donne une erreur de la part de windos)
    Celui dans le premier post il a entre autre le mla-keyboard qu'y ne donne rien, même pas de detection.

    Lien fichier externe supprimé
    voilà le dernier fichier avec tout le mla.
    Pour l'ouvrir dans mplabX faut aller dans mlav2015_05_15\apps\usb\device \hid_custom\firmware
    si tu cherche le system.c, une fois ouvert dans mplabX, c'est dans SourcesFiles>system_config>exp 16>pic24FJ64GB004_pim
    Demain matin je vais regarder ça avec un ami histoire d'avoir un point de vue de plus, on ne sait jamais.
    Dernière modification par Antoane ; 28/07/2015 à 19h57. Motif: Suppression de PJ externe

  12. #9
    Antoane

    Re : Bus USB sur PIC24FJ64GB002

    Bonsoir,

    Pour être conformes à l'épinglé : http://forums.futura-sciences.com/el...-sabonner.html, les pièces jointes doivent être hébergées sur le serveur du forum. Merci de reposter ton fichier en suivant ces consignes.

    Ce message sera supprimé à l'issue.

    Bonne journée.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  13. #10
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    Impossible de les upload sur le forum... j'ai beau supprimer tout ce qui n'était pas nécessaire, le fichier reste trop grand..(48MO)
    Il faudra que tu télécharge la mla v15 /05/2015 sur le site de microchip.
    une fois installé, un conseil fait une copie du dossier, histoire de garder l'original si tu veux réutiliser ça plus tard.
    Voilà les modifs que j'ai fait, d'abord quand tu lance MPLABX, il faut ouvrir le projet situé dans :\mlav2015_05_15\apps\usb\devic e\hid_custom\firmware ensuite faut selectionner en haut le PIC24FJ64GB004_PIM puis dérouler encore et cliquer sur customize. En haut à droite choisir dans device le GB002.
    Pour les modifs:
    -dans Header Files>app>system_config>exp16> pic24fj64gb004_pim>system.h
    Source Files>app>system_config>exp16> pic24fj64gb004_pim>system.c
    Changer #include <p24FJ64GB004.h> pour le GB002
    -Dans system.c mettre la PLL à DIV8 le reste est valable pour le pic24fj64gb002 vu que c'est la même famille
    -Header Files>framework>usb>usb_hal.h, rajouter || defined(__PIC24FJ64GB002__) juste après celui du PIC24FJ64GB004
    - Source Files>bsp>exp16>pic24fj64gb004 _pim, dans buttons.c et leds.c mettre tout les LAT et TRIG en commentaire, ainsi que les boutons.

    voilà

  14. #11
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Dans ce cas il y à des site externe spécialise type Démo OVH et bien d'autre

  15. #12
    RISC

    Re : Bus USB sur PIC24FJ64GB002

    Salut,

    Pour le fichier header du PIC il vaut bien mieux utiliser la syntaxe suivante qui fonctionne pour les 1200 PICs :

    Code:
    #include <xc.h>
    Cette ligne fonctionne bien sûr uniquement pour les compilateus XC (XC8, XC16 et XC32)

    a+
    Ma marotte ? les microcontrôleurs ;=)

  16. Publicité
  17. #13
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Re Neilack,

    Bon il me faut installer l'environnement complet sur une VM propre afin de compiler les différents exemples et je manque de temps pour le moment (j'ai des conflits).
    Je passe la main à ceux en ligne avec leurs environnement à jour sous MPLAB X.
    Je reprendrais le fil, si le problème n'est pas résolut, lorsque j'aurais montée ma machine.
    Ceci dit sous MPLAB IDE 8,90 avec CCS C je n'ai pas rencontré de difficulté avec l'ensemble des fonctionnalités USB.

  18. #14
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    Salut Risc,
    En l'ajoutant dans le header du p24 j'ai des messages d'erreur. Par contre je remarque qu'il est déjà présent dans certain fichier tel que system.c ou encore leds.c
    Je l'ai ajouté dans main.c mais le problème reste inchangé.

    Re Hayac,
    y'a pas de souci, un grand merci d'avoir pu regarder avec moi mon problème, ça m'a permis de le voir sous différent angle

    Aujourd'hui on a tenté de le faire fonctionner sur une autre machine, en installant le driver préalablement, on a aussi testé différent settings de clock, mais rien n'y fait, on a toujours la même erreur "périphérique non reconnu" et quand on regarde dans la liste de matériel, il n'a pas de driver lié au module.
    On a aussi testé l'alimentation, et qu'il y ai assez de courant sur le pic, mais tout est bon de ce coté.

    Demain je reprend à zero, voir si j'ai pas loupé une config ou autre dans le code et faire les choses correctement.

    Quand tu utilise CCS, tu parle des fonctions préenregistré ?
    C'est possible de faire l'usb sur CCS et d'implémenter le reste du travail fait sur XC16 ?

  19. #15
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Bonjour,

    Quand tu utilise CCS, tu parle des fonctions préenregistré ?
    Je parle du compilateur CCS C un compilateur propriétaire que personnellement je préfère à celui de Microchip.
    C'est possible de faire l'usb sur CCS et d'implémenter le reste du travail fait sur XC16 ?
    A ma connaissance non, ou peut être avec une maitrise parfaite de l’assembleur (ce qui n'est pas du tout mon cas) car le processus de compilation à pour fonction de générer l'integralité du programme assembleur injecté dans le MCU.
    Il serait sans doute possible de refondre les deux fichiers générer (je n'en ai aucune idée) mais à ce niveau de maitrise il serait aussi simple de tout écrire en assembleur (Là c'est pour moi une autre planète très loin de mes petites compétences sur le domaine) ...
    A la base du C c'est du C on arrive à si retrouver, après le choix des IDE ainsi que des compilateurs sont vraiment personnel (Présentation, Performance, Organisation du code, Structure même du codage ..., sans oublier le prix )
    Il me semblerait plus judicieux de ne pas mélanger et de rester sur les éléments que tu maitrise le mieux.
    Un autre choix qui ma permis de me décider, à l'époque, était les sources d'information disponible des uns et des autres, les communautés CCS était (ou le sont toujours) de bonne qualité.

    Pour ce qui est des problématiques USB, dans une approche plus informatique, nous retrouvons ce type de défaut lorsque :
    - Les câbles de liaisons sont de mauvaise qualité, trop long ou mal câblé.
    - Le périphérique n'est pas identifier correctement (Partie du code VID PID et autres identification).
    - La base de registre de notre ami WINDOWS est défaillante (Afficher les périphériques cachés et supprimer tous les périf en défaut).
    Un test simple est aussi d'utiliser une autre machine ou autre système afin de lever le doute de OS.

    Cordialement,

  20. #16
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Juste pour infos, ce lien ma bien aider pour mes besoins sur le sujet.
    http://www.usb.org/developers/hidpage/
    Je voulais à l'époque me référencer officiellement pour une interface de type custom HID, j'ai donc dû beaucoup travailler sur le sujet.
    Le projet étant destiner à la commercialisation.

  21. #17
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    Salut !

    L'assembleur c'est sympa pour quelque opération rapide et précise, mais de là à tout me retaper en assembleur...je n'en suis pas capable

    Pour ce qui est des problématiques USB, dans une approche plus informatique, nous retrouvons ce type de défaut lorsque :
    - Les câbles de liaisons sont de mauvaise qualité, trop long ou mal câblé.
    - Le périphérique n'est pas identifier correctement (Partie du code VID PID et autres identification).
    - La base de registre de notre ami WINDOWS est défaillante (Afficher les périphériques cachés et supprimer tous les périf en défaut).
    Un test simple est aussi d'utiliser une autre machine ou autre système afin de lever le doute de OS.
    Après avoir travaillé toute la journée sur cet USB,
    j'ai finalement trouver un fichier hex, avec le code source etc, et vu dans les commentaires qu'il fonctionnait parfaitement. C'est un bootloader, je n'ai pas trés bien compris comment ça fonctionne exactement, mais j'ai décidé d'utiliser ça pour valider mon hardware. Le projet est réalisé sur un PIC24FJ64GB002, je n'ai rien à modifier, il utilise la clock interne avec une PLL.
    Je load sur ma carte, et j'ai toujours la même erreur.
    Du coup je vais suivre les pistes que tu m'a indiqué, et passer sur breadboard. Je vais voir aussi s'il me reste un connecteur usb ou une vieille clé usb et tester ainsi le câble.

    J'étais tombé aussi sur ce lien, mais je ne m'y était pas attardé, pensant que ça ne m'aiderais pas. Je vais regarder ça demain matin.

    Je reposterais avec les résultats de mes test.

  22. #18
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    Salut !
    Je viens au nouvelles

    Alors après avoir placé le tout sur breadboard, en changeant même le cable USB et en utilisant un quartz de 12MHZ....
    Ça fonctionne !!
    Du coup j'ai soit une erreur dans mon code au niveau des config du quartz, soit le câble usb qui est foutu, soit une erreur dans mon schéma.
    Je vais remplacer ces composants sur ma board un par un, jusqu'à trouver le problème exacte.
    Au moins ma board est reconnu et j'arrive à communiquer avec un boatloader.
    Une fois que j'ai trouver le problème sur ma carte, je passe à l'envoi d'un caractère.

  23. Publicité
  24. #19
    HAYAC

    Re : Bus USB sur PIC24FJ64GB002

    Bonsoir,

    Comme toujours, le diagnostique d'une passe par des étapes validé une à une.
    Pour la validation du code, la logique voudrait qu'il soit bon puisqu'il fonctionne sur la breadboard.
    Reste effectivement le câblage et circuit (à comparer avec le montage sur la platine d'essais).
    Et enfin, si le quartz définitif de ton montage n'est pas un 12Mhz, vérifier les déclarations de celui-ci ainsi que le datasheet du PIC24FJ64GB002 afin de procéder aux vérification de compatibilité ainsi qu'au ajustement prescris.

    Bon courage, et merci e nous faire part de tes avancés.

    Cordialement,

  25. #20
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    salut,
    Bon courage, et merci e nous faire part de tes avancés.
    merci à toi !
    Je me dis que vu le temps que j'ai mis à faire des recherches pour trouver la solution à mon problèmes, ça peux aider pour quelqu'un d'autre

    Par contre je reviens vers vous parce que je n'arrive toujours à envoyer un char sur mon notepad...

    alors voilà:
    Une fois que ma carte est enfin reconnu par le pc comme un HID, j'ai fait le test avec l'exemple HID-Custom, avec lequel je peux détecter qu'un bouton est activé. Ensuite j'ai utilisé l'exemple du clavier. J'ai activé dans le software le bouton et même physiquement, mais rien. rien n'est écris. J'ai même utilisé moi même la fonction d'envoi de paquet, mais toujours rien.
    Je pense que je n'utilise pas correctement la librairie ou la fonction.

    si dessous le fichier main.c
    Code:
    // Section: Included Files
    // *****************************************************************************
    // *****************************************************************************
    /* Standard C includes */
    #include <stdint.h>
    
    /* Microchip library includes */
    #include "system.h"
    #include "system_config.h"
    
    #include "usb.h"
    #include "usb_device_hid.h"
    
    /* Demo project includes */
    #include "app_led_usb_status.h"
    #include "app_device_keyboard.h"
    #include "buttons.h"
    
    
    // *****************************************************************************
    // *****************************************************************************
    // Section: File Scope or Global Constants
    // *****************************************************************************
    // *****************************************************************************
    volatile signed int SOFCounter = 0;
    
    
    // *****************************************************************************
    // *****************************************************************************
    // Section: File Scope Data Types
    // *****************************************************************************
    // *****************************************************************************
    
    
    // *****************************************************************************
    // *****************************************************************************
    // Section: Macros or Functions
    // *****************************************************************************
    // *****************************************************************************
    
    int main(void)
    {
        
        //BUTTON_Enable ( BUTTON_S6 );
        SYSTEM_Initialize( SYSTEM_STATE_USB_START );
    
        USBDeviceInit();
        USBDeviceAttach();
        
        while(1)
        {
            SYSTEM_Tasks();
    
            #if defined(USB_POLLING)
            /* Check bus status and service USB interrupts.  Interrupt or polling
             * method.  If using polling, must call this function periodically.
             * This function will take care of processing and responding to SETUP
             * transactions (such as during the enumeration process when you first
             * plug in).  USB hosts require that USB devices should accept and
             * process SETUP packets in a timely fashion.  Therefore, when using
             * polling, this function should be called regularly (such as once every
             * 1.8ms or faster** [see inline code comments in usb_device.c for
             * explanation when "or faster" applies])  In most cases, the
             * USBDeviceTasks() function does not take very long to execute
             * (ex: <100 instruction cycles) before it returns. */
            USBDeviceTasks();
            #endif
            
            
            /* If the USB device isn't configured yet, we can't really do anything
             * else since we don't have a host to talk to.  So jump back to the
             * top of the while loop. */
            if( USBGetDeviceState() < CONFIGURED_STATE )
            {
                /* Jump back to the top of the while loop. */
                continue;
            }
    
            /* If we are currently suspended, then we need to see if we need to
             * issue a remote wakeup.  In either case, we shouldn't process any
             * keyboard commands since we aren't currently communicating to the host
             * thus just continue back to the start of the while loop. */
            if( USBIsDeviceSuspended()== true )
            {
                //Check if we should assert a remote wakeup request to the USB host,
                //when the user presses the pushbutton.
                if(BUTTON_IsPressed(BUTTON_USB_DEVICE_REMOTE_WAKEUP) == 0)
                {
                    //Add code here to issue a resume signal.
                }
    
                /* Jump back to the top of the while loop. */
                continue;
            }
    
          /* Run the keyboard demo tasks. */
            APP_KeyboardTasks();
            
        }//end while
    }//end main
    
    
    
    bool USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, uint16_t size)
    {
        switch((int)event)
        {
            case EVENT_TRANSFER:
                break;
    
            case EVENT_SOF:
                /* We are using the SOF as a timer to time the LED indicator.  Call
                 * the LED update function here. */
                APP_LEDUpdateUSBStatus();
                if(SOFCounter < 32767)
                {
                    SOFCounter++;
                }
                else
                {
                    SOFCounter = 0;
                }
                break;
    
            case EVENT_SUSPEND:
                /* Update the LED status for the suspend event. */
                APP_LEDUpdateUSBStatus();
    
                //Call the hardware platform specific handler for suspend events for
                //possible further action (like optionally going reconfiguring the application
                //for lower power states and going to sleep during the suspend event).  This
                //would normally be done in USB compliant bus powered applications, although
                //no further processing is needed for purely self powered applications that
                //don't consume power from the host.
                SYSTEM_Initialize(SYSTEM_STATE_USB_SUSPEND);
                break;
    
            case EVENT_RESUME:
                /* Update the LED status for the resume event. */
                APP_LEDUpdateUSBStatus();
    
                //Call the hardware platform specific resume from suspend handler (ex: to
                //restore I/O pins to higher power states if they were changed during the 
                //preceding SYSTEM_Initialize(SYSTEM_STATE_USB_SUSPEND) call at the start
                //of the suspend condition.
                SYSTEM_Initialize(SYSTEM_STATE_USB_RESUME);
                break;
    
            case EVENT_CONFIGURED:
                /* When the device is configured, we can (re)initialize the keyboard
                 * demo code. */
                APP_KeyboardInit();
                break;
    
            case EVENT_SET_DESCRIPTOR:
                break;
    
            case EVENT_EP0_REQUEST:
                /* We have received a non-standard USB request.  The HID driver
                 * needs to check to see if the request was for it. */
                USBCheckHIDRequest();
                break;
    
            case EVENT_BUS_ERROR:
                break;
    
            case EVENT_TRANSFER_TERMINATED:
                break;
    
            default:
                break;
        }
        return true;
    }
    
    /*******************************************************************************
     End of File
    */

  26. #21
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    le fichier app_device_keyboard.c, dans lequel se trouve la fonction AppKeyboardTask()
    si vouas avez des idées, ou des remarques n'hésitez pas !
    Fichiers attachés Fichiers attachés

  27. #22
    Neilack

    Re : Bus USB sur PIC24FJ64GB002

    j'ai fini par résoudre le problème !

    Dans la fonction d'envoi, on verifie que le bus est disponible par le biais d'un drapeau (handler), qui n'est jamais remis à zéro !
    Voilà !

    A moi les joystick fait maison ! Les stockages de données d'un simple click ! Et plein d'autre projet !

Sur le même thème :