BitShift ,registers and Wire.h

I have some questions regarding the coding of ADXL345 Accelerator. I found a tutorial in youtube and found the main site howtomechatronics.com

Sketch with comments.

#include <Wire.h>
//--- Accelerometer Register Addresses
#define Power_Register 0x2D
#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Y_Axis_Register_DATAY0 0x34
#define Y_Axis_Register_DATAY1 0x35
#define Z_Axis_Register_DATAZ0 0x36
#define Z_Axis_Register_DATAZ1 0x37
int ADXAddress = 0x53; //Device address in which is also included the 8th bit for selecting the mode, read in this case.
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
float Xa,Ya,Za;
void setup() {
Wire.begin(); // Initiate the Wire library
Serial.begin(9600);
delay(100);

Wire.beginTransmission(ADXAddress);
Wire.write(Power_Register); // Power_CTL Register
// Enable measurement
Wire.write(8); // Bit D3 High for measuring enable (0000 1000)
Wire.endTransmission();
}
void loop() {
// X-axis
Wire.beginTransmission(ADXAddress); // Begin transmission to the Sensor
//Ask the particular registers for data
Wire.write(X_Axis_Register_DATAX0);
Wire.write(X_Axis_Register_DATAX1);
Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
Wire.requestFrom(ADXAddress,2); // Request the transmitted two bytes from the two registers
if(Wire.available()<=2) { //
X0 = Wire.read(); // Reads the data from the register
X1 = Wire.read();
/* Converting the raw data of the X-Axis into X-Axis Acceleration

  • The output data is Two's complement
  • X0 as the least significant byte
  • X1 as the most significant byte */
    X1=X1<<8;
    X_out =X0+X1;
    Xa=X_out/256.0; // Xa = output value from -1 to +1, Gravity acceleration acting on the

Questions.

  1. Please explain why he used X1=X1<<8. Why bitshift to left and why 8? From my understanding of bitshift it will make the register all 0 (essentially clearing the msb).

  2. if the register is 00000000 due to left bitshift why add it to X1? (X_out=X0+X1)

I asked the author about this but no reply. I studied the concepts of bitshift and twos complement but I failed to understand how they work in registers. I also studied the datasheet but no answer from there.

Please help. Its been a week and I still dont have a clue.

From my understanding of bitshift it will make the register all 0 (essentially clearing the msb).

Nope. https://www.arduino.cc/en/reference/bitshift

An int data type is two bytes. The Wire.read puts the MSB into the lower byte of X1. The shift by 8 bits puts the MSB into the upper byte of X1, leaving the lower byte as 0x00. Pretty much copies the MSB from the low byte to the high byte. The next Wire.read then gives the value of the LSB to X0 low byte. X0 high byte is 0x00. When added, X1 + X0 returns the original int from the accel.
That is equivalent to (MSB * 256) + LSB.

Your first question should have been: why do I have a smiley in my code :smiley:

Please look up how to use code tags.