Hallo,

was Probleme machen könnte, wäre, wie Du das TWCR setzt, ich würde das nach Möglichkeit immer komplett neu beschreiben, also mit allen Bits die man braucht, nicht mit |= ändern.
Genauso TWSR, da spart man sich nix, eher das Gegenteil.

Und den TWI immer in einem definierten Zustand hinterlassen, bei einem Fehler spingst Du einfach mit return aus der function raus.

Ed:
Und ganz übersehen, das mit der ISR für den Slave klappt so nicht, denn nach jedem löschen von TWINT muss die ISR beendet werden, damit die beim nächsten auftreten wieder aufgerufen wird. Also das was beim Master mit der while-Schleife gemacht wird, die wartet bis das TWINT gesetzt ist !
Deswegen sollte man sich einen Status von ISR-Aufruf zu ISR-Aufruf mitgeben, um damit zu checken ob der Richtige Status zum richtigen Zeitpunkt auftritt. Deswegen hängt er sich jetzt auch. Das Beispiel im Wiki schaut ja soweit ganz gut aus, bis auf das mit TWCR

Was macht TW_STATUS, bzw wie ist das definiert ?