Pollen, also das warten in einer Schleife auf eine Bedingung, ist immer schlecht.
Wenn deine Uebertragung nicht erfolgreich ist, bleibt der Controller haengen.
Besser eine if() abfrage die die weitere Programabfolge anstoesst und die z.B. nach 1000 erfolglosen Versuchen ein Errorflag setzt.
Nicht vergessen den Zaehlerstand zurueckzusetzen!

Bsp:
Code:
int i2c_readAck(void) 
{     
      TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);     
      if(TWCR & (1<<TWINT)) // Erfolgreicher Empfang: Wert wird zurueckgegeben
     {         
           return TWDR;
     }
      else // Bisher kein erfolgreicher Empfang: -1 als Fehlercode. 
           //Im Hauptprogramm kann man diesen Rueckgabewert dann auswerten bzw. zaehlen.
     {        
           return -1;
     }
}