Wieso sollte die 2 nicht abgeholt werden? Sobald die Flanke kommt, wird die Interrupt-Routine garantiert ausgeführt. Egal, ob gerade ein wait etc. läuft. Der Interrupt hat ja Vorang! Die Zeit wird in der Interrupt-Routine in eine Variable gespeichert.

Trotzdem arbeite ich weiter am nicht-blockieredem I2C, der leider schon am Anfang nicht läuft. Hier mal der erste Block des Zustandsautomaten:

Funktionierende Version noch mit "while":
Code:
switch (I2C_Zustand)
		   {
		    case 0:  //TWIM_START 1

		  	 TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

			  while (!(TWCR & (1<<TWINT)));

	                  I2C_Zustand = 1;	 

		    break;

                    case 1:

                          //der zweite I2C Zustand etc.

                    break:
Jetzt will ich ja das while vermeiden und habe mir folgendes überlegt, dass leider nicht funktioniert:

Code:
switch (I2C_Zustand)
		   {
		    case 0:  //TWIM_START 1

		  	 TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

			  if (!(TWCR & (1<<TWINT)));
                            I2C_Zustand = 1;
	     
		    break;

                    case 1:

                         //der zweite I2C Zustand etc.

                    break:
Hier habe ich schon den Fehler, dass anscheinend die Bedingung immer wahr ist. Obwohl die Bedingung erst wahr sein dürfte, wenn der Empfang abgeschlossen ist.