Hi!

Da der Atmega als Master arbeitet brauchst du keine ACK hinter jedem Byte zu senden. Der Slave sendet das ack oder nack nach jedem byte das er empfängt.

Um zu sehen, ob ein byte richtig angekommen (ack) ist mußt du nach dem Senden TWSR anschaun.

// ****** send I2C byte, return TWSR & 0xf8
uint8_t i2csendbyte(uint8_t txbyte) {
// --- send data byte
.......
// --- return status
return(TWSR & 0xf;
}

0x18 für vom Slave korrekt empfangene Adresse
0x28 für vom Slave korrekt empfangenes Datenbyte
Da kann man die Adresse auch einfach als Datenbyte senden, muss halt nur die Antwort (TWSR) stimmen.

Das Gleiche solltest du auch für Start tun, dann ist 0x08 die richtige Antwort.

Immer schön eins nach dem Andern (Start, Adresse, Datenbytes) und jedesmal den Status prüfen.

Im Datenblatt des ATmega ist irgendwo eine Tabelle mit den Inhalten vom TWSR für alle möglichen Zustände.

PS: den Status als hex vorzudefinieren ist unschön, da gibs auch defines für..