@Besserwessi: der Code oben ist ein Slave und kein Master (wie Du vermutet hast).

@oberallgeier: der Code oben läuft, so wie er oben zitiert ist. Allerdings fehlt dann die Funktionalität, mitten in der Übertragung oder nach irgendeinem Byte mit einer Stop-Condition oder Start-Condition vom Master zu operieren. Wenn man diese auskommentierten Zeilen aktiviert, werden die meisten Übertragungen allerdings durch fehlerhaft erkannte (aber nicht vorhandene) Stop-Condition abgebrochen. Das kann man so umschiffen:
Man fragt die Stop-Condition nur während der ersten SCL clock des nächsten Bytes ab, dann gibt es weniger Fehler aber die Funktionalität ist da.

man muß dazu folgende Code Sequenz im Code oben:
  • ; the master sends data to the ATtiny26
    ldi Temp1,(1<<USIOIF)+0x00 ;16 SCL edges
    out USISR,Temp1
    ldi Temp1,0 ;ACK=0
    out USIDR,Temp1 ;bit 0 will be send as ACK
    ; wait until the master sends the Data Byte
    write_2: ; sbic USISR,USIPF ;stop condition detected?
    ; rjmp main_loop
    sbrc Flags,START_DETECTED ;start condition detected?
    rjmp start_cond
    sbis USISR,USIOIF
    rjmp write_2




durch die folgende ersetzen:

  • ; the master sends data to the ATtiny26
    ldi Temp1,(1<<USISIF)+(1<<USIOIF)+(1<<USIPF)+0x0E ;2 SCL edges
    out USISR,Temp1

    ;wait for 1 SCL clock to detect stop condition or new start condition
    first_SCL:
    sbic USISR,USIPF ;stop condition detected?
    rjmp main_loop
    sbrc Flags,START_DETECTED ;start condition detected?
    rjmp start_cond
    sbis USISR,USIOIF
    rjmp first_SCL

    ldi Temp1,(1<<USISIF)+(1<<USIOIF)+(1<<USIPF)+0x02 ;14 SCL edges
    out USISR,Temp1

    ; wait until the master sends the Data Byte
    write_2:
    sbis USISR,USIOIF
    rjmp write_2


Als I2C Master benutze ich die Bibliothek von Peter Fleury, die man auf seiner Homepage herunterladen kann, und zwar den Part, der in rein in Software (ohne Nutzung des TWI-Moduls) für eine C-Compilierung in GNU-Assembler codiert ist.