Hallo Leute! Möchte gerne mittels I2C eine Verbindung zwischen zwei Atmegas (16 und 32) aufbauen. Leider klappt momentan gar nichts: Für den Master hab ich die lib von Peter Fleury verwendet. Ich hab daran nichts verändern, sollte eigentlich so klappen. Beim Slave bin ich mir da gar net sicher: Der Quellcode ist von Roboternetz (Überschrift: TWI Slave mit avr-gcc). Bin mir net sicher ob des so klappt... Mein Problem besteht momentan einfach darin, dass ich zwei Unbekannte habe, was die Fehlersuche recht schwierig für mich gestaltet. Hat hier irgendjemand eine einfache Routine für mich, mit dem ich zwei AVR´s mittels I2C kommunizieren lassen kann?Also eine für Master und eine für den Slave. Vielen Dank!
Hast du an die Pullupwiderstände gedacht die du zwischen SDA (Daten) und VCC und CSL(Clock) und VCC schalten mußt?
ja hab ich. wurden zu 2k2 dimensioniert.
Stelle mal meinen Quellcode online, vllt findet ja jemand den Fehler. Nochmal ne genau Beschreibung was ich in diesem Testprogramm machen will: Habe zwei PollinFunkBoards, die ich über ein IDE-Kabel zusammengeschalten habe. Am 3.Stecker des Kabels hab ich die Pullups reingeschalten (jeweils 2k2). Diese Boards haben am PortD Pin6 eine LED. Ich möchte jetzt dem Slave ein Byte schicken, welches diese LED einschaltet (also 0x01000000). Der Slave soll die Adresse 0x5 haben. Die Master Lib ist von peter Fleury. Die Slave lib von [[http://www.roboternetz.de/wissen/index.php/TWI_Slave_mit_avr-gcc]] rauskopiert. Leider tut sichnach dem Hochladen auf den Controller gar nichts. Hier mein Quellcode für den Master:
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 | |
Hier die Routine für den Slave
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 | |
Findet hier jemand einen Fehler! Wäre echt super, wenn mir jemandhelfen würde, bin am verzweifeln!! Vielen Dank!
Keiner der mir weiter helfen kann? Was ich bis jetzt rausgefunden habe: Die Interruptroutine des Slaves wird nicht aufgerufen. Hab da einen Befehl für ne angeschlossene LED reingetan und LED leuchtet zu keinem Zeitpunkt. Außderdem ist mir ein vermeindlicher Fehler bei der Slave lib aufgefallen: TWAR= adr; laut Datenblatt darf das LSB aber nicht für die Adresse benutzt werden. Hab das umgeändert in: TWAR= (adr<<1); trotzdem kein Erfolg:)
Gast
#1068623
> Hier die Routine für den Slave
wenn das alles an Programm ist, kann der Slave nicht funktionieren.....
Wahrscheinlich hast Du zu wenig von der "Slave lib " kopiert.
Otto
da hast du natürlich recht, dass das nicht alles ist: ich hab beim slave hier eine twislave.h mit eingebunden in die ich den Code von roboternetz (siehe link oben) kopiert habe
Hier mal die Routine für den Slave:
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 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
Alles was ich benötige ist eine Funktionierendes Beispiel um 2 uC per I2C kommunizieren zu lassen.... Man hört von i2c sehr viel interessante Sachen, gerade im Roboterbereich, aber funktionierende Routinen findet man (ich) nicht:(
Gast
#1068673
Doch - in der Codesammlung - das Assemblerbeispiel z. B. funktioniert einwandfrei. Das C-Besipiel: Beitrag "AVR TWI Master und Slave Funtionen in C" habe ich nicht getestet. Evtl. versuchst Du es mal damit. Gruss Otto
Assembler möcht ich nicht nehmen, da ich neben dem Bus noch viele weitere Funktionen implemetieren muss.Aber Danke schön! Im Moment kenn ich mich gar nimmer aus: Dein vorgeschlagenes Beispiel, löst das den ein Interrupt beim Slave aus? Die Verzweiflung zwingt mich jetzt ins Bett, vllt versteh ich morgen früh wieder mehr. Trotzdem vielen Dank!
Gast
#1068691
Du schriebst, dass Du keine Beispiele findest. Daher der Hinweis auf die Codesammlung. Evtl. vergleichst Du den anderen Slave mit Deinem, um den Fehler einzugrenzen. Die Slave-Adresse 0x5 ist mir persönlich ein wenig suspekt. Otto
Bin jetzt einen kleinen Schritt weitergekommen: Der Befehl "i2c_start_wait()" wartet ja anscheinend solange, bis sich der anzusprechende Slave meldet. ich hab nach diesem Befehl eine Portausgabe gemacht und eine LED angesprochen. Diese leuchtet auch tatsächlich, wenn ich die richtige Adresse eingeben (aber auch wenn falsche adresse und sehr oft reset bei master und slave, wohl aber eher dann ein zufälliges verhalten). Das heißt also: Der Slave reagiert schon. Nur die interruptroutine wird immer noch nicht aufgerufen...?? Welche Bedingungen müssen eigentlich herrschen, damit diese aufgerufen wird? Ausm Datenblatt werd ich momentan net schlau . Vielen Dank!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.