Hallo, Ich kommuniziere gerade mit drei uC über I2C Bus. Ein Master der die zwei Slaves adressiert und daten sendet. Nun habe ich gerade das Problem, dass der Master sobald er ein Slave gesehen hat die daten sendet aber den zweiten Slave garnicht anspricht. (Mein Ziel ist mit dem Master ein bestimmter Slave auszuwählen. Bsp.slaves 1-10). Der Master Code funktioniert bis jetzt. Vllt habe ich da ein Fehler drin. Habt ihr ein Tipp für mich Danke
Ich seh in deinem Code keinerlei Möglichkeit, wie die Variable 'address' jemals ihren Wert ändern könnte. Und da in der Funktion eine while Endlosschleife steckt, gibt es eigentlich nur noch die Möglichkeit, dass address per ISR verändert werden könnte. Der COde sieht allerdings insgesamt ein wenig seltsam aus. Ich akzeptiere, dass da wohl einige Makros im Spiel sind, aber das hier
1 | if((TWCR,TWINT)) |
macht 100% nicht das, was du dir davon versprichst (was immer du dir davon versprichst).
Da mache ich nur ne Überprüfung ob die bits gesetzt sind. Das hier wäre dann der main: int main() { //set bitrate TWBR = 10; //enable I2C TWCR = (1<<TWEN)|(1<<TWEA)|(1<<TWSTA); while(1) { I2C_master(); } }
Ich vergleiche hier ständig den Statusregister. Daher sieht der Code so aus.
Timm schrieb: > Da mache ich nur ne Überprüfung ob die bits gesetzt sind. Nö. Das machst du nicht. Du möchtest das vielleicht machen, tust du aber nicht. Hinweis: ein Komma-Operator hat in den wenigsten Fällen im Code was verloren. Es gibt nur ganz wenige, spezielle Fälle, an denen ein Komma-Operator sinnvoll ist. Und selbst die sind meistens so, dass man sagen könnte: na ja, das wär ohne Komma-Operator auch gegangen - der Kommaoperator hätte in erster Linie nie in C aufgenommen werden sollen, der ist den Ärger einfach nicht wert. Das hier
1 | if((TWCR,TWINT)) |
ist auf jeden Fall keine Bit-Abfrage. Das testet eigentlich nur, ob die Konstante TWINT ungleich 0 ist. Die Chancen dafür stehen recht hoch, denn wenn ich mich recht erinnere ist TWINT nicht das Bit 0 im Register. > while(1) > { > I2C_master(); > } > } Schön. 2 Fragen: wozu die Endlosschleife in I2C_master, wenn doch hier sowieso wieder eine drüber liegt. Wenn du sagst > dass der Master sobald er ein Slave gesehen hat die daten sendet > aber den zweiten Slave garnicht anspricht. wie soll das in deinem Code gehen? Ich sehe nirgends in deinem Code irgendeine Code Stelle, die mir sagen würde: Aha, jetzt geht es an den anderen Slave. Wenn ich es nicht besser wüsste, würde ich sagen: Jemand hat dir den Code für einen Slave geschrieben und jetzt änderst du auf gut Glück, in der Hoffnung, dass der zweite Slave auch irgendwie aktiv wird.
Krass, ich entwickle seit 20 Jahren in C (und anderen Sprachen). Dennoch habe ich diesen Komma-Operator heute zum ersten mal gesehen!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.