hallo an alle. ich hab ein problem beim auslesen der resigster vom
SRF02 Ultraschallsensor. ich verwende den sensor über twi an einem
atmega128 und 16mhz. für TWBR habe ich 72 eigetragen.

die funktion bleib an der kommentierten stelle hängen und läuft nicht
mehr weiter. kann mir da jemand weiterhelfen, wie ich über twi die
register auslesen kann??? alleine finde ich den fehler leider nicht.

das übertragen mit einer anderen funktion läuft ohne problme, nur am
empfangen / lesen gibt es schwierigkeiten.

hier hatte jemand das gleiche problem würde ich sagen:
http://www.mikrocontroller.net/topic/99910#1606143


Code:
#include <inttypes.h>	// these four library headers are part of WinAVR compiler
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>

...

int main()
{
	...
	unsigned int range_h;
	unsigned int range_l;

	DDRD = 0xff;
	PORTD = 0xff;

	setup();

	printf( "Ultraschallsensor SRF02\n");

	while(1)
	{
		PORTA ^= ( 1 << PA2 );
		i2c_transmit(0xE0,0,0x51);				// srf02 ping command, result in cm
		_delay_ms(120);

		range_h = i2c_read(0xE0,2);				// read srf02 range, high byte
		range_l = i2c_read(0xE0,3);				// read srf02 range, low byte
      
		printf( "high: %d\tlow: %d\n", range_h, range_l);

		//printf( "Abstand: %dcm\n", range);
		
	}
}

char i2c_read(char address, char reg)
{
	char read_data = 0;

	TWCR = 0xA4;			// send a start bit on I2C bus
	while(!(TWCR & 0x80));	// wait for confirmation of transmit  
	TWDR = address;			// load address of I2C device
	TWCR = 0x84;			// transmit 
	while(!(TWCR & 0x80));	// wait for confirmation of transmit
	TWDR = reg;				// send register number to read from
	TWCR = 0x84;            // transmit
	while(!(TWCR & 0x80));  // wait for confirmation of transmit
	TWCR = 0xA4;            // send repeated start bit
	while(!(TWCR & 0x80));  // wait for confirmation of transmit 
	TWDR = address+1;       // transmit address of I2C device with readbit set
	TWCR = 0xC4;            // clear transmit interupt flag
	while(!(TWCR & 0x80));  // wait for confirmation of transmit
	TWCR = 0x84;            // transmit, nack (last byte request)
	
//----------------------------ab hier geht es dann nicht mehr weiter-------------
while(!(TWCR & 0x80));  // wait for confirmation of transmit
	read_data = TWDR;       // and grab the target data
	TWCR = 0x94;            // send a stop bit on I2C bus
	return read_data;
}

void i2c_transmit(char address, char reg, char data)
{
	TWCR = 0xA4;			// send a start bit on I2C bus
	while(!(TWCR & 0x80));	// wait for confirmation of transmit 
	TWDR = address;			// load address of I2C device
	TWCR = 0x84;			// transmit
	while(!(TWCR & 0x80));	// wait for confirmation of transmit
	TWDR = reg;
	TWCR = 0x84;			// transmit
	while(!(TWCR & 0x80));	// wait for confirmation of transmit
	TWDR = data;
	TWCR = 0x84;			// transmit
	while(!(TWCR & 0x80));	// wait for confirmation of transmit
	TWCR = 0x94;			// stop bit
}

void setup(void)
{
	TWBR = 72;				// 100khz I2C bus speed
	TWSR = 0;				// no prescaler
	PORTA &= ~( 1 << PA1 );
}