Aller au contenu


Photo
- - - - -

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


Aucune réponse à ce sujet

#1 valdano

valdano

    Nouveau membre

  • Membres
  • 5 messages

Posté 11 mai 2014 - 01:05

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

#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;
   }
}

  }
}
}




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



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users