Go Down

Topic: Arduino Operator >> and << (Read 1 time) previous topic - next topic

cjdelphi

straight from this component out of a PDF ....

http://www.bosch-sensortec.com/content/language1/downloads/BMP085_DataSheet_Rev.1.0_01July2008.pdf



now here's the code I have in Arduino's IDE.

Code: [Select]

void bmp085_read_temperature_and_pressure(int* temperature, long* pressure, long* alti) {
  long tmp;
  long x1, x2, x3, b3, b5, b6, p, b7;
  unsigned long b4;
  long t;
  //calculate the temperature

  long up = bmp085_read_up();
  long  ut= bmp085_read_ut();
  x1 = ((long)ut - ac6) * ac5 >> 15;
  x2 = ((long) mc << 11) / (x1 + md);
  b5 = x1 + x2;
  t =((b5 + 8) )>> 4;
  *temperature = t;



Either the sensor is faulty or the code is, but I don't see a Divide by 2 like it requires in the arduino just a bit shift operator >>

AWOL

Quote
but I don't see a Divide by 2 like it requires in the arduino just a bit shift operator >>

Shift right by one place is a divide by two.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Nick Gammon

2^4 is 16.

x >> 4 is effectively a divide by 16.

cjdelphi

Code: [Select]
x1 = ((long)ut - ac6) * ac5 >> 15;

>>15 is not divide by 15 though


AWOL

#4
Mar 21, 2012, 09:20 am Last Edit: Mar 21, 2012, 09:22 am by AWOL Reason: 1
Quote
>>15 is not divide by 15 though

Who said it was?

x1 = (UT - AC6) * AC5 / 215
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

cjdelphi

I'm just trying to translate that 2(15) value my math is crap  

>> bit shit
/ = divide
3^3 = 3*3*3 (power of?)

so would that not mean

Code: [Select]

 x1 = (long)ut - ac6) * ac5/215;  (from PDF from bosh) 
 becomes
 x1 = ((((long)ut - ac6) * ac5/2)^15;  ?? really am clueless here lol


sorry my newb status with Arduino and C is really not helping...  i'm trying to convert this line (x1=......) to something Arduino will compile so i can use it to correct
my other code... thanks, unless the example i posted is actually correct in which case i may have to return this sensor as it's not giving a correct reading.

AWOL

"x >> 1" divides x by 2, so it follows that "x >> 2" divides x by four, and "x >> 3" divides x by eight.
Now, 2 = 21, 4 = 22 and 8 = 23.
You could write "x >> 3" as " ((x >> 1) >> 1) >> 1", with each successive operator halving thing previous result
Can you see where this is going?

(This isn't an "Arduino" operator, it's a C/C++ operator)
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

cjdelphi

cool i get it... but i don't need to use >> so what is the operator? ^ or pow?

dxw00d

Why don't you need to use >>?

Grumpy_Mike

Quote
^ or pow?

^ is a bitwise exclusive OR opperation
pow( ) is for taking the power of a number.

AWOL

#10
Mar 21, 2012, 10:04 am Last Edit: Mar 21, 2012, 10:07 am by AWOL Reason: 1
Quote
but i don't need to use >> so what is the operator

I don't understand you.
You can divide by 32768L, or you can shift right fifteen places - the result will be the same.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

cjdelphi

ok ok, just take this code here


Code: [Select]

 long up = bmp085_read_up();
 long  ut= bmp085_read_ut();
 x1 = ((long)ut - ac6) * ac5 >> 15;
*temperature = x1;   //my code outputs 6157
 x2 = ((long) mc << 11) / (x1 + md);
 b5 = x1 + x2;
 t =((b5 + 8) )>> 4;
//  *temperature = p;


6157, is what i get, but the PDF says 4743

So which is it, the code or the sensor?

AWOL

#12
Mar 21, 2012, 10:10 am Last Edit: Mar 21, 2012, 10:40 am by AWOL Reason: 1
Perhaps it is a bit warmer where you are.
What are your values of ac5, ac6 and ut?

Here's the example code with the values from the example (uncompiled, untested)
Code: [Select]
void setup ()
{
    Serial.begin (9600);
    unsigned int ac5 = 32757; // these numbers all from the example
    unsigned int ac6 = 23153; // these numbers all from the example
    int  mc = -8711; // these numbers all from the example
    int  md = 2868; // these numbers all from the example
    long ut= 27898; // these numbers all from the example - you will read this from the device.


    long x1 = ((long)ut - ac6) * ac5 >> 15;
    long x2 = ((long) mc << 11) / (x1 + md);
    long b5 = x1 + x2;
    long t =((b5 + 8) )>> 4;

    Serial.print ("x1 "); Serial.println (x1);
    Serial.print ("t  "); Serial.println (t);
}

void loop ()
{}
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Go Up