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.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy