Kommunikation I2C bricht ab

Gast #3549662
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
Angehängte Dateien:
#3549678
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).
Gast #3549718
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();
 }
}
#3549900
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.