| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				| receiving data on pic16F from an accelerometer MPU6050 |  
				|  Posted: Wed Jan 25, 2023 4:37 pm |   |  
				| 
 |  
				| Hi ! I'm currently working on a project on a pic16f877A and i must have data from an accelerometer mpu6050 on 3 axes (X,Y,Z). I'm receiving data in i2c burst mode but for some reasons, my data are not accurate and sometimes my i2c bus receive same numbers on 2 axes. I post my code here, pls don't focus on "write_slave()" this is for communication with my friend but this is not the problem I'm posting for ^^: 
 
  	  | Code: |  	  | #include <16F877A.h>
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=20000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
 #use i2c(MASTER, sda=PIN_C4, scl=PIN_C3)
 
 #define READ_ADDR      0xD1
 #define WRITE_ADDR     0xD0
 
 #define REG_GYRO_X1    0X43
 #define REG_GYRO_X2    0X44
 #define REG_GYRO_Y1    0X45
 #define REG_GYRO_Y2    0X46
 #define REG_GYRO_Z1    0X47
 #define REG_GYRO_Z2    0X48
 
 #define GYRO_CONFIG    0x1B
 #define ACCEL_CONFIG   0x1C
 
 #define PWR_MGMT_1     0x6B
 #define POWER_MNGMNT   0x6B
 #define CONFIG         0x1A
 #define SAMPLE_DRATE   0x19
 #define INT_ENABLE     0x38
 #define FIFO_EN        0x6A
 #define FIFO_CONFIG    0x23
 
 #define REG_ACCEL_X1   0x3B
 #define REG_ACCEL_X2   0x3C
 #define REG_ACCEL_Y1   0x3D
 #define REG_ACCEL_Y2   0x3E
 #define REG_ACCEL_Z1   0x3F
 #define REG_ACCEL_Z2   0x40
 #define FIFO_BUFFER    0x74
 #define WHO_AM_I       0x75
 #define INT_PIN_CFG    0x37
 #define INT_STATUS     0x3A
 
 void write_slave(int val)
 {
 printf("\n\r 1111 ");
 i2c_start();
 printf("\n\r 2222 ");
 i2c_write(0x10);
 printf("\n\r 3333 ");
 i2c_write(val);
 printf("\n\r 44444 ");
 i2c_stop();
 }
 
 /////////////////////////////////////////////////////////
 // WRITE//
 ////////////////////////////////////////////////////////
 
 void write_reg(int Reg, int val)
 {
 i2c_start();
 i2c_write(0xD0);
 i2c_write(Reg);
 i2c_write(val);
 i2c_stop();
 }
 
 /////////////////////////////////////////////////////////
 // READ//
 ////////////////////////////////////////////////////////
 
 int read_reg(int Reg)
 {
 //unsigned int data = 0;
 int buffer;
 
 i2c_start();
 i2c_write(0xD0);
 i2c_write(Reg);
 i2c_start();
 i2c_write(0xD1); //start with the address in read mode
 buffer = i2c_read(0); // read and store the data in a variable
 i2c_stop();
 return buffer;
 }
 
 /////////////////////////////////////////////////////////
 //INIT//
 ////////////////////////////////////////////////////////
 
 void MPU6050_Init()
 {
 
 write_reg(PWR_MGMT_1,  0x01);
 delay_ms(100);
 write_reg(CONFIG, 0x00);
 delay_ms(10);
 write_reg(GYRO_CONFIG, 0x18);  // Pourquoi configurer Gyro et pas AccĂ©
 delay_ms(10);
 write_reg(ACCEL_CONFIG, 0x00); // test 24/11
 delay_ms(10);
 write_reg(SAMPLE_DRATE, 0x07);
 delay_ms(10);
 write_reg(INT_ENABLE, 0x01);
 delay_ms(10);
 write_reg(FIFO_EN,  0x40);
 delay_ms(10);
 write_reg(FIFO_CONFIG, 0x08);
 delay_ms(10);
 write_reg(INT_PIN_CFG, 0x10);
 delay_ms(10);
 
 }
 
 /////////////////////////////////////////////////////////
 //MPU READ//
 ////////////////////////////////////////////////////////
 
 void Read_Sensor (int8 REG_add)
 {
 int MSB1;
 int LSB1;
 int MSB2;
 int LSB2;
 int MSB3;
 int LSB3;
 int16 AxeX;
 int16 AxeY;
 int16 AxeZ;
 float  fAxeX, fAxeY, fAxeZ;
 
 i2c_start();
 i2c_write(0xD0);
 i2c_write(REG_add);
 i2c_start();
 i2c_write(0xD1); //start with the address in read mode
 
 MSB1 = i2c_read();
 LSB1 = i2c_read();
 
 MSB2 = i2c_read();
 LSB2 = i2c_read();
 
 MSB3 = i2c_read();
 LSB3 = i2c_read(0);
 read_reg(INT_STATUS);
 
 AxeX = make16(MSB1, LSB1);
 AxeY = make16(MSB2, LSB2);
 AxeZ = make16(MSB3, LSB3);
 
 i2c_stop();
 
 fAxeX = (float)AxeX/16384.0;
 fAxeY = (float)AxeY/16384.0;
 fAxeZ = (float)AxeZ/16384.0;
 
 printf("\n\r axe X: %f",fAxeX);
 printf("\n\r axe Y: %f",fAxeY);
 printf("\n\r axe Z: %f",fAxeZ);
 
 }
 
 /////////////////////////////////////////////////////////
 //Check addr//
 ////////////////////////////////////////////////////////
 
 /*int check_addr (int reg_addr) //check if the slave's address is right
 {
 //read_reg(0xD0,buffer_Receive); //0x75 is the REG: WHO_I_AM
 
 if (buffer_Receive == 0x68)
 {
 return (1);
 }
 
 else
 {
 return (0);
 }
 }
 */
 
 
 
 void main (void)
 {
 
 int TestRS = 0;
 
 
 MPU6050_Init();
 
 do
 {
 Read_Sensor(FIFO_BUFFER);
 write_slave(0x15);
 
 
 
 
 
 
 
 
 
 
 
 output_d(testRS);
 delay_ms(500);
 TestRS=TestRS+1;
 delay_ms(500);
 }
 
 while(true);
 
 }
 
 | 
 
 
 all ideas are welcome, thanks.
 |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9589
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 25, 2023 4:41 pm |   |  
				| 
 |  
				| are you running a 5 volt PIC and a 3 volt sensor ? |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 25, 2023 4:45 pm |   |  
				| 
 |  
				| They're both on 5V. |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9589
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jan 25, 2023 5:33 pm |   |  
				| 
 |  
				| Try running the I2C port as 'slow' ? I don't use the MPU6050 but it has a maximum speed, 'somewhere' on it's datasheet. 
 What value are the I2C bus pullup resistors ? They have to be selected on BOTH VDD and speed.
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 2:32 am |   |  
				| 
 |  
				| 
 ok thank you i'lln try but i don't have the math.h library, have you got a sure link where i can take it?
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 2:35 am |   |  
				| 
 |  
				|  	  | temtronic wrote: |  	  | Try running the I2C port as 'slow' ? I don't use the MPU6050 but it has a maximum speed, 'somewhere' on it's datasheet. 
 What value are the I2C bus pullup resistors ? They have to be selected on BOTH VDD and speed.
 | 
 
 i think this part doesn't have an issue, my teacher has the code who works on it ^^' he had put it in front of me and it works. so i think my problem isn't on hardware part.
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 2:37 am |   |  
				| 
 |  
				|  	  | AKA TENDO wrote: |  	  | They're both on 5V. | 
 
 Er. The MPU6050, is not a 5v device. 3.46v _max_ rating. If you
 have run it off 5v, you have probably killed the chip....
   
 If you are using a board from something like an Arduino, that has a 5v
 regulator for the chip, you have the problem of signalling levels. The
 Arduino accepts a 2.4v signal as 'high' for it's I2C connection. The PIC
 does not. Needs 4v.
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 2:46 am |   |  
				| 
 |  
				|  	  | Ttelmah wrote: |  	  |  	  | AKA TENDO wrote: |  	  | They're both on 5V. | 
 
 Er. The MPU6050, is not a 5v device. 3.46v _max_ rating. If you
 have run it off 5v, you have probably killed the chip....
   
 If you are using a board from something like an Arduino, that has a 5v
 regulator for the chip, you have the problem of signalling levels. The
 Arduino accepts a 2.4v signal as 'high' for it's I2C connection. The PIC
 does not. Needs 4v.
 | 
 
 I use this sensor :
 
 https://www.hotmcu.com/gy521-mpu6050-3axis-acceleration-gyroscope-6dof-module-p-83.html
 
 and it accepts 5V.
 
 And how could i solve the problem that you are talking about?
 Do you mean that i should try to put my i2c in SLOW MODE?
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 2:58 am |   |  
				| 
 |  
				| That is what I guessed. That has a 3.3v regulator, so you won't have damaged the chip, but the problem is that your PIC I2C peripheral wants
 4v for a logic high, so will be intermittent on receiving things.
 Try changing the I2C setup and add 'SMBUS' to this. This should turn
 the input voltage required down low enough to work.
 
 #use i2c(MASTER, sda=PIN_C4, scl=PIN_C3, SMBUS)
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 2:58 am |   |  
				| 
 |  
				| Is normal that the math.h doesn't compile? Did i forget something? [/img]
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 3:03 am |   |  
				| 
 |  
				|  	  | Ttelmah wrote: |  	  | That is what I guessed. That has a 3.3v regulator, so you won't have damaged the chip, but the problem is that your PIC I2C peripheral wants
 4v for a logic high, so will be intermittent on receiving things.
 Try changing the I2C setup and add 'SMBUS' to this. This should turn
 the input voltage required down low enough to work.
 
 #use i2c(MASTER, sda=PIN_C4, scl=PIN_C3, SMBUS)
 | 
 
 ok thank you very much i will try later but first i would try the code from pcm prgrammer. if it works i would use it for my project and continue to work on my own code as well.
 Can you help me about the math.h library?
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19967
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 3:08 am |   |  
				| 
 |  
				| Switch the setup to SMBUS anyway. It needs this setting to work with this chip.
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 3:17 am |   |  
				| 
 |  
				|  	  | Ttelmah wrote: |  	  | Switch the setup to SMBUS anyway. It needs this setting to work with this chip.
 | 
 
 i tried but it doesn't change anything..
 |  | 
	
		|  | 
	
		| AKA TENDO 
 
 
 Joined: 25 Jan 2023
 Posts: 47
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jan 26, 2023 4:02 am |   |  
				| 
 |  
				| Anybody has a solution to compile math.h? |  | 
	
		|  | 
	
		|  |