Kabeltester mit Kurzschlußprüfung

Hallo,
ich hab ein Problem mit meinen kleinen Projekt. Ich hab einen Mega 2560 mit einen Elegoo 2.8" Display dran. Über die Digitalen Ports 22 bis 41 will ich ein zehn poliges Kabel testen.
Ich setz immer einen Ports als Ausgang und frage alle anderen nach der Reihe ab ob was ankommt, wobei Port 22-31 das eine Ende ist und 32-41 das andere Ende ist. Es wird immer der Port der als Ausgang gesetzt ist am Display ausgeben und die Eingänge, am welchen was angekommen ist, daneben ausgeben.

Problem ist, wenn ich zB eine Verbindung zw Port 22 und 23 habe, schreibt er am Display Port 22 23 und 23 22 was auch soweit passt nur schreibt er mir am offenen 24 ebenfalls 23 obwohl dieser nicht verbunden ist.

Vielleicht kann mir ja wer helfen

Danke

Kabeltester.ino (4.58 KB)

Wenn Du den Code mit Code Tags </> einfügst, wird er leichter lesbar.

Guten Morgen,

ich hoffe, so ist es besser.
Mein Programm setzt immer einen Pin auf Output und die restlichen werden dann mit Input_pullup abgefragt. Die Ports 22-31 werden in grün ausgegeben da es der Stecker an der einen Seite ist und die Ports 32-41 werden in rot ausgeben - zweite Stecker.
Es wird die Portnummer minus 22 ausgeben, damit die Pinnummer am Stecker zusammen passt.

Wenn ich mein Programm teste mit Pin 22 23 24 und 25 verbunden sollte am Display stehen:

0 1 2 3
1 0 2 3
2 0 1 3
3 0 1 2
4
5
6
7

usw
Die erste Ziffer gibt den Ausgangsport an und die in der Zeile folgenden die verbundenen Ports

Aber bei mit schreibt es

0 1 2 3
1 0 2 3
2 0 1 3
3 0 1 2
4 0 1 2
5
6
7

usw

Die fünfte Zeile ist mein Problem. Meine Vermutung ist, dass mein Programm nicht aus der if (sensorVal == LOW ) Schleife rechtzeitig rauskommt bzw die tft.println() noch einmal ausgeführt wird und somit in der nächsten Zeile noch einmal die letzte ausgeben wird.

void loop(void) {
  tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(BLUE);
  tft.setTextSize(1);

  bool sensorVal;


  for (int i = 0; i < 20; i++)
  {
    pinMode(i + 22, OUTPUT);
    digitalWrite(i + 22, LOW);
    delay(50);

    tft.setCursor(0, i * 10);

    if (i < 10) //Stecker 1
    {
      tft.setTextColor(GREEN);
      tft.println(i);
    }
    if (i >= 10) //Stecker 2
    {
      tft.setTextColor(RED);
      tft.println(i - 10);
    }

    int x = 1;

    for (int j = 0; j < 20; j++)
    {
      if (j == i) //wenn der Ausgangspin gleich dem Eingangspin ist, den Pin überspringen
      {
        j++;
      }


      pinMode((j + 22), INPUT_PULLUP);
      sensorVal = digitalRead(j + 22);

      delay(20);
      bool y = true;
      if (sensorVal == LOW )
      {

        tft.setCursor(x * 10, i * 10);
        x++;

        if (j >= 10)
        {
          tft.setTextColor(RED);
          tft.println(j - 10);
        }
        else
        {
          tft.setTextColor(GREEN);
          tft.println(j);
        }

        delay(20);

      }
      delay(20);



    }

  }


  delay(1000);
  delay(1000);
  //delay(1000);delay(1000);delay(1000);
}

nimo391:

if (j == i) //wenn der Ausgangspin gleich dem Eingangspin ist, den Pin überspringen

{
        j++;
      }

Das finde ich unglücklich, da du beim Test des letzten Pins eins höher als vorhandene Pins springst. Besser wäre die Testroutine nur auszuführen, wenn j ungleich i ist, also if (j != i) {Testroutine}.

Du musst nach Durchlauf der J-Schleife den I-Pin wieder zurücksetzen. Dein Problem kommt daher, dass Pin3 auf Output und Low bleibt bis j bei 3 angekommen ist. Also werden die kleineren Pins als verbunden getestet.

Es fehlt pinMode((i + 22), INPUT_PULLUP); am Ende der I-Schleife.

Noch eine Kleinigkeit:

      pinMode((j + 22), INPUT_PULLUP);
      sensorVal = digitalRead(j + 22);

      delay(20);

Das delay(20) sollte nach oben

      pinMode((j + 22), INPUT_PULLUP);
      delay(20);
      sensorVal = digitalRead(j + 22);

Ich würde den Ausgangspin überspringen mit

if (i==j) continue;

Funktioniert!!

Danke dir