View previous topic :: View next topic |
Author |
Message |
alex323qp
Joined: 17 Jun 2011 Posts: 12
|
ITG 3200 gyro |
Posted: Wed Jun 22, 2011 11:49 pm |
|
|
Has anybody used the ITG 3200 gyro??
I'm trying to comunicate with it using pic 12f675 (Yes, it doesn't have i2c ports)... but I can't get any answer from it... The datasheet says it works on address 0x69, but after running a program to find how many devices are connected, I get 0 devices found :(.
Thanks for any help! |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Thu Jun 23, 2011 5:05 am |
|
|
Do you have the correct pullups on the I2C bus lines ?
Have you correctly got any other I2C device to communicate with your PIC and code ? |
|
|
alex323qp
Joined: 17 Jun 2011 Posts: 12
|
|
Posted: Thu Jun 23, 2011 3:33 pm |
|
|
Hi, I reckon I've got the correct resistors, 10k from SDA to vcc and 10k from SCL to vcc... The device works up to 400k.
To be honest, this is my first attempt with I2c, so i'm kind of newbie. And not, I don't have any other device connected. As far as I understand, despite the fact that my pic doesn't have hardware for I2c, I should be able to use it as master... shouldn't I?
Here is my code:
Code: |
#include <12F675.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#use delay(int=4000000)
#define XBEE_IN PIN_A0
#define XBEE_OUT PIN_A1
#define LED PIN_A2
#define SW1 PIN_A3
#use rs232(baud=9600,parity=N,xmit=XBEE_OUT,rcv=XBEE_IN,bits=8,stream=xbee)
#use i2c(master, sda=PIN_A4, scl=PIN_A5, FAST=100000, FORCE_SW)
int8 get_ack_status(int8 address)
{
int8 status;
i2c_start();
status = i2c_write(address); // Status = 0 if got an ACK
i2c_stop();
if(status == 0){
return(TRUE);
}else{
return(FALSE);
}
}
void main(){
int8 i=0;
for(i=1; i<255; i++){
if(get_ack_status(i) == TRUE){
printf("Device found at: %u ", i);
}
}
puts("Done!");
}
|
The gyro works in 0x69 address, but I'm getting "Device found at: 210, 211, 212". I have not idea why.
Any idea? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 23, 2011 4:21 pm |
|
|
In CCS 8-bit format, the slave address is 0xD2 (210 decimal).
This is the same as 0x69 in 7-bit Philips address format.
Quote: | printf("Device found at: %u ", i); |
Change the %u to %x to display the i2c addresses in their normal Hex format. |
|
|
alex323qp
Joined: 17 Jun 2011 Posts: 12
|
|
Posted: Thu Jun 23, 2011 4:53 pm |
|
|
wow, thanks!!!
So apparently it's working quite good. However, now I need to send register addresses to read the data... But, where can I find a conversor from 7-bit to 8-bit... cos the datasheet has addresses in 7-bit. I guess it's the reason I'm getting -1 when I try to read the register 1E (or any other).
Thanks again! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 23, 2011 5:07 pm |
|
|
0x69 shifted left by 1 becomes 0xD2. Simply use 0xD2 as the slave
address in your i2c_write() statement.
Thus the write address is 0xD2 and the read address is 0xD3, in CCS
format. |
|
|
alex323qp
Joined: 17 Jun 2011 Posts: 12
|
|
Posted: Thu Jun 23, 2011 6:28 pm |
|
|
Ok, apparently I've got not idea how to comunicate with my device...
This is my reading function:
Code: |
BYTE read_gyro()
{
BYTE ret;
i2c_start();
i2c_write(0xD2); // 210 writing address
i2c_write(0x3C); // GYRO_XOUT_L (8-bit format XD)
i2c_start(); // Restart
i2c_write(0xD3); // Reading address
ret = i2c_read(0);
i2c_stop();
return ret;
} |
I got 0 every time... I guess I must be doing something really silly! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 23, 2011 6:49 pm |
|
|
The left-shifting biz only applies to the Philips-style i2c slave address.
It doesn't apply to commands, data, or anything else. See this recent
thread for more info:
http://www.ccsinfo.com/forum/viewtopic.php?t=45628&start=3
Modify your routine to use the GYRO_XOUT_L address as given in the
ITG-3200 data sheet. |
|
|
|