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

[Projet] EasyPic & boussole HMC6352



  1. #1
    kewee22

    [Projet] EasyPic & boussole HMC6352


    ------

    Bonjour, je travaille actuellement sur un projet électronique où j'ai besoin d'utiliser une carte EasyPic5 et une boussole HMC6352. Mon problème est que je ne dispose pas des notices et que je ne suis pas un grand connaisseur en électronique. Je recherche donc un peu d'aide, des exemples de programmation simple, des conseils etc...

    Mon objetif principal pour l'instant étant de récuperer l'angle de la boussoule dans mon programme.

    Merci de votre contribution.

    -----

  2. Publicité
  3. #2
    BastienBastien
    Invité

    Re : [Projet] EasyPic & boussole HMC6352

    Bonsoir,

    Tu ne précises pas le langage avec lequel tu dois développer ton projet. MikroE fournit un compilateur C, BASIC et PASCAL. Je suppose que tu dois programmer en C (ou en PASCAL ?). Dans les deux cas, il y a plein d'exemples fournis avec le compilateur.

    Pour ce qui est du module de boussole, demande la référence et choppe les spécifications techniques. Tu ne PEUX PAS inventer les spécifications...

  4. #3
    DAUDET78

    Re : [Projet] EasyPic & boussole HMC6352

    J'aime pas le Grec

  5. #4
    kewee22

    Re : [Projet] EasyPic & boussole HMC6352

    Bonjour,

    Je travaille avec MikroC.
    boussole : HMC6352 de Sparkfun // Voicila datasheet
    µc : PIC16F877a sur EasyPic5 // Lien

    Au début, j'ai essayé d'utiliser la librairie fournie avec MikroC : I2C_Library (avec les I2C_init _Start &Co.) mais je n'obtenais pas de réponses précises...
    De plus, il est précisé :
    I²C full master MSSP module is available with a number of PIC MCU models. mikroC provides library which supports the master I²C mode.
    Je n'en sais rien en ce qui concerne le 16F877a

    Voici donc mon programme jusqu'à présent :

    Code:
    /*****************************************************************
    *
    *   Programme  
    *	µC :		PIC16F877A
    *
    
    **********************************************************
    #define FREQ_SIGNAL                  100000    // en Hertz
    
    /***************************************************************
        TYPES UTILISATEUR ET ENUMERATIONS
    ***************************************************************/
    
    typedef unsigned char BYTE;
    
    typedef unsigned int WORD;
    
    typedef enum  { FALSE, TRUE } BOOL;
    
    typedef enum  { PORT_A, PORT_B, PORT_C, PORT_D, PORT_E } PortID;
    
    typedef struct _IOPortConfig {
      unsigned char Broche0  : 1;
      unsigned char Broche1  : 1;
      unsigned char Broche2  : 1;
      unsigned char Broche3  : 1;
      unsigned char Broche4  : 1;
      unsigned char Broche5  : 1;
      unsigned char Broche6  : 1;
      unsigned char Broche7  : 1;
    } IOPort;
    
    typedef union  {
      BYTE mibyValue;
      IOPort miuPort;
    } IOPortConfig;
    
    
    void InitBoussole();
    void StartBoussole() ;
    void repStartBoussole();
    void StopBoussole();
    int  RdBoussole( unsigned char ack );
    unsigned char WrBoussole( unsigned char i2cWriteData );
    unsigned char CommunicationBoussole(unsigned char address, unsigned char data);
    
    unsigned char i=0;
    unsigned char angle=0;
    ///////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////
    
    void main() {
    
    
      OPTION_REG  = 0x80;     // assign prescaler to TMRO
    
      // Configuration du timer TMR0
      // ---------------------------
      TMR0 = 0;
      // Autorisation des interruptions de débordement du timer TMR0
      INTCON.TMR0IE = 1;
    
      // Configuration du timer TMR1
      // ---------------------------
      // Il faut d'abord autoriser les interruptions des périphériques
      INTCON.PEIE = 1;
      // Mise en service du timer TMR1
      T1CON.TMR1ON = 1;
      // Autorisation des interruptions de débordement du timer TMR1
      PIE1.TMR1IE = 1;
      // Configure analog inputs and Vref
      ADCON1 = 0x80;
      // autorise les interruptions par changement d'état du port B
      //INTCON.RBIE = 1;
      // autorise toutes les interruptions non masquées
      INTCON.GIE = 1;
      
      // Initialisation de la Boussole
      // ----------------------------
      InitBoussole();
    
      // On boucle indéfiniment en attendant un événement...
      // ---------------------------------------------------
      do {
      angle = CommunicationBoussole(0x43,0x41);   
      } while (1);
    }
    
    /******************************************************************************************/
    
    unsigned char CommunicationBoussole(unsigned char address, unsigned char data)
     {
       unsigned char c_angle=0;
       StartBoussole();
       WrBoussole(address);
       SSPSTAT.R_W=0;
       WrBoussole(SSPSTAT.R_W);
       repStartBoussole();
       SSPSTAT.R_W=1;
       WrBoussole(SSPSTAT.R_W);
       WrBoussole(0x41);
       c_angle=RdBoussole(0x41);
       StopBoussole();
       return(c_angle);
    }
    
    /******************************************************************************************/
    
    void InitBoussole()
    {
     TRISC         = 1;
     PORTC         = 0xf7;
     SSPCON        = 0x38;      
     SSPCON2       = 0x00;   
     SSPADD        = 50;             
    SSPSTAT.CKE   = 1;     
     SSPSTAT.SMP   = 1;      
    PIR1.PSPIF    = 0;      
     PIR1.BCLIF    = 0;     
    }
    
    
    /******************************************************************************************/
    
    void StartBoussole()
    {
     SSPCON2.SEN=1;
    }
    
    /******************************************************************************************/
    
    void repStartBoussole()
    {
     SSPCON2.RSEN=1;
    }
    
    /******************************************************************************************/
    
    void StopBoussole()
    {
     SSPCON2.PEN=1;
    }
    
    /******************************************************************************************/
    
    int RdBoussole( unsigned char ack )
    {
     unsigned char i2cReadData;
     SSPCON2.RCEN=1;
     i2cReadData = SSPBUF;
    
     if ( ack )
      {
      SSPCON2.ACKDT=0;
      }
     else
      {
      SSPCON2.ACKDT=1;
      }
      SSPCON2.ACKEN=1;              
     return( i2cReadData );
    }
    
    /******************************************************************************************/
    
    unsigned char WrBoussole( unsigned char i2cWriteData )
    {
     SSPBUF = i2cWriteData;
     return ( ! ACKSTAT  ); 
    }
    
    /******************************************************************************************/
    Je suis bien conscient qu'il existe des erreurs dans ma manière de procéder ou de coder. La fonction la plus critique selon moi est la fonction "CommunicationBoussole" où je ne suis absolument pas sûr de la manière de faire. C'est pourquoi j'ai joint la datasheet de la boussole au cas où certains accepteraient d'y jeter un oeil .

    Merci pour votre aide éventuelle.
    Je tiens juste à rappeler que je suis novice dans ce domaine ...

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    marmotte

    Re : [Projet] EasyPic & boussole HMC6352

    Quel est le probleme? si tu as une librairie I2C fournie avec ton compilo, qui en plus supporte le MSSP en mode maitre (configuration a donner a ton PIC) alors tu as tous les outils en mains, suffit de savoir interpreter ta librairie


    Ta boussole communique avec ton µC via le bus I2C, c'est un périphérique esclave.
    Ton PIC doit etre le maitre sur le bus I2C afin d'initier la communication avec la boussole pour en recuperer les données dont tu as besoin (avant toute chose tu dois configurer ton PIC pour le placer en mode I2C maitre, adresse sur 7 ou 10 bits selon les specs de la boussole, sous IT ou non, 100 ou 400kHz, etc...)


    Ensuite suffit de lire la datasheet de la boussole pour determiner si elle necessite une procedure d'initialisation spécifique, une configuration de registre, le format des trames a lui envoyer, etc...

    Tu as vraiment tout le necessaire pour t'en sortir, mais il faut lire les docs, c'est incontournable


    Courage, c'est un projet sympa que tu as la, tu pourras t en sortir relativement rapidement, les docs honeywell sont en général plutot bonnes et agréables a lire.

    Bonne lecture

  9. #6
    kewee22

    Re : [Projet] EasyPic & boussole HMC6352

    Merci pour ta réponse.
    J'avance pas à pas... Au début la librairie fournie avec le compilateur ne marchait pas (compilateur n'était pas à jour). Maintenant je peux utiliser les librairies.

    Mon problème se situe au niveau de la documentation d'Honeywell. Elle est peut-être très bien faite, mais pour les nuls c'est pas évident

    Si quelqu'un pouvait m'indiquer quelles sont mes erreurs :

    I2C_Start();
    I2C_Wr(0x42);
    I2C_Wr(0x43);
    I2C_Stop();
    delay_ms(20000);
    I2C_Start();
    I2C_Wr(0x42);
    I2C_Wr(0x45);
    I2C_Stop();
    I2C_Start();
    I2C_Wr(0x42);
    I2C_Wr(0x4C);
    c_angle=I2C_Rd(0x01);
    I2C_Stop();
    Qu'est ce que je récupère en sortie de mon I2C_Rd ? une valeur en hexa de mon angle ?
    Ce que j'aimerais c'est que ma boussole travaille tout le temps et que je puisse l'interroger n'importe quand pour connaître l'angle.
    J'espère que j'arrive à me faire comprendre ...

    Merci!

  10. Publicité
  11. #7
    Daniel Rivard

    Re : [Projet] EasyPic & boussole HMC6352

    Je trébuche sur les même question que vous , avez-vous trouver réponse a vos question ci oui , pouvez vous me partager la solution s.v.p...
    Si quelqu'un pouvait m'indiquer quelles sont mes erreurs :


    I2C_Start()
    I2C_Wr(0x42)
    I2C_Wr(0x43)
    I2C_Stop()
    delay_ms(100)
    I2C_Start()
    I2C_Wr(0x42)
    I2C_Wr(0x45)
    I2C_Stop()
    I2C_Start()
    I2C_Wr(0x42)
    I2C_Wr(0x4C)
    c_angle=I2C_Rd(0x01)
    I2C_Stop()

Discussions similaires

  1. easypic, pic, C, et mikroC
    Par Mendoza dans le forum Électronique
    Réponses: 11
    Dernier message: 09/03/2011, 10h33
  2. Je cherche a utiliser un Digital Compass le HMC6352.
    Par Daniel Rivard dans le forum Électronique
    Réponses: 0
    Dernier message: 20/02/2007, 01h48
  3. Probléme hex avec easypic 3
    Par joss dans le forum Électronique
    Réponses: 11
    Dernier message: 08/06/2006, 13h52
  4. Besoin d'aide pour projet sur EasyPIC 3
    Par joss dans le forum Électronique
    Réponses: 31
    Dernier message: 27/04/2006, 20h36
  5. [EASYPIC] réalisations
    Par greggreg dans le forum Électronique
    Réponses: 4
    Dernier message: 06/04/2006, 11h28
Découvrez nos comparatifs produits sur l'informatique et les technologies.