Forum: Mikrocontroller und Digitale Elektronik Arduino I2C Probleme Sonsoren werden manchmal nicht gefunden


von Stefan B. (sebzat)


Angehängte Dateien:

Lesenswert?

Hallo,
bei meiner Schaltung werden die einzelnen Sensoren ab und zu nicht 
gefunden.
Meine Schaltung besteht aus 16 LM75 Sensoren, jeweils 8 auf einer 
Platine. Das Durchschalten zwischen den beiden Platinen regelt ein MUX. 
Zwischen MUX und den Platinen sind noch Extender (Aufbau siehe Datasheet 
Seite 10 Fig.9) geschaltet. Die Länge zwischen den jeweiligen Extender 
ist trotzdem nur auf max 10cm gehalten, soll später noch deutlich länger 
werden. Die einzelnen Datasheets sind angehängt.
Für Tipps oder Erklärungen zum Problem wäre ich sehr Dankbar.

Hier der Sketch:
1
#include <Wire.h>
2
3
4
void setup()
5
{
6
  Wire.begin();
7
8
  Serial.begin(9600);
9
  Serial.println("\nI2C Scanner");
10
  pinMode(5, OUTPUT);
11
}
12
13
14
void loop()
15
{
16
  for (byte i=1;i<3;i++){
17
    switch (i) {        // Der Digitalausgang 5 steuert den MUX
18
     case (1):
19
       digitalWrite(5, LOW);   
20
       Serial.println("Platine 1");
21
       break;
22
     case (2):
23
       digitalWrite(5, HIGH);
24
       Serial.println("Platine 2");
25
       break;
26
       Serial.println("Fehler Programm");
27
   };
28
  byte error, address;
29
  int nDevices;
30
31
  Serial.println("Scanning...");
32
33
  nDevices = 0;
34
  for(address = 1; address < 127; address++ ) 
35
  {
36
    
37
    Wire.beginTransmission(address);
38
    error = Wire.endTransmission();
39
40
    if (error == 0)
41
    {
42
      delay(1000);
43
      Serial.print("I2C Device gefunden an Adresse 0x");
44
      if (address<16) 
45
        Serial.print("0");
46
      Serial.print(address,HEX); Serial.print("   Adresse BIN: ");Serial.print(address,BIN);Serial.print("   Sensor: ");Serial.print(address-72,DEC);
47
      Serial.println("  !");
48
49
      nDevices++;
50
    }
51
    else if (error==4) 
52
    {
53
      delay(1000);
54
      Serial.print("Unbekannter Fehler an Adresse 0x");
55
      if (address<16) 
56
        Serial.print("0");
57
      Serial.println(address,HEX);
58
    }    
59
  }
60
  if (nDevices == 0)
61
    Serial.println("Kein I2C Device gefunden\n");
62
  else
63
    Serial.println("Fertig\n");
64
65
  delay(5000);           
66
  }
67
}

Hier ein Teil des Outputs vom Serialmonitor:
1
Platine 1
2
Scanning...
3
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
4
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
5
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
6
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
7
I2C Device gefunden an Adresse 0x4C   Adresse BIN: 1001100   Sensor: 4  !
8
I2C Device gefunden an Adresse 0x4D   Adresse BIN: 1001101   Sensor: 5  !
9
I2C Device gefunden an Adresse 0x4E   Adresse BIN: 1001110   Sensor: 6  !
10
Fertig
11
12
Platine 2
13
Scanning...
14
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
15
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
16
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
17
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
18
I2C Device gefunden an Adresse 0x4C   Adresse BIN: 1001100   Sensor: 4  !
19
Fertig
20
21
Platine 1
22
Scanning...
23
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
24
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
25
Unbekannter Fehler an Adresse 0x4A
26
Fertig
27
28
Platine 2
29
Scanning...
30
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
31
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
32
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
33
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
34
Fertig
35
36
Platine 1
37
Scanning...
38
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
39
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
40
Fertig
41
42
Platine 2
43
Scanning...
44
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
45
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
46
Fertig
47
48
Platine 1
49
Scanning...
50
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
51
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
52
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
53
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
54
I2C Device gefunden an Adresse 0x4C   Adresse BIN: 1001100   Sensor: 4  !
55
I2C Device gefunden an Adresse 0x4D   Adresse BIN: 1001101   Sensor: 5  !
56
I2C Device gefunden an Adresse 0x4E   Adresse BIN: 1001110   Sensor: 6  !
57
Fertig
58
59
Platine 2
60
Scanning...
61
I2C Device gefunden an Adresse 0x4E   Adresse BIN: 1001110   Sensor: 6  !
62
I2C Device gefunden an Adresse 0x4F   Adresse BIN: 1001111   Sensor: 7  !
63
Fertig
64
65
Platine 1
66
Scanning...
67
Kein I2C Device gefunden
68
69
Platine 2
70
Scanning...
71
Kein I2C Device gefunden
72
73
Platine 1
74
Scanning...
75
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
76
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
77
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
78
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
79
I2C Device gefunden an Adresse 0x4C   Adresse BIN: 1001100   Sensor: 4  !
80
I2C Device gefunden an Adresse 0x4D   Adresse BIN: 1001101   Sensor: 5  !
81
Fertig
82
83
Platine 2
84
Scanning...
85
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
86
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
87
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
88
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
89
Fertig
90
91
Platine 1
92
Scanning...
93
I2C Device gefunden an Adresse 0x48   Adresse BIN: 1001000   Sensor: 0  !
94
I2C Device gefunden an Adresse 0x49   Adresse BIN: 1001001   Sensor: 1  !
95
I2C Device gefunden an Adresse 0x4A   Adresse BIN: 1001010   Sensor: 2  !
96
I2C Device gefunden an Adresse 0x4B   Adresse BIN: 1001011   Sensor: 3  !
97
I2C Device gefunden an Adresse 0x4C   Adresse BIN: 1001100   Sensor: 4  !
98
I2C Device gefunden an Adresse 0x4D   Adresse BIN: 1001101   Sensor: 5  !
99
I2C Device gefunden an Adresse 0x4E   Adresse BIN: 1001110   Sensor: 6  !
100
Fertig

von Patrick C. (pcrom)


Lesenswert?

Hast du auch pull-ups HINTER der mux gesetzt ?

Weiter vielleicht noch ein hint : Du weisz es gibt auch multiplexer die 
durch I2C selektiert werden (zB PCA9547) ?

Patrick

von Stefan B. (sebzat)


Angehängte Dateien:

Lesenswert?

Habe diesen MUX verwendet weil ich den noch übrig hatte.
Ich schicke nur das DATA Signal durch den MUX und vor den Extendern hab 
ich an CLK und DATA jeweils 4k7 pull-up Widerstände, innerhalb der 
Extender sind jeweils am Ein und Ausgang 470 Widerstände.

Hab mal meine paintFähigkeiten ausgepackt und eine kleines Bild 
erstellt. Hoffe das Hilft dem Verständnis.

von Wolfgang H. (frickelkram)


Lesenswert?

Hi Stefan,

mit dem aktuellen Aufbau kannst Du das wohl noch ans Laufen bekommen. 
Ich zweifle aber stark daran das Du es über die 20m Twisted-Pair Kabel 
schaffst. Ich würde das Konzept umstellen und z.B. auf einen RS458 BUS 
wechseln. Der Kabelverhau dürfte auch nicht ohne werden. Ist der 
Kupferpreis nicht höher als der Preis für Sensor Schaltungen mit BUS?

von Wolfgang H. (frickelkram)


Lesenswert?

Welche Bauteile verwendest Du als Muxer? Kann es sein das die Muxer eine 
zu hohe Signalverzögerung ein schleifen? Du hast ja immerhin zwei davon 
hintereinander. Du solltest bei de größeren Kabellänge auch unbedingt 
das Signal regenerieren. Du wirst nach dem Kabel kein Rechtecksignal 
mehr haben. Bei einem entsprechend konstruierten BUS z.b. RS485 oder CAN 
wird das Signal in den Treibern (Empfang) regeneriert und auch der 
Sender hat eine, an das Kabel, angepasste Ausgangsimpedanz.
Machen Deine Muxer das? Du hast relativ niederohmige Pullups an der 
Leitung. Das sieht erst mal gut aus, wenn es auch noch nicht zu ganz auf 
die Kabel-Impedanz passen dürfte.

von Wolfgang H. (frickelkram)


Lesenswert?

Hast Du die Spec. vorliegen?
http://www.nxp.com/documents/user_manual/UM10204.pdf
Kapitel 7.5
Du kannst schon bei den 10cm Kabelwegen, bei so vielen Signalen Probleme 
bekommen, z.B. bei einem "wirren" Versuchsaufbau auf dem Steckbrett.

von PittyJ (Gast)


Lesenswert?

Bevor man groß herum rätselt: hänge doch einmal ein Oszilloskop direkt 
beim Arduino dran, und schaue was auf den Leitungen los ist.
Und vielleicht das gleiche noch mal bei den Sensoren, die fehlschlagen.
Dann können wir sehen, was an Signal noch durch kommt, und wo ein 
Problem liegen könnte.

von Stefan B. (sebzat)


Lesenswert?

Erst mal vielen Danke für die ganzen Hinweise. Werde Sie nach und nach 
Durchgehen und dann meine Ergebnisse hier mitteilen.

Danke

von Patrick C. (pcrom)


Lesenswert?

Mach dich sowieso eine Testroutine womit man die qualitaet von i2c 
uebertragung sehen kann, zB 1000x hintereinander checken ob ein 
bestimmtes adress present ist und dann die zahl geben. Das gibt dir ein 
viel besseres sicht in das Problem. Auch im zukunft.

Und wie gesagd einen Oszi drauf.

Ich habe hier ein system mit 8 i2c slaves, kabeln von ~5m ohne 
Extendern. Lauft zeit 4 Jahren ohne probleme. Aber busfrequenz habe ich 
sehr niedrig gesetzt, ich denke 100Hz oder ahnlich.

von Stefan B. (sebzat)


Lesenswert?

Moin, sorry dass ich mich jetzt erst wieder melde. hatte vorher keine 
zeit.
also zu meinem Problem.

Ich wollte das Arduino mit meinen Platinen an ein Oszi schalten, 
deswegen trug ich die komplette Schaltung zum Nachbartisch. Dann schalte 
ich das System ein und plötzlich funktioniert alles.
Ich weiß nicht, woran das liegt. Wahrscheinlich war eine Leitung locker 
aber das hab ich doch min 1000mal überprüft. Naja es läuft, sogar mit 
einer Kabellänge von min 12m. Ein längeres Kabel hatte ich nicht aber 
das ist auch völlig genug.

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.