CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

How we get a 16-bit output from I2C?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Chaud



Joined: 11 Jan 2012
Posts: 39

View user's profile Send private message

How we get a 16-bit output from I2C?
PostPosted: Thu Feb 02, 2012 5:38 pm     Reply with quote

Hello, i need to get a 16-bit output from my gyroscope(XV 3500CB),and i cannot get a value between 0 - 65535 as i want (16 bit), i am doing this:
Code:
i2c_start(); ->i2c initiate
i2c_write(11010001); -> 1101000X is the gyro adress, 1101000'1' means that master can read (this is writed on datasheet, i think im not wrong);
value1 = i2c_read(); -> first 8 bit (LSB)
value2 = i2c_read() << 8; -> last 8 bit (MSB)
i2c_stop(); -> stop i2c
gyro = make16(value2,value1); -> make two 8bit int in one 16-bit int
printf("%ld - %d - %d\r\n",gyro,value2,value1); -> read the values


Here is the printf output:
255 - 0 - -1
255 - 0 - -1
255 - 0 - -1
255 - 0 - -1
255 - 0 - -1
etc

gyro value is always 255, value 2 is always 0, and value 1 is always "-1", i also dont know if i doing right to get the 16-bit by doing this:
Code:
value1 = i2c_read(); -> first 8 bit (LSB)
value2 = i2c_read() << 8; -> last 8 bit (MSB)


Do you know how to get a 16-bit output from your I2C??


Last edited by Chaud on Thu Feb 02, 2012 6:08 pm; edited 1 time in total
Chaud



Joined: 11 Jan 2012
Posts: 39

View user's profile Send private message

PostPosted: Thu Feb 02, 2012 5:45 pm     Reply with quote

One guy with same gyro did this:
Code:
int Get_Gyro_Data()
{
int data;
Wire.beginTransmission(Gyro_address);
Wire.send(Register);
Wire.endTransmission();

Wire.requestFrom(Gyro_address, 2);
if(Wire.available()>=2)
{
data = Wire.receive();
data |= Wire.receive() << 8;
}
return data;
}


Wire.requestFrom(Gyro_address, 2); // this means a request for gyro for 2 bytes, but this code is for arduino, in CCS libraries i dont see any method that provide this, to get 2 bytes

For what i read of "i2c_poll" method, is there for things like this,so i tried this code:
Code:
i2c_start(); // Start condition
   i2c_write(11010001); // Device address/Read
   for(count = 0; count < 2;count++){
      while(!i2c_poll());
      buffer[count] = i2c_read(1);
   
   }
     i2c_stop();
     gyro = make16(buffer[1],buffer[0]);
     printf("%ld - %d - %d\r\n",gyro,buffer[1],buffer[0]);


But i always get compile error on:
Code:
while(!i2c_poll());

whit this message: Undefined identifier for -- i2c_poll
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Feb 02, 2012 6:42 pm     Reply with quote

hmm..

value2 = i2c_read() << 8; -> last 8 bit (MSB)

Get a piece of graph paper and 'play computer'.

put down ANY binary value for the 2nd I2C_read().
then left shift that value once.
do it again, and again, 8 times total

what result do you get ?

This is what is put into 'value2'.

As to why value1 is always 255, I'd have to read the gyro datasheet or go to the R&D lab to setup and test the device.

The make16() function creates a word(16 bits) from 2 bytes(8 bits each),easy to use and does work...but be sure to put the variables in the correct order.
Chaud



Joined: 11 Jan 2012
Posts: 39

View user's profile Send private message

PostPosted: Fri Feb 03, 2012 10:16 am     Reply with quote

I think I didn't get what you really mean :P There must be someone who needed to get more than 1 byte via I2C. I'm pretty sure that value 2 is incorrect, I just followed the Arduino code. I need to know how I do that with CCS C code.
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Fri Feb 03, 2012 10:19 am     Reply with quote

again...
WRONG
value2 = i2c_read() << 8; -> last 8 bit (MSB)

get RID of '<<8'

use
value2 = i2c_read();


you do NOT want to leftshift the data from the i2c device(shift left 8 times and you'll ALWAYS get 0.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Feb 03, 2012 12:48 pm     Reply with quote

Quote:
There must be someone who needed to get more than 1 byte via I2C.

One of the reasons you are not getting replies is because you are making
really, really dumb errors in your code. This makes people avoid giving
help. They think you don't care enough to proof-read your code. So they
think, "he (Chaud) doesn't care, so why should I care ?", and they don't
give help.

Here is an example from your program:
Quote:

i2c_write(11010001); // Device address/Read

Here, you are giving it an i2c address of 11 million and something.
That's not an i2c address. No way. A number written just like that
is in Decimal format. It's 11 million and something. If you want
binary format (1's and 0's), then you have to put a "0b" in front of
the number. That's very basic knowledge in programming. When
you make that mistake, it makes people groan and turn away.
I'm not trying to beat up on you too much, but I am trying to let you
know that you need to proof-read your code. You need to question
your own code, and think like this: "Is that right ? Do I really use 11
million for the i2c address ?". "That can't be right". "I must find the
correct way to do it".


In addition to that, there are at least two more mistakes in the following
code. If you read previous threads on i2c problems on this forum you
would see the answer. For one thing, no one ever uses i2c_poll() in
a simple PIC Master to Slave device program. You won't see it in any
examples. So why use it ? Again, you need to question everything
you do.
Code:

i2c_write(11010001); // Device address/Read
   for(count = 0; count < 2;count++){
      while(!i2c_poll());
      buffer[count] = i2c_read(1);
   

The other problem has to do with using a NACK on the last i2c_read().
That answer must have been posted at least 100's of times on this forum.
Sometimes people get tired of posting it one more time. You need to
read the forum archives for i2c problems. Use the search page.
Chaud



Joined: 11 Jan 2012
Posts: 39

View user's profile Send private message

PostPosted: Sun Feb 05, 2012 2:50 pm     Reply with quote

Hello PCM Programmer, I agree with you, sorry I'm a very distracted guy, and I completely forget the "0b" , and the problem was that .. sorry my bad, thanks for help friend.

temtronic thanks for your help too

Problem solved
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group