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":
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); while (!(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.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:






Zitieren

Lesezeichen