Helo all, i have problem using LSM303DLHC

Hello all
i am having difficulty using LSM303DLHC
this is my code

Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#asm
    .equ __i2c_port = 0x15 ; PORTC
    .equ __sda_bit = 1
    .equ __scl_bit = 0
#endasm
// Alphanumeric LCD functions
#asm 
   .equ __lcd_port=0x18 ; PORTB  
#endasm

#include <alcd.h>
#include <i2c.h>
#include <stdio.h>
#include <delay.h>

// Declare your global variables here
#define e_lcd PINB.7

int accX,accY,accZ;
unsigned char a,b,c,d,e,f;
char lcd_buffer[33];

void writeRegisterValueByte(unsigned char I2Caddress,unsigned char address,unsigned char value) 
{
    i2c_start();
    i2c_write(I2Caddress);
    i2c_write(address);
    i2c_write(value);
    i2c_stop();
}

void readLSM303DLHC(void) 
{


        i2c_start();
        i2c_write(0x32);
        i2c_write(0x28 | 0x80);
        i2c_stop();

        i2c_start();
        i2c_write(0x33);
        a = i2c_read(1);
        b = i2c_read(1);
        c = i2c_read(1);
        d = i2c_read(1);
        e = i2c_read(1);
        f = i2c_read(0);        
        i2c_stop();  
        
        accX = (int)b; 
        accX = accX << 8;   
        accX = a;    
        
        accY = (int)d; 
        accY = accY << 8;   
        accY |=c;
        
        accZ = (int)f; 
        accZ = accZ << 8;   
        accZ |= e; 
        
}



void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 3
// D5 - PORTB Bit 4
// D6 - PORTB Bit 5
// D7 - PORTB Bit 6
// Characters/line: 16
lcd_init(16);
lcd_clear();
e_lcd = 1 ;
        lcd_gotoxy(0,0);
         //       1234567890123456
        lcd_putsf(" heloooo");
        lcd_gotoxy(0,1);
        lcd_putsf(" helloooo  ");
         
i2c_init();
delay_ms(500);

    writeRegisterValueByte(0x32,0x20,0x27); 
    writeRegisterValueByte(0x32,0x23,0x00);   

while (1)
      {
      // Place your code here     
        
        readLSM303DLHC();
        lcd_clear(); 
        sprintf(lcd_buffer,"accX = %d accY = %d accZ = %d ",accX/164,accY/164,accZ/164); 
        lcd_puts(lcd_buffer);
       delay_ms(500);             
        
      }
}

the data wont out

its always

AccX : 0 Accy :0 AccZ :0

can somebody help me
i am testing the data from LSM303DLHC at 2g
but the data wont out…

using ATmega16 and c coding…

please help me
i am still new in coding…

Hello.

You mentioned that you are new to coding. Did you write this code yourself or find it somewhere?

Could you tell us more about your setup? (Some pictures showing how you have everything connected would be helpful to make sure your wiring is correct.) Are you programming an AVR chip or is it part of a breakout board? Do you have an oscilloscope you can use to see whether the expected signals are appearing on the I2C lines?

I did notice a few issues in your code, although I’m not sure if any of them are causing your problem:

First, the line accX = a; should be accX |= a; (you do the right thing for Y and Z).

Second, TWI is another name for I2C, so I’m a little concerned by this block of code:

// TWI initialization
// TWI disabled
TWCR=0x00;

I notice you do call i2c_init() later, though. Does i2c_init() sets up TWCR correctly? What I2C library are you using, and can I see the source for it somewhere?

- Kevin

i am using CodevisionAVR

here the i2c.h from CodevisionAVR

/*
  CodeVisionAVR V2.05.1+ C Compiler
  (C) 1998-2011 Pavel Haiduc, HP InfoTech S.R.L.

  Prototypes for I2C bus master functions

  The I/O port and bits used for the SDA and
  SCL signals and Bit Rate must be specified in the
  Project|Configure|C Compiler|Libraries|I2C menu.
*/

#ifndef _I2C_INCLUDED_
#define _I2C_INCLUDED_

#pragma used+
void i2c_init(void);
unsigned char i2c_start(void);
void i2c_stop(void);
unsigned char i2c_read(unsigned char ack);
unsigned char i2c_write(unsigned char data);
#pragma used-

#endif

i already changed the AccX |= a; i misstyped it

For the configuration of the Pin
i use this code

#asm
    .equ __i2c_port = 0x15 ; PORTC
    .equ __sda_bit = 1
    .equ __scl_bit = 0
#endasm

i got this code from my pal…

btw thx u sir for the correction

Unfortunately, since you aren’t using our example code, there isn’t much specific advice we can offer to help you troubleshoot your program. At this point, I think the best approach would be to try to use an oscilloscope or logic analyzer to see if the signals you expect are actually being sent, as I mentioned before. Have you used any other I2C devices successfully with the ATmega16 and the Codevision library? If not, that might be something you could try as well.

If you’re not sure whether you’re connecting everything properly, we might be able to at least help you verify that if you post some pictures of your setup.

- Kevin