Hier ein Beispielcode für den SRF02. SRF10 ist fast gleich. Das erste Register für die I2C Operation wird z.B. durch ein i2c_write(0x02) {=Auswahl Register 0x02} ausgewählt. Danach kann auf dieses und alle folgenden Register zugegriffen werden.


#include <inttypes.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <math.h>

#include <avr/io.h>
#include "i2cmaster.h"
#define SRF 0xE0
#define F_CPU 8000000UL
#include <util/delay.h>
#define BAUD 9600L
#include <avr/iom8515.h>
#include <avr/sfr_defs.h>
#define SDA 0 // SDA Port E, Pin 0
#define SCL 1 // SCL Port E, Pin 1
#define SDA_PORT PORTE // SDA Port E
#define SCL_PORT PORTE // SCL Port E

unsigned int distance EEMEM; // reserve storage space in EEPROM

// USART_INIT--
void initusart(void) // Hauptfunktion
{
unsigned char x; //Hilfsvariable
// #idef UBRRL //USART-Schnittstelle
UBRRL = (F_CPU / (16L*BAUD)) -1; //Baudrate mit TAKT und Baud
UCSRB |= (1<<TXEN) | (1<<RXEN); //Sender und Empfänger ein
UCSRC |= (1<< URSEL) | (1<< UCSZ1) | (1<<UCSZ0); //ansync 8bit
x = UDR;
}

void sendeusart(int x)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich

UDR = x;
}

int main(void)
{
i2c_init();
initusart();
sendeusart(distance);
unsigned char Lbyte,Hbyte;

DDRE = 0xff;
PORTE = 0xff;

while(1)
{
i2c_init(); muss ein sonst blinkt der sensor nicht

i2c_start(SRF);
i2c_write(0x00);
i2c_write(0x51);
i2c_stop();

_delay_ms(75);

i2c_start(SRF);
i2c_write(0x02);
i2c_stop();

i2c_start(0xE1);

Hbyte=i2c_readAck();
Lbyte=i2c_readNak();
i2c_stop();
distance=(Hbyte*256)+Lbyte;

eeprom_write_word(&distance,distance); //save to EEPROM

sendeusart(distance);
}
}

Gruß, uffi.