Arduino / Serial / I2C hängt sich bei schnellen Inputs auf

Hallo Leute,

woran kann es liegen, wenn sich das Programm / der serielle Monitor / der I2C-Bus bei schnellen Inputs aufhängt?

Aufbau:

  • Arduino Mega 2560 R3 per I2C an vier MCP23017 angeschlossen
    → Arduino benutzt Adafruit-Lib, um MCP23017 anzusteuern
    → Ich habe auch ohne die Nutzung der Library die Aufhänger
  • Raspberry Pi 4 per USB an Arduino angeschlossen (auch unangeschlossen hängt der Arduino sich auf)

Das Programm läuft gut, aber wenn schnelle Inputs (2-3 Schaltungen in der Sekunde) auftreten, dann hängt sicher der Arduino bzw. der serielle Monitor / I2C-Bus auf.

Ich werde morgen mit einem Oszilloskop überprüfen, ob der MCP23017 noch Signale an den Arduino sendet und lediglich dieser bzw. sein serieller Monitor hängt.
Egal ob ich den Raspberry Pi 4 an den Arduino per USB angeschlossen habe oder nicht hängt sich der Arduino bei schnellen Inputs auf.

Können grundsätzlich Serial.print(); Ausgaben zum “serial freeze” führen, ob Raspberry angeschlossen oder nicht, da diese trotzdem verarbeitet/ausgegeben werden?

In meinem Programm liest der Arduino den seriellen Bus auf Befehle vom Raspberry aus und sendet Rückmeldungen über vollzogene Schaltungen bzw. den Status von Eingängen zurück. Kann es sein, dass der Arduino seine eigene serielle Ausgabe wieder einliest und sich bei schnellen Ausgaben mit dem Einlesen stolpert?

Ich meine bei der Prüfung von

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;

    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }
        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

Anbei ist der vollständige Code, wenn jemand sich wirklich seine wertvolle Zeit nehmen möchte :slight_smile:
PS: Ich habe die Kommentarzeilen nicht angepasst, also nicht die Kommentare beachten :smiley: sorry

Vielen lieben DANK!!!

Gruß
Tobi

Arduino_-MCP23017-Adafruit_Library-_Haenger.ino|attachment (68.6 KB)

Hi, was meinst Du mit aufhängen? was soll den geschehen, und was geschieht wirklich? Und auch was von dem was Du erwartest , geschieht nicht?
2-3 Schaltungen / Sekunde ist ja so scharchlangsam, das bekäme der Arduino auch noch im Tiefschlaf hin. Gib auch bitte noch genaueres zu deinem Aufbau bekannt (Fotos/Schaltpläne) wie alles verbunden ist.

LG Stefan

Ich vermute, daß es genau umgekehrt ist, und sich der Arduino bei schnellen Outputs über Serial aufhängt. Zum Testen die Baudrate deutlich hochsetzen, und/oder überflüssige Ausgaben deaktivieren.

die Leseroutine aus den Serial Basics2 ist kaum die Fehlerursache, die läuft gut. Solange du keine Indexe überschreitest.

Es fehlen von dir

  • Schaltplan
  • Echtbild vom Aufbau worin man wirklich JEDES Kabel, jede Komponente erkennt
  • stell deine Kommentare im Sketch richtig,
  • formatiere den Sketch in der Arduino IDE mit STRG-T und stell ihn sauber neu ein

Hallo Freunde :slight_smile:

vielen lieben Dank für die schnellen Rückmeldungen!

Ich werde gleich mit dem Oszilloskop den I2C-Bus auf “hängen” prüfen und werde euch danach den Aufbau Aufzeichnen.

Die Kommentare im Code passe ich dann auch noch an und danke euch nochmals vielmals!

UPDATE:
Nach mehreren Messungen konnte ich sehen, dass ziemliche Spannungsspitzen auf die Inputs des MCP23017 “einschlagen”. Die MCP23017 Inputs sind mit 1kOhm Vorwiderständen + 10kOhm Pull-Down-Widerständen beschaltet. Deshalb kann man in den Messungen sehen, dass die Spannungsspitzen vom Stromstoßrelaiskontakt(grüne Messspitze), nach dem Vorwiderstand (1kOhm) vor dem MCP23017 Input gedämpft sind (blaue Messspitze im Diagramm).
Da trotzdem noch die Max.Ratings. des Inputs überschritten werden, steigt der MCP wohl aus und wartet auf einen Neustart oder es liegt am Arduino, dass dieser lediglich einen Neustart benötigt.

Auf die Kürze der Zeit habe ich einen grobe Skizze erstellt und angehängt, sowie die Screenshots der Messungen.
Ich werde diese noch in Ruhe analysieren und Rückmeldung geben.

Hallo liebe Helfer,

ich habe es gestern mal mit einer Pulldown-Schaltung am Eingang des MCP23017 versucht, jedoch streut der Stromstoßschalter immer noch Spannungsspitzen ein.
Daraufhin habe ich wieder die gezeichnete Pull-Down-Schaltung in Betrieb genommen und eine Zener-Diode 1N4733A an den Eingang des MCP23017 gehängt.
Nun war zu sehen, das sich die Spannungsspitzen am Eingang des MCP fast komplett erledigt haben. Es gab nur noch vereinzelt Überschreitungen über die 5V-Grenze, da die Diode abhängig von den Spannungsspitzen ggf. nicht schnell genug reagiert.

Habt ihr noch eine Idee, ob ich mit einem Kondensator die Spannungsschwankungen oder sogar Spannungsspitzen besser in den Griff bekommen könnte?

Vielen lieben Dank nochmal für eure Bemühungen!

Gruß
Tobi

Zumindest könnte ein Kondensator die Anstiegsgeschwindigkeit der Spannungsspitzen ausbremmsen, was der Z-Diode mehr Zeit zum reagieren verschafft.

Wie wär's mit einem ordnungsgemäß entstörten Stromstoßschalter, das Übel an der Wurzel packen?

Deltaflyer:
Zumindest könnte ein Kondensator die Anstiegsgeschwindigkeit der Spannungsspitzen ausbremmsen, was der Z-Diode mehr Zeit zum reagieren verschafft.

Das hatte ich gemeint und probiere ich gleich mit verschiedenen Kapazitäten und Bautypen aus.

DrDiettrich:
Wie wär's mit einem ordnungsgemäß entstörten Stromstoßschalter, das Übel an der Wurzel packen?

Das wäre mir am allerliebsten, jedoch weiß ich nicht, ob Eltako im Gegenzug zu meinen Finder keine Störeinstreuungen hat. Ich werde bei Gelegenheit mal ein Eltako testen. Es wäre wohl auf der 230VAC-Spulenseite eine Entstörung notwendig, jedoch versuche ich es erstmal noch auf der 5V-Seite mit RC-Verschaltungen und Zener-Dioden.

Vielen lieben Dank für eure schnellen Kommentare! :slight_smile: