probléme de communication entre PIC18f4550 et YG-521 en I2C
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

probléme de communication entre PIC18f4550 et YG-521 en I2C



  1. #1
    invite5905bb4b

    probléme de communication entre PIC18f4550 et YG-521 en I2C


    ------

    Bonjour
    ca fait deux jours que je me bats avec ce montage là je suis a bout de force et je solicite votre aide :
    pic18f4550 + module YG521
    le pic ne le vois pas sur son bus I2C je l ai testé sur arduino et l arduino le detecte donc mon yg521 marche
    voilà mon ti code
    kan j envoi la sequence la variable take qui contien la repense =255 !
    meme si je mets rien sur le bus I2C !

    Code:
    #define MPU6050_ADDRESS 0b11010000 // Address with end write bit
    #define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
    #define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
    #define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
    #define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN
    #define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN
    #define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN
    #define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS
    #define MPU6050_RA_XA_OFFS_L_TC 0x07
    #define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS
    #define MPU6050_RA_YA_OFFS_L_TC 0x09
    #define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS
    #define MPU6050_RA_ZA_OFFS_L_TC 0x0B
    #define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR
    #define MPU6050_RA_XG_OFFS_USRL 0x14
    #define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR
    #define MPU6050_RA_YG_OFFS_USRL 0x16
    #define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR
    #define MPU6050_RA_ZG_OFFS_USRL 0x18
    #define MPU6050_RA_SMPLRT_DIV 0x19
    #define MPU6050_RA_CONFIG 0x1A
    #define MPU6050_RA_GYRO_CONFIG 0x1B
    #define MPU6050_RA_ACCEL_CONFIG 0x1C
    #define MPU6050_RA_FF_THR 0x1D
    #define MPU6050_RA_FF_DUR 0x1E
    #define MPU6050_RA_MOT_THR 0x1F
    #define MPU6050_RA_MOT_DUR 0x20
    #define MPU6050_RA_ZRMOT_THR 0x21
    #define MPU6050_RA_ZRMOT_DUR 0x22
    #define MPU6050_RA_FIFO_EN 0x23
    #define MPU6050_RA_I2C_MST_CTRL 0x24
    #define MPU6050_RA_I2C_SLV0_ADDR 0x25
    #define MPU6050_RA_I2C_SLV0_REG 0x26
    #define MPU6050_RA_I2C_SLV0_CTRL 0x27
    #define MPU6050_RA_I2C_SLV1_ADDR 0x28
    #define MPU6050_RA_I2C_SLV1_REG 0x29
    #define MPU6050_RA_I2C_SLV1_CTRL 0x2A
    #define MPU6050_RA_I2C_SLV2_ADDR 0x2B
    #define MPU6050_RA_I2C_SLV2_REG 0x2C
    #define MPU6050_RA_I2C_SLV2_CTRL 0x2D
    #define MPU6050_RA_I2C_SLV3_ADDR 0x2E
    #define MPU6050_RA_I2C_SLV3_REG 0x2F
    #define MPU6050_RA_I2C_SLV3_CTRL 0x30
    #define MPU6050_RA_I2C_SLV4_ADDR 0x31
    #define MPU6050_RA_I2C_SLV4_REG 0x32
    #define MPU6050_RA_I2C_SLV4_DO 0x33
    #define MPU6050_RA_I2C_SLV4_CTRL 0x34
    #define MPU6050_RA_I2C_SLV4_DI 0x35
    #define MPU6050_RA_I2C_MST_STATUS 0x36
    #define MPU6050_RA_INT_PIN_CFG 0x37
    #define MPU6050_RA_INT_ENABLE 0x38
    #define MPU6050_RA_DMP_INT_STATUS 0x39
    #define MPU6050_RA_INT_STATUS 0x3A
    #define MPU6050_RA_ACCEL_XOUT_H 0x3B
    #define MPU6050_RA_ACCEL_XOUT_L 0x3C
    #define MPU6050_RA_ACCEL_YOUT_H 0x3D
    #define MPU6050_RA_ACCEL_YOUT_L 0x3E
    #define MPU6050_RA_ACCEL_ZOUT_H 0x3F
    #define MPU6050_RA_ACCEL_ZOUT_L 0x40
    #define MPU6050_RA_TEMP_OUT_H 0x41
    #define MPU6050_RA_TEMP_OUT_L 0x42
    #define MPU6050_RA_GYRO_XOUT_H 0x43
    #define MPU6050_RA_GYRO_XOUT_L 0x44
    #define MPU6050_RA_GYRO_YOUT_H 0x45
    #define MPU6050_RA_GYRO_YOUT_L 0x46
    #define MPU6050_RA_GYRO_ZOUT_H 0x47
    #define MPU6050_RA_GYRO_ZOUT_L 0x48
    #define MPU6050_RA_EXT_SENS_DATA_00 0x49
    #define MPU6050_RA_EXT_SENS_DATA_01 0x4A
    #define MPU6050_RA_EXT_SENS_DATA_02 0x4B
    #define MPU6050_RA_EXT_SENS_DATA_03 0x4C
    #define MPU6050_RA_EXT_SENS_DATA_04 0x4D
    #define MPU6050_RA_EXT_SENS_DATA_05 0x4E
    #define MPU6050_RA_EXT_SENS_DATA_06 0x4F
    #define MPU6050_RA_EXT_SENS_DATA_07 0x50
    #define MPU6050_RA_EXT_SENS_DATA_08 0x51
    #define MPU6050_RA_EXT_SENS_DATA_09 0x52
    #define MPU6050_RA_EXT_SENS_DATA_10 0x53
    #define MPU6050_RA_EXT_SENS_DATA_11 0x54
    #define MPU6050_RA_EXT_SENS_DATA_12 0x55
    #define MPU6050_RA_EXT_SENS_DATA_13 0x56
    #define MPU6050_RA_EXT_SENS_DATA_14 0x57
    #define MPU6050_RA_EXT_SENS_DATA_15 0x58
    #define MPU6050_RA_EXT_SENS_DATA_16 0x59
    #define MPU6050_RA_EXT_SENS_DATA_17 0x5A
    #define MPU6050_RA_EXT_SENS_DATA_18 0x5B
    #define MPU6050_RA_EXT_SENS_DATA_19 0x5C
    #define MPU6050_RA_EXT_SENS_DATA_20 0x5D
    #define MPU6050_RA_EXT_SENS_DATA_21 0x5E
    #define MPU6050_RA_EXT_SENS_DATA_22 0x5F
    #define MPU6050_RA_EXT_SENS_DATA_23 0x60
    #define MPU6050_RA_MOT_DETECT_STATUS 0x61
    #define MPU6050_RA_I2C_SLV0_DO 0x63
    #define MPU6050_RA_I2C_SLV1_DO 0x64
    #define MPU6050_RA_I2C_SLV2_DO 0x65
    #define MPU6050_RA_I2C_SLV3_DO 0x66
    #define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67
    #define MPU6050_RA_SIGNAL_PATH_RESET 0x68
    #define MPU6050_RA_MOT_DETECT_CTRL 0x69
    #define MPU6050_RA_USER_CTRL 0x6A
    #define MPU6050_RA_PWR_MGMT_1 0x6B
    #define MPU6050_RA_PWR_MGMT_2 0x6C
    #define MPU6050_RA_BANK_SEL 0x6D
    #define MPU6050_RA_MEM_START_ADDR 0x6E
    #define MPU6050_RA_MEM_R_W 0x6F
    #define MPU6050_RA_DMP_CFG_1 0x70
    #define MPU6050_RA_DMP_CFG_2 0x71
    #define MPU6050_RA_FIFO_COUNTH 0x72
    #define MPU6050_RA_FIFO_COUNTL 0x73
    #define MPU6050_RA_FIFO_R_W 0x74
    #define MPU6050_RA_WHO_AM_I 0x75
    #define I2C_WRITE 0
    #define I2C_READ 1
    #define VITESSEI2C 1 //1 pour 100khz, 0 pour 400khz
    #define BRGI2C 0x0C//
    
    //###### usb declaration 
    
    unsigned char readbuff[64]  absolute 0x500;   // Buffers should be in USB RAM, please consult datasheet
    unsigned char writebuff[64] absolute 0x540;
    char cnt;
    char kk;
    char kk1;
    
    ///#################################### injection code I2C
    
    
    
    void i2c_Wait(void){
        while ( ( SSPCON2 & 0x1F ) || ( SSPSTAT & 0x04 ) );
    }
    
    void i2c_Start(void)
    {
        i2c_Wait();
        SSPCON2.SEN=1;
    }
    
    void i2c_Restart(void){
        i2c_Wait();
        SSPCON2.RSEN=1;
    }
    
    void i2c_Stop(void)
    {
        i2c_Wait();
        SSPCON2.PEN=1;
    }
    void i2c_Write(unsigned char data1)
    {
        i2c_Wait();
        SSPBUF = data1;
    }
    
    void i2c_Address(unsigned char address, unsigned char mode)
    {
        unsigned char l_address;
    
        l_address=address<<1;
        l_address+=mode;
        i2c_Wait();
        SSPBUF = l_address;
    }
    
    unsigned char i2c_Read1(unsigned char ack)
    {
    
        i2c_Wait();
        SSPCON2.RCEN=1;
        i2c_Wait();
        i2cReadData = SSPBUF;
        i2c_Wait();
        if ( ack ) SSPCON2.ACKDT=0;                // Ack
        else       SSPCON2.ACKDT=1;                // NAck
        SSPCON2.ACKEN=1;                    // send acknowledge sequence
    
        return( i2cReadData );
    }
    
    
    /// fin des fonction IC2########################
    
    
    void interrupt(){
                     if (PIR1.CCP1IF ==1)
                    { 
                     PIR1.CCP1IF =0;
                    kk=1;
                    }
                    
                    
      if (PIR2.CCP2IF ==1)
                    {
                    
                    PIR2.CCP2IF =0;
                    if (PORTC.RC1==0){
                     CCP2CON=0B00000101;
                    kk1=3;
                    }
                     else
                     {
                       CCP2CON=0B00000100;
                     kk1=4;
                      }
                    }
       USB_Interrupt_Proc();
       }
    
    void main(void)
    {
       unsigned short  take ;
      ADCON1 = 0b00001111;
      CMCON=0x07;
      TRISB = 0xFF;
      TRISC = 0b11111110;
      PORTC= 0x00;
      TRISD=0;
      PIE1.CCP1IE=1;
      PIE2.CCP2IE=1;
      CCP1CON=0B00000101;
      PORTD.RD3=1;
              SSPSTAT=SSPSTAT&0x3F;
            SSPCON1=0x00;
            SSPCON2=0x00;
    
            SSPSTAT.SMP=VITESSEI2C;
            SSPCON1.SSPEN=1;
    
            SSPCON1.SSPM0=0;//1000
            SSPCON1.SSPM1=0;//1000
            SSPCON1.SSPM2=0;//1000
            SSPCON1.SSPM3=1;//1000
            SSPADD=BRGI2C;
    
    HID_Enable(&readbuff,&writebuff);
    Delay_ms(1000);
    
      kk=0;
      kk1=0;
    
       
      if (PORTC.RC1==0)  {
                    writebuff[8]=233;
                    writebuff[7]=233;
                    writebuff[6]=233;
                    writebuff[5]=233;
                    writebuff[4]=233;
                    writebuff[3]=233;
                    writebuff[2]=233;
                    writebuff[1]=233;
                    PORTD=0;
                    writebuff[0]=233;
                    while(!HID_Write(&writebuff,64));
                     CCP1CON=0B00000101;
    
                    }
                    else
                      {
    
                    writebuff[8]=235;
                    writebuff[7]=235;
                    writebuff[6]=235;
                    writebuff[5]=235;
                    writebuff[4]=235;
                    writebuff[3]=235;
                    writebuff[2]=235;
                    writebuff[1]=235;
                    PORTD=0;
                    writebuff[0]=233;
                    CCP2CON=0B00000100;
                    while(!HID_Write(&writebuff,64));
    
                    }
      
      
    
    
      while(1){
    
                   if (kk1==3)
                   {
                    writebuff[8]=230;
                    writebuff[7]=230;
                    writebuff[6]=230;
                    writebuff[5]=230;
                    writebuff[4]=230;
                    writebuff[3]=230;
                    writebuff[2]=230;
                    writebuff[1]=230;
                    PORTD=0;
                    writebuff[0]=233;
                    while(!HID_Write(&writebuff,64));
                    kk1=0;
                                    delay_ms(500);
    
                    }
                    
      if (kk1==4){
                 writebuff[8]=227;
                    writebuff[7]=227;
                    writebuff[6]=227;
                    writebuff[5]=227;
                    writebuff[4]=227;
                    writebuff[3]=227;
                    writebuff[2]=227;
                    writebuff[1]=227;
                    PORTD=0;
                    writebuff[0]=233;
                    while(!HID_Write(&writebuff,64));
                                    kk1=0;
    
                    }
    
                    
                    
                    if (kk==1){
                    writebuff[8]=PORTB.RB7;
                    writebuff[7]=PORTB.RB6;
                    writebuff[6]=PORTB.RB5;
                    writebuff[5]=PORTB.RB4;
                    writebuff[4]=PORTB.RB3;
                    writebuff[3]=PORTB.RB2;
        //            writebuff[2]=PORTB.RB1;
      //              writebuff[1]=PORTB.RB0;
                    writebuff[0]=205;
                  while(!HID_Write(&writebuff,64));
    
                  kk=0;
    
                  }
        
         if(HID_Read()){
                   if (readbuff[0]==0){
                    PORTD.RD0=readbuff[1];
                     PORTD.RD1=readbuff[2];
                      PORTD.RD2=readbuff[3];
                       PORTD.RD3=readbuff[4];
                        PORTD.RD4=readbuff[5];
                         PORTD.RD5=readbuff[6];
                          PORTD.RD6=readbuff[7];
                           PORTD.RD7=readbuff[8];
                           
                              }
                              
      if (readbuff[0]==233){
                    writebuff[8]=PORTB.RB7;
                    writebuff[7]=PORTB.RB6;
                    writebuff[6]=PORTB.RB5;
                    writebuff[5]=PORTB.RB4;
                    writebuff[4]=PORTB.RB3;
                    writebuff[3]=PORTB.RB2;
    //                writebuff[2]=PORTB.RB1;
    //                writebuff[1]=PORTB.RB0;
                    PORTD=0;
                    writebuff[0]=233;
                  while(!HID_Write(&writebuff,64));
                    
                    }
         
      if (readbuff[0]==133){
            take=0;
            // initialize I2C communication
        i2c_Start();                        // send Start
        i2c_Address(MPU6050_ADDRESS, I2C_WRITE);  // Send slave address - write operation
        i2c_Write(MPU6050_RA_WHO_AM_I);                        // Set register for servo 0
        i2c_Restart();                      // Restart
        i2c_Address(MPU6050_ADDRESS, I2C_READ);   // Send slave address - read operation
        take = i2c_Read1(0);            // Read one byte              // issue I2C start signal
        i2c_Stop();
    
            writebuff[1]=take;
            writebuff[0]=153;
            while(!HID_Write(&writebuff,64));
    
      if (take==0x68)
      {
       PORTD.RD0=1;
          PORTD.RD1=0;
    
      }
    else
    {
       PORTD.RD0=0;
          PORTD.RD1=1;
       }
    }
    
      }
    }
    }


    c la partie du choix de frenquence qui cloche non
    j utilise un quartz de 20 mhz et plldiv=5 et CPUDIV=osc1_pll2
    et des resistance de pull-up sur le bus de 3.6k
    Merci de votre aide

    -----

  2. #2
    RISC

    Re : probléme de communication entre PIC18f4550 et YG-521 en I2C

    Salut,
    D'après ta description à la fin ton circuit HW semble incorrect...
    Le PIC18F4550 possède des résistances de pull-up intégrées et programmables. Il faut que cela soit géré par la pile de protocole.
    Nulle trace de ta pile de protocole USB. Peut-être y a-t-il aussi un PB de ce coté là...
    Quel compilateur utilises-tu ?
    Si tu utilises un quartz 20MHz, il faut effectivement diviser par 5 et aussi choisir des diviseurs pour que le PIC puisse fonctionner à 12 MIPS (48MHz). Voir la datasheet
    a+

  3. #3
    invite5905bb4b

    Re : probléme de communication entre PIC18f4550 et YG-521 en I2C

    Merci pour voitre répense ca ma bcp aider mais j ai tjr un probléme
    maitenant ca marche sauf qu il faut que je remets la resistance de pull-up de la ligne SDA a la masse apres chaque envoi pour que le transfere s 'éffectue !!!
    ca peut venir de quoi !!!

  4. #4
    invite5905bb4b

    Re : probléme de communication entre PIC18f4550 et YG-521 en I2C

    Probléme resolu
    Merci pour votre aide
    probléme avec la finction read i2c de mikroC je l ai reécris moi meme et ca a marché

  5. A voir en vidéo sur Futura
  6. #5
    invite5905bb4b

    Re : probléme de communication entre PIC18f4550 et YG-521 en I2C

    Bonjour les amis

    j ai toujours pas trouvé une solution pour communiqué convenableme,t avec ce fameux capteur
    je recupére les info mais bizarement il me faut a chaque fois que j enleve le bus et je le remets pour ke l infos se transmets au pic ? si non le pic reste bmloqué !
    j ai essayer toute les valeur des resistance pull-up possible de 1k a 10 k
    mais tjr le mm probleme il fo ke j enleve le bus et je le remets pour debloquer le pic
    voilà la sequence :
    Code:
        I2C1_Start();
       I2C1_Wr(0x53);
       I2C1_Wr(0x00);
       I2C1_Repeated_Start();    
       I2C1_Wr(0x3B );
       writebuff[4]=I2C1_Rd(0);
       I2C1_Stop();
    jutilise un pic18f2550 en master et comme capteur adxl345
    sur arduino il me renvoi les valeur sans soucis !!!
    merci pour votre aide

Discussions similaires

  1. Différence entre SX28AC/DP et le PIC18F4550
    Par invite712e065d dans le forum Électronique
    Réponses: 7
    Dernier message: 15/02/2011, 15h33
  2. Problème communication I2C entre RTC et uC
    Par invite5267eae1 dans le forum Électronique
    Réponses: 34
    Dernier message: 30/06/2010, 23h38
  3. Problème de communication entre automates
    Par invitea32f2b46 dans le forum Électronique
    Réponses: 6
    Dernier message: 15/08/2009, 18h43
  4. probleme communication entre compactRIO et PC
    Par invite19c7b431 dans le forum Électronique
    Réponses: 4
    Dernier message: 09/04/2009, 16h27
  5. Communication I2C entre PIC et ordinateur / Problème d'interruption
    Par invite68d5b092 dans le forum Électronique
    Réponses: 3
    Dernier message: 01/11/2005, 23h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...