Hallo,
Vorab, ja, ich habe mich schon im Internet dumm und dusselig gelesen über derartige i2C Probleme.
Ich komme leider mit meinem Verständnis nicht weiter. Mein Aktueller Aufbau :
1x Master (MEGA 2560)
2x Slave (328 P)
Mein I2C hängt sich Master-seitig auf, ich denke mal in irgendeiner schleife oder Routine.
Während der Master hängt laufen die Slaves munter weiter (Prüf-LEDs blinken).
Wenn ich dann nur beim Master den Reset drücke, funktioniert wieder alles.
Ich vermute mal das es ein EMV Problem bei mir ist. Wenn ich ein Relay
(Freilaufdiode und mit Opto getrennt) auf dem Board schalte (AC 230V für Motor).
Die I2C länge beträgt ca. 5cm und ein bzw. zwei „Pull-up's“ sind auch vorhanden. Dieser Fehler oder auch
(ich nenne es mal) „Hänger“ vom i2c vom Master kommt sporadisch,
je nachdem wie oft das Relay geschaltet wird und wie er den Phasenverlauf vom Sinus erwischt (inrush-current) gibt es diese „Hänger“… mal dauert es 2-5 Tage oder auch 2-6 Stunden bis der „Hänger“ wieder auftaucht.
Für den I2C benutze ich die „Wire.h“.
Am Mega sind es die Pin’s „PD0“ und „PD1“.
Jetzt habe ich schon öfter gelesen, dass die SW bei so etwas tatsächlich in irgendeiner schleife hängen bleiben kann, wenn ich das richtig verstanden habe?
Jetzt habe ich noch folgendes dazu hier gefunden: LINK
Ist das der richtige Ansatz?
Lieben Gruß
und danke schonmal im Voraus für euere Hilfe.
bib--kfc:
Für den I2C benutze ich die „Wire.h“.
Am Mega sind es die Pin’s „PD0“ und „PD1“.
Jetzt habe ich schon öfter gelesen, dass die SW bei so etwas tatsächlich in irgendeiner schleife hängen bleiben kann, wenn ich das richtig verstanden habe?
......
Wenn alles richtig programmiert ist, kann sich nichts aufhängen.
Was und wo hast das gelesen. Ein Link wäre doch hilfreich.
Guten Morgen :-),
Danke für deine Antwort, die Snubber an den Relaiskontakten sind auch schon vorhanden.
Durch diese Maßnahmen ist es ja auch schon deutlich besser geworden als ohne Entstörung.
Aber... dass ich immer den Resetknopf am Master drücken muss nervt mich schon ziemlich hart.
combie schrieb:
Aha ja...
Ich denke mal die Schleife in Zeile 42.
War das ernst gemeint oder habe ich da den Sarkasmus nicht rausgehört?
ElEspanol schrieb:
Mein erster Ansatz, dass es weiterläuft, wäre ein Watchdog an der kurzen Leine.
Dein Beitrag habe ich erst jetzt gesehen.
Oha… das hört sich interessant an, so etwas habe ich noch nie benutzt, wie funktioniert das genau und was kann ich mir darunter vorstellen?
Danke für euren support.
wd finde ich hier den falschen Ansatz.
a) solltest du rausfinden, wo dein Sketch wirklich hängen bleibt, z.B. mit reichlich Serial.print Ausgaben.
b) wenn es wirklich der Master Sketch sein soll (was meines erachtens nicht erwiesen ist) kommt ja nur die while schleife in Frage. Du willst eh nur ein Byte lesen, dann würde ich da statt dem while ein if wire.available machen.
c) die digitalWrite würde ich nur bei einer Änderung des Wertes Motor machen. Also einen "alten" Wert merken und wenn der Alte vom neuen unterschiedlich ist, nur dann digitalWrite ausführen.
d) Komplexität reduzieren: wenn ich mir den kurzen Master Sketch ansehe, dann frag ich mich auch, warum überhaupt zwei Controler notwendig sind. Warum hat dieser eine digitalWrite nicht am anderen Controller Platz?
bib--kfc:
Dein Beitrag habe ich erst jetzt gesehen.
Oha… das hört sich interessant an, so etwas habe ich noch nie benutzt, wie funktioniert das genau und was kann ich mir darunter vorstellen?
Das ist sicher der falsche Weg.
Damit würdest du einen fehlerhaften Sketch nur weiter fehlerhaft betreiben und dir u.U andere Probleme einfangen.
Vermutlich liegt das bei deinem Projekt an falsch verlegten Kabeln, da du ja schon alles berücksichtigt hast.
Und das Relais für den Motor möglichst weit weg vom Controller montieren. Evtl. den Controller abschirmen (Metallgehäuse).
Hallo Dieter,
den Ansatz hatte ich auch, die SDA und SCL Leitungen sind auch so geroutet, dass es kein übersprechen gibt, mit Oszi geprüft.
und sonst sind auch alle Leitungen so kurz wie möglich.
Ich denke, dass es tatsächlich an der "Wire.h" liegt aber ich habe keine Idee/Ahnung wie ich das herrausfinden kann.
Ich vermute mal, dass ein EMV peak auf SDA/SCL die SW aus einer routine schießt.
bib--kfc:
Ich denke, dass es tatsächlich an der "Wire.h" liegt aber ich habe keine Idee/Ahnung wie ich das herrausfinden kann.
Wenn es die wire.h ist, die mit der IDE geliefert wird, dann ist diese Annahme def. falsch.
Bei mir läuft ein Projekt zur Pumpensteuerung schon jahrelang mit I2C zur Anzeige auf dem Display.
Zuerst traten ähnliche Probleme auf. Dann das Relais mit Snubber versehen und es wurde besser.
Danach das Relais weiter entfernt (anderes Gehäuse) aufgebaut, seitdem läuft es problemlos.