Forum: Mikrocontroller und Digitale Elektronik Kommunikation I2C bricht ab


von Timm (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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).

von Timm (Gast)


Lesenswert?

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();
 }
}

von Timm (Gast)


Lesenswert?

Ich vergleiche hier ständig den Statusregister. Daher sieht der Code so 
aus.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von stefanus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.