Hi,

danke für die vielen Antworten, erstmal noch ein paar Informationen: Die Stromversorgungskabeln für alle Verbrauer werden über 6,5m lange Kabeln von der Steuerung zum Terrarium geführt. Parallel dazu läuft ein CAT6 Kabel für den I2C Bus.
Bei den Stromversorungskabeln sind 3 Kabeln dabei, die 3,5A PWM modulierten Strom führen, zum dimmen der Lampen. Das hat erstmal garnicht funktioniert. Ich habe dann direkt an die Steuerung eine kleine Schaltung mit CAN Bustreibern gehängt, die den standard I2C Bus auf Differentielle Signalübertragung umwandelt. Direkt beim Terrarium wird es wieder zurückgewandelt.
Der Standard-I2C Bus ist jetzt nur noch auf der Hauptplatine (ca. 30cm) und im Terrarium zu den einzelnen Sensoren (ca. 1,5m geschirmte CAN Kabeln).

Ich glaube hardwaremäßig kann man nicht mehr viel verbessern ohne viel Geld zu investieren. Und selbst wenn ich es durch Hardwareverbesserungen zum Laufen bekomme kann ich nie sicher sein dass es ewig funktioniert, z.B. wenn ich noch ein zusätzliches PWM Kabel dazulege oder so...
Lieber wäre mir das eleminieren von den Endlosschleifen im Programm.

Mit 10kHz Busgeschwindigkeit funktioniert es ca. 10 Sekunden, mit 2kHz ca. 5 Minuten.
Das heißt bei 2kHz kommt durchschnittlich alle 5 Minuten ein "Fehler". Wenn ich den fehlerhaften Wert verwerfe, wird eben alle 5 Minuten ein Wert verworfen, das ist total egal.

Irgendwelche Sicherungen gegen Überflutung wird es auch noch geben, aber das ist ja nicht das einzige Problem, das war nur ein Beispiel. Ich kann die Steuerung ja nicht alle 5 Minute resetten...

@lorcan: Ich habe die i2c_read Befehle auf if-Abfragen umgeschrieben, jetzt mach der Controller aber überhaupt nichts mehr. Ich glaube es dauert einfach ein bischen bis das TWINT Bit rückgesetzt wird, und diese Zeit muss man abwarten. Wenn man es aber ohne Schleife macht, also nur mit if, dann fängt er an mit dem Empfangen, fragt aber sofort ab ob er schon fertig ist. Das ist er natürlich noch nicht, also gibt er den Fehlercode -1 zurück. Dann führt er den nächsten Befehl aus, z.B. das nächste i2c_write zur Abfrage des nächsten Sensors... Obwohl er den letzten Wert noch garnicht empfangen hat.

Vielleicht reicht es aber auch, eine gewisse Zeit zu warten, anstatt zu warten bis das TWINT Bit rückgesetzt wird?
Weiß jemand wie lange ungefähr, oder wie man das berechnen kann?

lg
Christoph