Bitte um Hilfe, mal wieder ein I2C Problem.

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.

Lieben Gruß
Alex

Was meinst Du? Sollen wir ohne Deine Sketch Lösungsmöglichkeiten auswürfeln?

Gruß Tommy

Tommy56:
Was meinst Du? Sollen wir ohne Deine Sketch Lösungsmöglichkeiten auswürfeln?

Gruß Tommy

Oh tut mir leid, das habe ich vergessen.
Hier mal die Master-SW:

// SW Master 
#include <Wire.h>
int pin3 = 44;  
int Motor=0; 

void setup()
{
Wire.begin();
pinMode(pin3,OUTPUT); 
}

void loop() {

 Wire.requestFrom(11, 1); //Slave-Adresse 11
 while(Wire.available()) 
 {
Motor = Wire.read(); 

 }
 if(Motor==1)
 {
  digitalWrite(pin3,HIGH);
  }
  else
  {
    digitalWrite(pin3,LOW);
    }
}

Gruß

Mein erster Ansatz, dass es weiterläuft, wäre ein Watchdog an der kurzen Leine.

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.

ein bzw. zwei „Pull-up's" sind auch vorhanden

Das ist ja mal eine sehr konkrete Information.

ich denke mal in irgendeiner schleife oder Routine.

Aha ja...
Ich denke mal die Schleife in Zeile 42.

Wenn ich ein Relay
(Freilaufdiode und mit Opto getrennt) auf dem Board schalte (AC 230V für Motor).

Für den Motor benötigst du einen Snubber.

Hallo combie,
danke für deine Anmerkung.
Pull-up’s= 8k
Der Motor besitzt einen Snubber R/C-Glied.
Freilaufdiode für Relay vorhanden.

@HotSystem
hier mal der Link ← klick mich

Lieben Dank
Alex

bib--kfc:
.....
Jetzt habe ich noch folgendes dazu hier gefunden:
LINK

Ist das der richtige Ansatz?

Wenn du mit dem Ansatz den Wackelkontakt im Beitrag meinst, dann ja, das ist der richtige Ansatz.

Du solltest den Aufbau möglichst ohne Wackelkontakt aufbauen.

HotSystems:
Wenn du mit dem Ansatz den Wackelkontakt im Beitrag meinst, dann ja, das ist der richtige Ansatz.

Du solltest den Aufbau möglichst ohne Wackelkontakt aufbauen.

Hm... ein "Wackelkontakt" habe ich nicht im System. Nur EMV am funken.

bib–kfc:
Hm… ein “Wackelkontakt” habe ich nicht im System. Nur EMV am funken.

Wenn es sicher kein Wackelkontakt ist, solltest du auch an die Relaiskontakte einen Snubber anbauen.
Der Funke bringt sicher dein System zum Absturz.

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? :slight_smile:

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.

Lieben Gruß

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.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.