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 |