Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable externe a envoyé sur microcontroleur

Programme en langage C doit communiquer avec le Microcontroleur

Sujet résolu
    13 décembre 2014 à 13:10:55

    Bonjour à tous, 

    Pour mon projet de licence, je dois créer un programme qui suit une balle, donc le montage est une webcam qui elle est même est montée sur deux moteur (Un pour l'axe horizontal et l'autre vertical) et ces deux moteurs sont raccordé à un microcontrôleur PIC18F8722 de Microchip.

    J'ai bien sur la liaison USB avec Pick it 3.

    Donc actuellement, le programme coté pc (en C) me fournis les coordonnées de la balle, mais le soucis c'est que je souhaite du Programme PC envoyé un variable vers le microcontrôleur pour qui gère lance ou éteint les moteurs, mais malheureusement, j'ai cherché sur internet et les sur docs, je n'ai pas trouvé (ou peut être j'ai cherché avec les mauvais termes)

    Pouvez-vous m'aider ??

    Je vous remercie d'avance.

    -
    Edité par yalpha 10 janvier 2015 à 12:43:34

    • Partager sur Facebook
    • Partager sur Twitter
      13 décembre 2014 à 15:14:16

      Aider moi svp :'( :'(

      -
      Edité par yalpha 13 décembre 2014 à 15:14:29

      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2014 à 21:21:21

        La sonde PitKit 3 permet de reprogrammer et debugger le PIC.

        Elle n'est pas prévue pour être utilisée comme moyen de communication.


        Pour dialoguer, je te conseille d'utiliser une liaison série.

        Coté PIC, c'est donc l'UART (ou l'USART) et les pins TX/RX qu'il te faut utiliser.

        Tu peux ensuite connecter les pins TX/RX au PC à l'aide d'un adaptateur Serial FTDI USB.

        Avec ça, tu vas te retrouver avec un port COM ajouté au PC.

        Libre à toi de développer ensuite un programme PC qui envoie les données sur le port COM.

        Si tu connais Qt, tu as la lib QextSerialPort qui fait ça très bien.

        • Partager sur Facebook
        • Partager sur Twitter
          18 décembre 2014 à 10:55:01

          Salut, merci de ta réponse, mais j'ai également un module série/usb
          • Partager sur Facebook
          • Partager sur Twitter
            18 décembre 2014 à 21:12:05

            Enfaite mon soucis, j'ai du mal expliqué plus haut :(

            En faite, j'envoi des informations sur mon port com,  ou il y a branché le serial to usb, lui même brancher sur le microcontrôleur.

            Mais pour récupérer les informations sur le microcontrôleur, c'est ici que je bloque :( 

            • Partager sur Facebook
            • Partager sur Twitter
              18 décembre 2014 à 22:05:07

              Sur les microcontrôleurs, le(s) périphérique(s) chargé(s) de gérer des ports COM s'appellent UART (ou un nom équivalant).

              Dans le cas d'un PIC18F8722, il s'agit de EUSART.

              Pour en apprendre d'avantage, tu peux lire la datasheet, page 249.

              Si tu n'aimes pas manipuler directement les registres, tu peux aussi chercher une lib sur google, ça doit forcément existé.

              -
              Edité par lorrio 18 décembre 2014 à 22:06:10

              • Partager sur Facebook
              • Partager sur Twitter
                18 décembre 2014 à 23:04:20

                UART, c'est noté je vais cherché de ce coté là, je te tiens au courant :)

                Merci :)

                • Partager sur Facebook
                • Partager sur Twitter
                  10 janvier 2015 à 11:56:38

                  Bon voila j'ai trouvé, si ça peu aidé quelqu'un :)

                  Alors voila coter programme PC il faut faire ça :

                  #include <windows.h>
                  #include <winbase.h>
                  #include <stdio.h>
                  #include <conio.h>
                  #include <string.h>
                  
                  int main() {
                  
                  /* CONFIGURATION DU PORT SERIE */
                  
                      // Declaration des variables nécessaire au port série
                      HANDLE hSerial;
                      DCB dcbSerialParams = {0};
                      COMMTIMEOUTS timeouts = {0};
                  
                      // Ouverture du port
                      printf("Ouverture du port en cours...");
                  
                      //Choix du port série (COM 4 dans notre cas)
                      hSerial = CreateFile("COM4", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
                  
                      //Verification d'invalidité du port série
                      if (hSerial == INVALID_HANDLE_VALUE)  //Verification du bon fonctionnement
                      {
                              printf(stderr, "Erreur invalide\n");
                              return 1;
                      }
                  
                      // Paramètres (9600 baud, 1 bit de start bit, 1 bit de stop bit, Pas de parité)
                      dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
                  
                      //Recuperation des informations du port série
                      if (GetCommState(hSerial, &dcbSerialParams) == 0)  //Verification du bon fonctionnement
                      {
                          printf(stderr, "Erreur de recuperation des informations du port COM\n");
                          CloseHandle(hSerial);
                          return 1;
                      }
                  
                      //Paramètres
                      dcbSerialParams.BaudRate = CBR_9600;    //Vitesse de la communiquation en baud
                      dcbSerialParams.ByteSize = 8;           //Taille du bit
                      dcbSerialParams.StopBits = ONESTOPBIT;  //Bit de stop
                      dcbSerialParams.Parity = NOPARITY;      //Parité
                  
                      //Envoi des parametres
                      if(SetCommState(hSerial, &dcbSerialParams) == 0) //Verification du bon fonctionnement
                      {
                          printf(stderr, "Erreur parametrage port COM\n");
                          CloseHandle(hSerial); //Fermeture du port série
                          return 1;
                      }
                  
                  
                      //Timeout
                      if(SetCommTimeouts(hSerial, &timeouts) == 0)  //Verification du bon fonctionnement
                      {
                          printf(stderr, "Erreur d'envoi de parametres du timeout\n");
                          CloseHandle(hSerial); //Fermeture du port série
                          return 1;
                      }
                  
                      //Format des données
                      DWORD bytes_written, total_bytes_written = 0;
                  
                  
                  //ENVOI INFORMATION :
                  char
                  bytes_to_send[1]; //Le 1 signifie le nombre de donnée a envoyé
                  bytes_to_send[0] = 'd'; //AXE Y HAUT
                                                          
                  //ENVOI + VERIFICATION DES BITS VERS LE MICROCONTROLEUR
                                                          if(!WriteFile(hSerial, bytes_to_send, 1, &bytes_written, NULL))
                  
                  //LE  1 dans if(!WriteFile(hSerial, bytes_to_send, 1, &bytes_written, NULL)), correspond au nombre de donnée à envoyé
                                                          {
                                                              fprintf(stderr, "Erreur\n");
                                                              CloseHandle(hSerial);
                  return 1;
                                                          }
                  
                  CloseHandle(hSerial); //fermeture du port
                  
                  return 0;
                  /* FIN DE DIVERS */
                              }
                  



                  Et coter microcontrôleur (Dans mon cas, le PIC18F8722 de Microship) :

                  #include <xc.h>
                  #include <plib/timers.h>
                  #include <time.h>
                  #include <GenericTypeDefs.h>
                  #include <p18f8722.h>	//Choix du Microcontroleur
                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <pwm.h> //Bibliothèque pour la MLI (PWM)
                  #include <usart.h> //Bibliothèque du Port Série (EUSART)
                  #include <timers.h> //Bibliothèque des Timers
                  #include <delays.h> //Bibliothèque des Delays
                  #include <string.h> // Bibliothèque des Chaînes de caractères
                  
                  //Il est possible que certains include ne servent a rien, mais j'ai pas encore vérifie ça.
                  
                  
                  
                  //*** DEFINE *** (Pour mes led, c'est pas important pour vous)
                  #define LED0 LATDbits.LATD0
                  #define LED1 LATDbits.LATD1
                  #define LED2 LATDbits.LATD2
                  #define LED3 LATDbits.LATD3
                  #define LED4 LATDbits.LATD4
                  #define LED5 LATDbits.LATD5
                  #define LED6 LATDbits.LATD6
                  #define LED7 LATDbits.LATD7
                  
                  
                  
                  //***Déclaration des fonctions***//
                  void CommandeMoteur(void);
                  
                  //***Déclaration des variables & pointeurs***//
                  char info1; //Variable 1 pour moteur 1
                  //ATTENTION VOUS POUVEZ EN UTILISER QU'UNE SEULE SI VOUS LE SOUHAITE, DANS MON CAS J'EN AVAIS BESOIN DE DEUX
                  
                  
                  //*******FONCTION***********//
                  void CommandeMoteur(void) {
                          LATD = 0b00000000;
                  
                          if (DataRdy1USART()) { //PERMET DE VERIFIER LA COMMUNICATION
                              info1 = getc1USART(); //RECUPERER LES DONNES
                  
                              if (info1 == '1') { //ET CEST PARTI POUR LA VERIFICATION ! ATTENTION VOUS POUVEZ AUSSI CHANGER LE FORMAT?
                                  LED0= 1;//Haut
                          
                              }
                  
                  
                          }
                  }
                  
                  /*******FIN FONCTION***********/
                  
                  
                  void main() {
                      //ENTREE ANALOGIQUE EN MODE DIGITAL
                      ADCON1bits.PCFG = 0b1111;
                      //PORT D EN SORTIE
                      TRISD = 0;
                      //RB0 EN ENTREE (BOUTON POUSSOIR)
                      TRISBbits.TRISB0 = 1; //Ligne RB0 en entrée (Bouton Poussoir)
                      //RA5 EN ENTREE
                      TRISAbits.TRISA5 = 1;
                      //ETEINT TOUTE LES LED
                      //LATD = 0b00000000;
                  
                  TRISB = 0x00;
                  PORTB = 0x00;
                  
                      //BOUCLE INFINI
                      while (1) {
                  
                  
                  	Open1USART( USART_TX_INT_OFF &
                  				USART_RX_INT_OFF &
                  				USART_ASYNCH_MODE &
                  				USART_EIGHT_BIT &
                  				USART_CONT_RX &
                  				USART_BRGH_HIGH,
                  				32 );
                          Delay10KTCYx(10);
                  
                          CommandeMoteur();
                  
                      }
                  
                  }


                  Si vous avez un soucis, n'hésiter pas à me contacter, je vous aiderai avec plaisir :)

                  -
                  Edité par yalpha 13 janvier 2015 à 22:12:46

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 janvier 2015 à 14:03:57

                    Coté micro, je ne pense pas que ce soit une bonne idée de faire Open1USART en boucle.

                    Le code devrait plutôt être :

                    void main() {
                     
                        Open1USART( USART_TX_INT_OFF &
                                    USART_RX_INT_OFF &
                                    USART_ASYNCH_MODE &
                                    USART_EIGHT_BIT &
                                    USART_CONT_RX &
                                    USART_BRGH_HIGH,
                                    32 );
                    
                        while (1) {
                            Delay10KTCYx(10);
                            CommandeMoteur();
                     
                        }
                     
                    }



                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 janvier 2015 à 11:08:15

                      Si je le met en dehors de la boucle, bizarrement je ne reçoit plus d'informations :/
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 janvier 2015 à 12:04:52

                        Arf, c'est plutôt étrange comme problème.

                        Eh bah laisse le dans la boucle alors :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 janvier 2015 à 0:47:48

                          C'est pas ton code complet que tu as mis ici, non ? Parce que le code ci dessus ne modifie pas TRISD, qui vaut 0xFF au démarrage du PIC, donc tout en entrée. du coup je vois mal comment tu pourrais voir quoi que ce soit sur ta LED. Et du coup, si tu as supprimé ça, tu n'aurais pas aussi supprimé les accès à TRISC, qui pourraient expliquer que tu ne lis plus rien sur l'UART 1 ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          64kB de mémoire, c'est tout ce dont j'ai besoin
                            13 janvier 2015 à 22:14:49

                            Oui il n'est pas complet, car mon code est très long et n'a pas vraiment avoir avec ceci. J'avais peur qui si quelqu'un recopie le code pour le tester, s'emmêler les pinceaux avec du surplus.

                            J'ai modifié le code avec les lignes manquante :)

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Variable externe a envoyé sur microcontroleur

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown