Go Down

### Topic: Arduino Operator >> and << (Read 2990 times)previous topic - next topic

#### cjdelphi

##### Mar 21, 2012, 09:11 am
straight from this component out of a 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

#1
##### Mar 21, 2012, 09:17 am
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.
I speak for myself, not Arduino.

#### nickgammon

#2
##### Mar 21, 2012, 09:18 am
2^4 is 16.

x >> 4 is effectively a divide by 16.
Please post technical questions on the forum, not by personal message. Thanks!

#### cjdelphi

#3
##### Mar 21, 2012, 09:19 am
Code: [Select]
` x1 = ((long)ut - ac6) * ac5 >> 15;`

>>15 is not divide by 15 though

#### AWOL

#4
##### Mar 21, 2012, 09:20 amLast 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.
I speak for myself, not Arduino.

#### cjdelphi

#5
##### Mar 21, 2012, 09:28 am
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

#6
##### Mar 21, 2012, 09:33 am
"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.
I speak for myself, not Arduino.

#### cjdelphi

#7
##### Mar 21, 2012, 09:36 am
cool i get it... but i don't need to use >> so what is the operator? ^ or pow?

#### dxw00d

#8
##### Mar 21, 2012, 09:41 am
Why don't you need to use >>?

#### Grumpy_Mike

#9
##### Mar 21, 2012, 09:55 am
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 amLast 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.
I speak for myself, not Arduino.

#### cjdelphi

#11
##### Mar 21, 2012, 10:06 am
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 amLast 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.
I speak for myself, not Arduino.

Go Up