Da meine Frage nach einem Beispiel eher im Nirgendwo geendet hatte mache ich nun einen Hilfe-Thread auf. Ich habe es nun soweit mal geschafft dass er vom Master die Startcondition erkennt und empfangen kann. In der USI Overflow-ISR wird das USI Data Register auf dem Port A auf LEDs ausgegeben. Man kann dort die vom Master gesandte Slave-Adresse + R/W erkennen. Das ganze leider um eine Bitposition nach links verschoben. Also das R/W Bit befindet sich nun eben an der Stelle von Bit 1 anstatt der Stelle von Bit 0. Das siebte Bit der Slave-Adresse fehlt dann natürlich. Warum ist denn das so verschoben? mfg Paul H.
1  | .include "tn26def.inc" ; Deklarationen für ATtiny26  | 
2  | |
3  | .equ twi_addr = 100 ; TWI Adresse  | 
4  | |
5  | |
6  | .cseg ; Programm-Flash  | 
7  | rjmp init ; Reset-Einsprung  | 
8  | |
9  | .org 0x007 ; USI Start Interrupt  | 
10  | rjmp usi_start  | 
11  | |
12  | .org 0x008 ; USI Overflow Interrupt  | 
13  | rjmp usi_ovf  | 
14  | |
15  | |
16  | .org 0x00C ; Interrupteinsprünge übergehen  | 
17  | |
18  | init: ldi R16, RAMEND ; Stapel anlegen  | 
19  | out SP, R16  | 
20  | |
21  | ldi R16, 0b11111111 ; PortA als Ausgang  | 
22  | out DDRA, R16  | 
23  | |
24  | ; USI Control Register  | 
25  | ldi R16, (1 << USISIE) | (1 << USIOIE) | (1 << USIWM1) | (1 << USIWM0) | (1 << USICS1) | (0 << USICS1)  | 
26  | out USICR, R16  | 
27  | |
28  | sei ; Interrupts aktivieren  | 
29  | |
30  | |
31  | |
32  | loop: rjmp loop ; Endlosschleife  | 
33  | |
34  | |
35  | |
36  | usi_start:  | 
37  | in R16, USISR ; Start Condition Interrupt Flag zurücksetzen  | 
38  | ori R16, (1 << USISIF)  | 
39  | out USISR, R16  | 
40  | |
41  | reti ; Kehre zurück  | 
42  | |
43  | usi_ovf:  | 
44  | in R16, USIDR  | 
45  | out PORTA, R16  | 
46  | |
47  | reti ; Kehre zurück  |