Arduino Ausgabefehler

Hallo,

keine Ahnung wie ich mein Problem betiteln soll. Ich habe einen ganz kuriosen Fehler den ich mir in überhaupt nicht erklären kann.

// Output Pins
int Master[] = { 18, 19, 20 ,21};
// Input Pins
int Slave[] = {  22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50,  52};

const int SLAVES = 16;
// Piezo
const int piezoPin[1] = {  A8 };
int wert[2] = { 0, 0 };

const int FAKTOR_WERTE[4][16]={
  {212, 112, 209, 109, 214, 114, 211, 111, 208, 108, 000, 312, 309, 314, 311, 308},
  {216, 116, 207, 107, 219, 119, 203, 103, 217, 117, 225, 316, 307, 319, 303, 317},
  {202, 102, 215, 115, 210, 110, 206, 106, 213, 113, 125, 302, 315, 310, 306, 313},
  {204, 104, 218, 118, 201, 101, 220, 120, 205, 105, 000, 304, 318, 301, 320, 305}
};


void setup() {
  Serial.begin(57600);
   attachInterrupt(digitalPinToInterrupt(Master[0]), Pin18, RISING);
   attachInterrupt(digitalPinToInterrupt(Master[1]), Pin19, RISING);
   attachInterrupt(digitalPinToInterrupt(Master[2]), Pin20, RISING);
   attachInterrupt(digitalPinToInterrupt(Master[3]), Pin21, RISING);
}

void loop() {

  
  for (int i = 0; i < 2; i++) {
    // Zweifach auslesen um Störungen zu minimieren
    wert[i] = analogRead(piezoPin[i]);
    wert[i] = analogRead(piezoPin[i]);

    if (wert[i] > 20)
    {
     // Serial.println(wert[i]);
    }
  }

}

void getValue(int masterline){
  Serial.println(masterline); //UM DIESE LINE GEHT ES//
  for(int i = 0; i < SLAVES; i++){      
      if (digitalRead(Slave[i]) == LOW)
      {
        Serial.println(FAKTOR_WERTE[masterline][i]);
      }
  }
}

void Pin18() { 
  getValue(0);
}
void Pin19() { 
  getValue(1);
}

void Pin20() { 
  getValue(2);
}

void Pin21() { 
  getValue(3);
}

Mein Problem ist bei getValue(int);

Diese Zeile “Serial.println(masterline);” ist “eigentlich” unnötig und brauche ich nicht und jetzt kommt der Fehler.

Lösche oder Blende ich diese Zeile aus wird im folgendem if die Zeile nicht mehr geprintet, obwohl ich mir zu 200% sicher bin, dass der Code diese stelle erreicht.
Lasse ich “Serial.println(masterline);” bestehen, printet er mir auch IMMER und AUSNAHMSLOS die Zeile im folgendem if.

Wie kann das sein, gibt es dafür irgendeine Erklärung?

Schau dir mal deine loop an, die ist leer.
Wundert mich das da überhaupt etwas funktioniert.

(deleted)

HotSystems:
Schau dir mal deine loop an, die ist leer.
Wundert mich das da überhaupt etwas funktioniert.

In diesem Fall geht es auch nicht um den Loop. Sobald einer Pin 18,19,20,21 auf HIGH überschwappt wird doch der gewünschte Code ausgeführt.

Peter-CAD-HST:
Moin Hubii93
Was für einen Arduino verwendest du und erzeugt der Übersetzer Fehlermeldungen ?
Gruss Peter
und gesund bleiben

Ich benutze einen Arduino Mega 2560 R3. Eine Fehlermeldung gibt es nicht. Es ist total kurios.

Hubii93:
In diesem Fall geht es auch nicht um den Loop. Sobald einer Pin 18,19,20,21 auf HIGH überschwappt wird doch der gewünschte Code ausgeführt.

Ich benutze einen Arduino Mega 2560 R3. Eine Fehlermeldung gibt es nicht. Es ist total kurios.

Wieso geht es nicht um die loop ?
Wenn dein IRQ durchlaufen ist, muss es doch weiter gehen, oder ist dir das wurscht.

Wozu brauchst du dann einen Controller ?

(deleted)

Und solange Du nur einen nicht kompilierbaren Sketch zeigst, kann man gar nichts sagen.

HotSystems:
Wieso geht es nicht um die loop ?
Wenn dein IRQ durchlaufen ist, muss es doch weiter gehen, oder ist dir das wurscht.

