Hallo zusammen, ich verzweifel langsam an TWI. Ich versuche eine Kommunikation zwischen einem Raspberry (Master) und einem Atmega8 (Slave) auf 12Mhz zu realisieren. Habe dafür die Variante von jtronics adoptiert. Ich möchte aber mehrere Kommandos verarbeiten können und die Daten je nach erhaltenen Kommando im Buffer aufbereiten (siehe IO.rar). Und genau das scheint das Problem zu sein. Denn die Daten die ich erhalte stimmen nicht. Meistens ist das erste Bit des 2ten Bytes fehlerhaft. In meiner Testversion klappt es noch gerade so das ich die richtigen Daten erhalte. Ich vermute das ich den Interrupt zu viel abverlange. Weiß aber leider nicht wie ich das umgehen kann. Vielleicht mache ich aber auch was ganz anderes falsch. Ich hoffe einer von euch kann mir helfen. Vielen Dank schon mal für eure Mühe. Liebe Grüße Baumwolli
Gast
#5372046
Benjamin W. schrieb: > IO.rar (9,41 KB, 0 Downloads) > test.rar (6,93 KB, 0 Downloads) Wie soll ich das mobil öffnen? Benjamin W. schrieb: > 12Mhz MHz! Willst Du nicht mal ein bisschen langsamer probieren? Nach Wikipedia ist TWI (I2C) bis 5Mb/s spezifiziert. Habe selber noch nie mehr als 100kb/s angewendet. Schafft das der Atmega überhaupt? Gruss Chregu
Gast
#5372055
Ein Schaltplan und ein Foto wäre jetzt nicht schlecht, besonders was den TWI Bus angeht. Denn oberhalb von 100kHz wird es anspruchsvoll.
Sorry da habe ich mich falsch ausgedrückt. Der atmega läuft auf 12mhz. An der twi/i2c Geschwindigkeit habe ich nichts geändert.
Gast
#5372087
> An der twi/i2c Geschwindigkeit habe ich nichts geändert.
Was soll das heißen? Mit irgend einem Wert musst du die Schnittstelle ja
initialisieren.
Der Default ist FCPU/16, also in deinem Fall fast 1MHz!
Sobald ich wieder zuhause bin werde ich auch den Schaltplan online stellen.
Stefan U. schrieb: >> An der twi/i2c Geschwindigkeit habe ich nichts geändert. > > Was soll das heißen? Mit irgend einem Wert musst du die Schnittstelle ja > initialisieren. > > Der Default ist FCPU/16, also in deinem Fall fast 1MHz! Korrigiere mich wenn ich falsch liege aber gibt der Master nicht den takt an? Für den nutze ich einen Raspberry an dem ich nichts weiter gemacht habe als i2c zu aktivieren und die python libary zu installieren. Mein python Skript werde ich gleich dann auch online stellen.
Gast
#5372136
Ich denke, da liegst du nicht falsch. Das der AVR dein Slave ist, war mir entgangen.
Hallöchen! Hab jetzt endlich die Zeit gefunden noch ein paar Daten nachzureichen. Zum einen das Python Skript mit dem ich die Daten auslese. Außerdem einen aktuellen Schaltplan. Und noch ein paar Erkenntnisse die ich gemacht habe. Mein TWI Interrupt sieht folgendermaßen aus.
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 | |
Dort machen die Aufrufe von hcWriteToI2c und hcReadFromI2c Probleme.
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 | |
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 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
Rufe ich diese Funktionen nicht auf und belege hcI2cBuffer mit festen Daten habe ich keine Probleme. Daher habe ich die Vermutung das ich den Interrupt zu viel zumute. Aber ist das überhaupt möglich? So wie ich I2C verstehe kann der Master einen Slave erst wieder ansprechen wenn dieser die Leitung frei gibt. Dafür muss er eine ACK oder NACK senden. Sehe ich das richtig? Wenn das so ist sollte der Interrupt nicht mehrfach gleichzeitig ausgeführt werden können. Ist das so oder habe ich da was ganz falsch verstanden? Als Workaround habe ich jetzt die Idee das immer erst ein Write Befehl abgesetzt werden muss. Dieser bestimmt das Kommando. In der main Funktion möchte ich dann prüfen ob sich das Kommando geändert hat und dazu passenden Daten in den Buffer laden. Danach können diese über den Read Befehl abgeholt werden. Werde mich gleich mal daran setzen und hoffe das ich damit Erfolge feier. Falls noch jemand eine Idee hat wie ich den Workaround umgehen kann würde ich mich sehr darüber freuen. Liebe Grüße Baumwolli
Gast
#5374059
Benjamin W. schrieb: > Mein TWI Interrupt sieht folgendermaßen aus. Du bist lang genug hier angemeldet um zu wissen wie längere Sourcen hier zu posten sind. Oder bist du soooooo schwer von Begriff? Keine Übersicht? Oder vielleicht beratungsresistent? Zum besseren Verständnis habe ich dir im Anhang die Regeln nochmal mitgegeben. Solltest du sie nicht verstehen und/oder nicht danach handeln können dann solltest du auch das Programmieren sein lassen. Es hat schon Sinn hier nicht das grosse Chaos ausbrechen zu lassen. Wenn es nicht anders geht kann man auch von Respektlosigkeit sprechen .... gegenüber der Community.
Gast
#5374125
Uiuiui aus meiner Sicht hast Du da viel zuviel Zeit in der ISR ... Man kann die Ints in der ISR freigeben, SEI, man kann sich damit aber auch viel Ärger einhandeln und ja, im Allgemeinen kann der Atmega nicht gleichzeitig mehrere ISR abarbeiten. Deswegen versucht man die ISR kurz zu halten.
Gast
#5374128
Achso, und nienienieniemals aus einem Empfangs-int heraus senden und warten bis Sendung abgeschlossen ist
vielen Dank Weinbauer! Dann werde ich wohl um den Workaround nicht rumkommen. Gestern konnte ich damit aber schon einige Erfolge feiern.
Sobald man als I2C-Slave einen MC einsetzt, braucht dieser Zeit, um in den Interrupt zu springen und ihn abzuarbeiten. Während dieser Zeit hält er SCL auf low, um dem Master zu sagen, daß er heschäftigt ist. D.h. der I2C-Master muß Clock-Stretching unterstützen. Tut Deine Master-CPU dies?
Danke peda für den heißen Typ! Hab nach kurzem googlen raus gefunden das der Broadcomm BCM2835 Prozessor auf dem Raspberry einen Bug hat und das Clock Stretching nicht funktioniert http://www.advamation.de/technik/raspberrypi/rpi-i2c-bug.html. Hab die Baudrate mal auf 10kHz gestellt. Jetzt klappt mein Code!
Beitrag #5374494 wurde von einem Moderator gelöscht.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

