uint8_t bitfolge2_ausgeben ( uint8_t bitfolge ) //gibt nur die einzelnen 8 Bits eines Bytes aus, das als Parameter übergeben wird, ohne strobe zu verändern. { int8_t x; Ausgang_DDR |= (1<=0 ;x--) //zählt 7...0 rückwärts. Muß 7..0 sein weil das x unten in "if( bitfolge & ( 1 << x ) )" eingesetzt wird. { Ausgang_PORT &= ~( 1 << Ausgang_SCL ); //clock auf low setzen //dies hier ist low-Wartezeit //hier vergeht auf dem Oszilloskop viel Zeit. Deshalb mal die Wartezeiten weg lassen. asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); if( bitfolge & ( 1 << x ) ) { Ausgang_PORT |= ( 1 << Ausgang_SDA ); //auf high setzen } else { Ausgang_PORT &= ~( 1 << Ausgang_SDA ); //auf low setzen } //dies hier ist die Wartezeit zwischen Datenflanke und clock-low-->>high-Flanke asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); Ausgang_PORT |= ( 1 << Ausgang_SCL ); //clock auf high setzen, L->H -Flanke übernimmt die Daten //dies hier ist high-Wartezeit asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); } //Ende for Ausgang_PORT &= ~( 1 << Ausgang_SCL ); //clock auf low setzen //Ausgang_PORT |= ( 1 << Ausgang_SDA); // Pullup einschalten Ausgang_DDR &= ~(1<: //mit clock auf Low beginnen (ist der Zustand nach start-condition) und mit clock auf low beenden (ist Zustand nach Bit8). uint8_t bitfolge2_ausgeben ( uint8_t bitfolge ) //gibt nur die einzelnen 8 Bits eines Bytes aus, das als Parameter übergeben wird, ohne strobe zu verändern. { int8_t x; Ausgang_DDR |= (1<=0 ;x--) //zählt 7...0 rückwärts. Muß 7..0 sein weil das x unten in "if( bitfolge & ( 1 << x ) )" eingesetzt wird. { Ausgang_PORT &= ~( 1 << Ausgang_SCL ); //clock auf low setzen 23c: 2f 98 cbi 0x05, 7 ; 5 ... asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); if( bitfolge & ( 1 << x ) ) 246: ca 01 movw r24, r20 248: 02 2e mov r0, r18 24a: 02 c0 rjmp .+4 ; 0x250 24c: 95 95 asr r25 24e: 87 95 ror r24 250: 0a 94 dec r0 252: e2 f7 brpl .-8 ; 0x24c 254: 80 ff sbrs r24, 0 256: 02 c0 rjmp .+4 ; 0x25c { Ausgang_PORT |= ( 1 << Ausgang_SDA ); //auf high setzen 258: 2e 9a sbi 0x05, 6 ; 5 25a: 01 c0 rjmp .+2 ; 0x25e } else { Ausgang_PORT &= ~( 1 << Ausgang_SDA ); //auf low setzen 25c: 2e 98 cbi 0x05, 6 ; 5 ... asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); Ausgang_PORT |= ( 1 << Ausgang_SCL ); //clock auf high setzen, L->H -Flanke übernimmt die Daten 266: 2f 9a sbi 0x05, 7 ; 5 ... //dies hier ist high-Wartezeit asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); 270: 21 50 subi r18, 0x01 ; 1 272: 30 40 sbci r19, 0x00 ; 0 { int8_t x; Ausgang_DDR |= (1<=0 ;x--) //zählt 7...0 rückwärts. Muß 7..0 sein weil das x unten in "if( bitfolge & ( 1 << x ) )" eingesetzt wird. 274: 8f ef ldi r24, 0xFF ; 255 276: 2f 3f cpi r18, 0xFF ; 255 278: 38 07 cpc r19, r24 27a: 01 f7 brne .-64 ; 0x23c asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); } //Ende for Ausgang_PORT &= ~( 1 << Ausgang_SCL ); //clock auf low setzen 27c: 2f 98 cbi 0x05, 7 ; 5 //Ausgang_PORT |= ( 1 << Ausgang_SDA); // Pullup einschalten Ausgang_DDR &= ~(1< return 1; else return 0; //Ausgang_PORT &= ~( 1 << Ausgang_SCL ); //clock auf low setzen, ist von vorher noch low. Ausgang_PORT |= ( 1 << Ausgang_SCL ); //clock auf high setzen } 28e: 81 70 andi r24, 0x01 ; 1 290: 08 95 ret