Hallo, ich bin gerade am Aufbau einer I2C-Verbindung zwischen einem AtTiny2313 und dem FoxBoard G20. Ich habe nun das Problem, dass ich den AtTiny nicht "finden" kann. Mit dem Befehl "i2cdetect -y 0" werden die I2C-Adressen von 00h bis 77h durchsucht, ob sich Geräte melden. Beim AtTiny wird aber nichts erkannt. Andere Bausteine funktionieren. Muss man beim AtTiny zuvor noch irgendwelche Register setzen (Umschaltung SPI/I2C) oder ähnliches? Die Pinbelgung: AtTiny - FoxBoard 10 GND - J6.40 GND 17 SDA - J6.32 SDA 19 SCL - J6.31 SCL 20 VCC - +5V Der Bus hat 2 Pullup-R mit 4,7kOhm auf 5V. Um Hilfe wäre ich sehr Dankbar.
Gast
#3344914
Ähm, Im tiny muss ein I2C Slave Programm laufen? Gruß Sven
Gast
#3344980
Alex B. schrieb: > Muss man beim AtTiny zuvor noch irgendwelche Register setzen > (Umschaltung SPI/I2C) oder ähnliches? Du mußt vor allem erstmal ein Programm drauf flashen, was den Tiny zum I2C-Slave macht. Das Ding ist ein µC und wie jeder µC macht der ohne ein Programm erstmal garnix (jedenfalls nix sinnvolles).
Gast
#3345244
Und außerdem: Bist du sicher, daß die I2C-Leitungen vom FoxBoard TTL-Level haben? Meistens hat dieser ARM-basierende Kram nur noch 3.3 V Gruss, Heinz
Danke. Ich dachte die Adresse sei von Anfang an ansprechbar. Die 5V Busspannung sind ein Fehler von mir. Müssen natürlich 3,3V sein.
Gast
#3345514
Hi >Ich dachte die Adresse sei von Anfang an ansprechbar. Nö. Aber es gibt eine AppNote bei ATMEL: http://www.atmel.com/Images/doc2560.pdf Software: http://www.atmel.com/Images/AVR312.zip MfG Spess
Danke. Ich habs mittlerweile hinbekommen. Jedoch hab ich grad Verständnis Probleme. Ich schreibe vom FoxBoard zum Tiny mit dem Befehl:
1 | |
wobei die Routine so aussieht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Ich schreibe also den Wert 0x00 an das Register 0x02. Die Auswertung auf dem Tiny hat ergeben, dass wenn ich an Register 2 schreibe, ich auf "Wert == 2" abfragen muss, bei Register 1 auf "Wert == 1" usw., damit ich ein True erhalte. Ich kann jetzt aber nicht einfach auf irgendwelche Register schreiben. Daher die Frage auf welche kann ich? Die freien, auf dem Datenblatt mit Reserved gekenzeichneten? Passt das ganze so überhaupt wie ich das hier erkläre??? Kommt mir etwas komisch vor. Mfg Alex
Hallo, das Thema oben hat sich mittlerweile erledigt. Nun habe ich aber ein weiteres "Problem" bzw ein Verhalten, dass ich nicht verstehe. Zunächst mal der Code vom Master:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
ich möchte also die oben geschriebenen Werte dem Slave übergeben (ATTiny2313). Der hat folgenden Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
Wenn ich nun das Register "USI_DATA" abfrage, sind darin alle gesendeten Werte vom Master enthalten. Die If-Abfrage trifft also bei 3, 6 ... zu. USI_DATA ist ja aber nur ein 1 Byte Register. Wie können darin dann 5 Bytes enthalten sein? Und wie bekomme ich es hin, die Bytes einzel auszulesen?
Gast
#3462785
Alex B. schrieb: > /* Save received byte here! ... = USI_DATA */ Indem du an der Stelle, genau wie es im Kommentar steht, die empfangenen Bytes speicherst. Dazu machst du dir ein Array und merkst dir die aktuelle Schreibeposition. Dahin kommt dann dein Byte. [c] empfangsbuffer[akutelle_position] = USI_DATA; [c] Noch ein bisschen Verwaltungskram drumrum und eine Erkennung dafür, wann ein Datenpaket komplett ist, und du bist fertig.
Hi, das ist klar.
1 | |
2 | |
3 | |
Aber so wird in jedes tmp1-Byte der gesamt Inhalt geschrieben. Wie es dann aber weiter geht, kapier ich nicht. Hab mir das DB auch schon durchgelesen, blicks aber nicht. Wird nach jedem Byte ein Interrupt ausgelöst, oder wenn alle Bytes angekommen sind? Wann muss ich in tmp das nächste Byte angeben?
Gast
#3463442
Ich habe mit dem I²C des ATTiny2313 noch nicht gearbeitet, aber normalerweise wird für jedes Byte ein Interrupt erzeugt. Daher ist eine Schleife an der Stelle vollkommen ungeeignet. Du schreibst jeden Interrupt-Aufruf ein Byte in dein Array und wertest es aus, wenn du deine 5 Bytes hast.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.