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.
Lesezeichen