Wozu brauchst du dann einen Controller ?

Nein so ist es nicht gemeint. Natürlich passiert im loop auch etwas, aber das ist ja für mein momentanes Problem unerheblich. Die IRQ ist das Herzstück meines Projekts. An der Stelle in der if Klausel, sende ich die das Ergebnis von FAKTOR_WERTE weiter an einen Server, sobald ich mir zu 100% sicher bin, dass das Ergebnis immer richtig angezeigt wird.

Wie gesagt gerade geht es für mich warum er mit dieser Zeile “Serial.println(masterline);” das Ergebnis printet aber ohne diese nicht.

Hubii93:
.....Eine Fehlermeldung gibt es nicht. Es ist total kurios.

Nee, das ist nicht kurios.
Du musst schon die Meldungen anzeigen und lesen.

MicroBahner:
Und solange Du nur einen nicht kompilierbaren Sketch zeigst, kann man gar nichts sagen.

Sollte wieder funktionieren, habe eine Klammer übersehen zu löschen

Hubii93:
Nein so ist es nicht gemeint. Natürlich passiert im loop auch etwas, aber das ist ja für mein momentanes Problem unerheblich.

Nein, in deiner Loop passiert nichts. Die ist LEER !!

HotSystems:
Nee, das ist nicht kurios.
Du musst schon die Meldungen anzeigen und lesen.

Falls es eine Fehlermeldung geben sollte, weis ich davon nichts. Wie würde ich mir diese ausgeben lassen können?

Hubii93:
Sollte wieder funktionieren, habe eine Klammer übersehen zu löschen

Schön dass du es jetzt gesehen hast.

Aber der funktioniert immer noch nicht.

Aktiviere mal deine Fehlermeldungen !

Peter-CAD-HST:
Moin Hubii93
Es ist extrem softwaretechnisch unangebracht im Interruptkontext Serial.print Anweisungen zuverwenden.
Gruß Peter
und gesund bleiben

Was wäre den dein Vorschlag? Ohne diesen Interrupt erkenne ich nicht zuverlässig das einer dieser PINS auf HIGH geht.
Wie kann ich ansonsten mein Ergebnis auf Richtigkeit überprüfen.

Hubii93:
Falls es eine Fehlermeldung geben sollte, weis ich davon nichts. Wie würde ich mir diese ausgeben lassen können?

Das ist jetzt nicht wahr, oder ?

Datei - Voreinstellungen

Meldungen.jpg

Meldungen.jpg

Hubii93:
Was wäre den dein Vorschlag? Ohne diesen Interrupt erkenne ich nicht zuverlässig das einer dieser PINS auf HIGH geht.
Wie kann ich ansonsten mein Ergebnis auf Richtigkeit überprüfen.

Keine seriellen Ausgaben im IRQ.

Der Hinweis von Peter (#19) Edit: und Dieter :wink: )ist essentiell: In einer Interruptroutine darfst Du keine Serial.print Anweisungen nutzen. Das kann zu beliebigen/kaum nachvollziehbaren Fehlern führen.

HotSystems:
Das ist jetzt nicht wahr, oder ?

Datei - Voreinstellungen

Wenn du damit meinst das der Code nicht kompiliert - Kann sein das ich beim kürzen des Codes für hier vergessen habe eine weiter Klammer zu löschen o.ä,… Habe gerade mein Laptop nicht zur Hand. Der Code ist natürlich kompiliert und hochgeladen auf meinem System. Ich dachte du meinst eher so etwas wie try { } catch {exception e} wie in C#.

MicroBahner:
Der Hinweis von Peter (#19) Edit: und Dieter :wink: )ist essentiell: In einer Interruptroutine darfst Du keine Serial.print Anweisungen nutzen. Das kann zu beliebigen/kaum nachvollziehbaren Fehlern führen.

Wie kann ich dann mein Ergebnis zuverlässig Prüfen?

Hubii93:
Was wäre den dein Vorschlag? Ohne diesen Interrupt erkenne ich nicht zuverlässig das einer dieser PINS auf HIGH geht.
Wie kann ich ansonsten mein Ergebnis auf Richtigkeit überprüfen.

Was sind das denn für Signale? Um welche Zeiten geht es denn da - sprich wie lange bleibt das Signal auf HIGH bzw auf LOW?