i2c_start liefert 0 oder 1 zurück. Wird aber vom Programm nicht ausgewertet da nur mit if(!(i2c_start(such))) abgefragt wird. Wenn jetzt der Bus hängt kommt man auch nicht mehr raus. Ein eventueller Stop Befehl hat gar keine Wirkung
Wenn man aber bei 1 einen Bus reset macht, wird die nächste Abfrage an einen andere Slave funktionieren.

Ich hatte das gleich in die library eingebaut, zB:


zB:
Code:
void i2c_stop(void){
unsigned short timeout=0;
 //uint8_t   twst;
    /* send stop condition */
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
   // wait until stop condition is executed and bus released

    while((TWCR & (1<<TWSTO))&& ++timeout);

    if( TW_STATUS & 0xF8 == TW_BUS_ERROR) 
        { // TWI aus, Pause, wiedereinschalten.
        TWCR &= ~((1 << TWSTO) | (1 << TWEN));
        _delay_ms(2);
        TWCR |= (1<<TWEN);            
        } 




    _delay_us(5);



}/* i2c_stop */