Ich habe jetzt ein kleines Testprogramm geschrieben.
Wenn ich es ausführe, wird leider niemals "it works" ausgegeben..
Code:
import static haiku.avr.ATmega328p.*;
import haiku.avr.lib.arduino.WProgram.Serial;

public class SoftTWI {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Serial.begin(115200);
		
		Serial.print("init...");
		
		// Interne Pull-Ups aktivieren
		DDRB = 0x00;
		PORTB = 0xff;
		DDRC = ((0 << DDC0) | (0 << DDC1) | (0 << DDC2) | (0 << DDC3) | (1 << DDC4) | (1 << DDC5));
		PORTC = ((1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (0 << DDC4) | (0 << DDC5));
		DDRD = 0x00;
		PORTD = 0xff;
		
		// Adressregister (TWAR) auf Adresse setzen. Achtung: 1x links schieben, da Bit 0 für Global call verwendet wird
		TWAR  = (0x43 << 1);
		//TWAR |= (1 << 0); 
		// Kein Interrupt erlauben und ACK auf Adresse aktivieren
		//0<<twie kein Interrupt!
		TWCR = (0 << TWINT) | (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN) | (0 << TWIE);

		Serial.println("finished");
		
		while(true){
			if( (TWCR & (1<<TWINT)) != 0 ){
				
				Serial.println("it works!");
				// ACK und reset TWINT
				TWCR = (1 << TWINT) | (1 << TWEA) | (0 << TWSTA) | (0 << TWSTO) | (1 << TWEN) | (0 << TWIE);
			}
		}
	}

}
Wenn ich das ganze in C schreibe und den Interrupt aktiviere, wird die Interrupt-Routine aufgerufen. Die Initialisierung sollte also stimmen.

Hab ich irgendwas übersehen oder müsste eigentlich alles richtig sein?

Ich hab leider auch nur den NXT als Master. Bald werd ich mir aber einen zweiten AVR anschaffen. Vielleicht liegt es echt am NXT.