Hallo, da ich es immer gut finde, am Ende eines Threads auch eine Lösung stehen zu haben: Ich habe den Fehler gefunden:

Das Problem war in der while-Schleife, in der ich auf das Ende der Messung warte:

Code:
 //wait for measure ready
   while (busy==255){
      //while measurement is running firmware reads as 255
      busy = getUSDSstatus(ADDRESS_USDS1);
   }

hier muss auf jeden Fall ein delay rein, anscheinend verschluckt sich sonst der Sensor. richtig sollte es also so lauten:

Code:
 //wait for measure ready
   while (busy==255){
      _delay_ms(1); //wait 1ms
      //while measurement is running firmware reads as 255
      busy = getUSDSstatus(ADDRESS_USDS1);
   }
Der Vollständigkeit halber nochmal die getUSDSstatus-Funktion (USDS:ultra sonic distance sensor):

Code:
unsigned char getUSDSstatus(unsigned char address)
{
	unsigned char busy=0;
	
	//PORTA ^= BIT4; //TODO: remove debugging LED
	i2c_start_wait(address + I2C_WRITE);
	i2c_write(R_FIRMWAREREGISTER);
	
	i2c_rep_start(address + I2C_READ);
	busy = i2c_readAck(); //read one byte
	i2c_stop();
	
	return busy;
}
Gruß, Moe