Arduino Giga crasht / interrupts

Hallo miteinander

Mit dem nachfolgenden ... einfachen ... Code crasht mein Arduino Giga reproduzierbar
sobald der Sketch hochgeladen wurde (rot blinkende LED).

Ziel ist es , eine Reihe von Tasten gesichert abzufragen. (daher Benutzung von ISRs)
Im Endeffekt sollen es mal 12-15 Tasten werden.

Hinweis:
Sobald ich testweise die beiden mit xyz gekennzeichneten Zeilen lösche/auskommentiere,
läuft der Sketch.... aber das nützt natürlich nichts.

Kann jemand helfen?

int MM;

void setup() {
  pinMode(34, INPUT_PULLUP);
  pinMode(36, INPUT_PULLUP);
  pinMode(38, INPUT_PULLUP);
  pinMode(40, INPUT_PULLUP);
  pinMode(42, INPUT_PULLUP);
  pinMode(44, INPUT_PULLUP);
  pinMode(46, INPUT_PULLUP);
  pinMode(48, INPUT_PULLUP);
  pinMode(50, INPUT_PULLUP);
  pinMode(22, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(34), ISR_34, FALLING);
  attachInterrupt(digitalPinToInterrupt(36), ISR_36, FALLING);
  attachInterrupt(digitalPinToInterrupt(38), ISR_38, FALLING);
  attachInterrupt(digitalPinToInterrupt(40), ISR_40, FALLING); // xyz
  attachInterrupt(digitalPinToInterrupt(42), ISR_42, FALLING); // xyz
  attachInterrupt(digitalPinToInterrupt(44), ISR_44, FALLING);
  attachInterrupt(digitalPinToInterrupt(46), ISR_46, FALLING);
  attachInterrupt(digitalPinToInterrupt(48), ISR_48, FALLING);
  attachInterrupt(digitalPinToInterrupt(50), ISR_50, FALLING);
  attachInterrupt(digitalPinToInterrupt(22), ISR_22, FALLING);

  Serial.begin(9600);
}

void loop() {
  if (MM != 0) {
    Serial.println(MM);
    MM = 0;
  }
}


void ISR_42() {
  MM = 42;
}
void ISR_40() {
  MM = 40;
}
void ISR_38() {
  MM = 38;
}
void ISR_36() {
  MM = 36;
}
void ISR_34() {
  MM = 34;
}
void ISR_44() {
  MM = 44;
}
void ISR_46() {
  MM = 46;
}
void ISR_48() {
  MM = 48;
}
void ISR_50() {
  MM = 50;
}
void ISR_22() {
  MM = 22;
}

kleiner Nachtrag

natürlich muss die 1. Zeile lauten:

volatile int MM;

aber das Problem bleibt bestehen

Was verstehst du unter „gesichert“?

Kannst du genauer erklären, wo du das Problem siehst, einen Pin, wo der Taster dran hängt, ohne ISR abzufragen?

Wenn deine Loop nicht schnell genug MM verarbeitet, gehen dir Tastendrücke verloren. Das ganze Konzept ist schon zum Scheitern verurteilt. Lerne wie eine Statemaschiene arbeitet, dann ist es gar kein Problem sogar mehr als 100 Taster sicher abzufragen.

Außerdem solltest du keine magic numbers verwenden. Gib den Variablen und werten sinnvolle Namen.

Schau mal nach, ob die Interrupts die gleiche Line nutzen wie andere.

1 Like

Hallo und vielen Dank für Eure Antworten:

Ich sollte voranschicken, dass dieser Sketch nur existiert, um das Problem zu extraieren und zu veranschaulichen.
Daher habe ich auch (noch) keine Variablen für die Anschlusspins verwendet.
Auch ist mir das Konzept Statemachines durchaus geläufig.

Bitte noch mal lesen:

"Mit dem nachfolgenden ... einfachen ... Code crasht mein Arduino Giga reproduzierbar
sobald der Sketch hochgeladen wurde (rot blinkende LED)."

Es gehen also keine Tasteneingaben verloren , sondern der Sketch läuft garnicht erst los.

Das Projekt wird später erheblich umfangreicher, so dass es lang laufende Programmbestandteile geben wird. Gerade daher wird die Ausführung der Loop-Routine (und weiterer Unterroutinen) erst recht noch langsamer werden. So ist die Verwendung Interrupts wohl angezeigt, damit ich an ganz bestimmten Punkten abfragen kann, ob eine Taste gedrückt worden war.

Dann hast du das Prinzip der Statemaschine nicht verstanden.

Du hast einen dual Core mit 480MHz

Hallo WWerner

wenn eine Berechnung (sagen wir mal) 1s lang dauert und die Anwendung in dieser Zeit eben gerade nicht in einen anderen Status gelangen soll

und zusätzlich

ich dennoch wissen möchte ob während dieser (langen) Zeit Tasten gedrückt wurden (und auch wieder losgelassen wurden) hat das mit der Leistungsfähigkeit des Prozessors nichts zu tun.
Die ISR soll hier lediglich das Ereignis (kurzer Tastendruck) festhalten.

Was berechnest du mit 480MHz was eine Sekunde dauert?

Wenn du auf ein Ergebnis wartest, geht das meistens auch blockadefrei.

Natürlich ist die Frage berechtigt, warum es in dem Beispiel zum Fehler kommt.

Dennoch könnte man den Fehler umgehen. Und mechanische Dinge gehören nun mal nicht an ein Interrupt.

Hallo Plumps

die Sekunde ist selbstverständlich nur ein Beispiel.
Es geht darum eine Berechnung (z.B eine Schleife oder einen Sortiervorgang oder ä.)
abzuschließen und dann erst gezielt auf einen zwischenzeitliches Ereignis zu reagieren.
Es soll ja nicht im Programm ständig nachgefragt werden, ober der Benutzer gerade im Moment eine Taste drückt.
Das ist ein klassischer Fall für Interrupt Service Routinen (ISR).

Ja Du hast recht: "Natürlich ist die Frage berechtigt, warum es in dem Beispiel zum Fehler kommt."
in der Beschreibung des Prozessors STM32H747xI/G von 2019 ist hier leider nichts auf Anhieb zu finden. Außer der Aussage das alle GPIO-pins Interruptfähig sind.
So ist es denn auch beim Arduino-Giga zu lesen: PIN-Nr. = interrupt Nr.

Daher bin ich ja so verblüfft.

Die Entscheidung zugunsten des Arduino GIGA fiel übrigens auch wegen des Giga Display Shields, das eine sehr gute Qualität hat und sich mit der LVGL-Library sehr schön programmieren lässt.
Den Test-Sketch habe ich ohne dieses Shield getestet um das Shield als Ursache auszuschließen.

Ich sehe die Notwendigkeit der Interrupts zwar nicht, aber wenn der User während der "lang laufenden" Arbeit mehrere Tasten drückt, bekommst Du nur die letzte. Das ist so gewollt?
Ich sehe Interrupts für Taster immer als Verschleierung schlechter Programmierung.

Gruß Tommy

1 Like

Hallo

in der späteren Anwendung gibts natürlich nicht nur die eine Variable volatile int MM so dass man selbstverständlich wissen kann welche Tasten gedrückt wurden und wenn man es will auch in welcher Reihenfolge ... aber darum gehts hier nicht.

Zur Anwendung von Interrupts (siehe Literatur: z.B. Bartmann Die elektronische Welt mit Arduino entdecken Seite 881 ff)

Bitte nicht ganz so schnell mit schlechter Programmierung "schießen". Das beantwortet im übrigen meine Eingangsfrage (Eingangsbitte) nicht.

Also die meisten Schleifen sind schneller durchlaufen als ein Taster prellt.
Und während du auf das Ergebnis des Sortiervorgangs wartest, muss der μC sich ja nicht langweilen (vielleicht meinst du auch was anderes).
Und doch, es sollte ständig einmal im Loop nachgefragt werden, ob eine Eingabe vorliegt.
Das Hauptproblem ist eher die blockierende Programmierung.

Und ja, beantwortet nicht die Frage des Startpost. Nur die Notwendigkeit des mechanischen Interupts ist nicht gegeben.

Bartmann ist in Fachkreisen nicht unumstritten.

Gruß Tommy

Dann liegt wohl dort der Fehler.
Arbeit mit Tasks, um den auf den anderen Kern auszuführen?

Gruß Tommy

Kenne dein Board nicht.
Und dein eigentliches Vorhaben interessiert mich auch nicht wirklich.
Dein Fehler kommt mir allerdings komisch vor.

Was ist. wenn du nur und ausschließlich einen der betreffenden Pins nutzt, schmiert es dann auch ab?

Noch mal zu meinem eingangs angegeben einfachen Sketch:
mit den 8 Tasten funktionierts
mit den Tasten an Pin 40 und 42 (und auch anderen) führt zum sofortigen Crash
Auf einem MKR1010 z.B. ist vergleichbares nicht zu beobachten. Auf diesem läuft meine Vorläuferanwendung stabil . Diese Anwendung möchte ich im wesentlichen portieren und erweitern.
Das GIGA-Board ist ja noch nicht lange auf dem Markt....

Vielleicht hat ja jemand eine Erklärung oder eine Information oder einen Hinweis.
Dafür wäre ich sehr dankbar.

Ich schlage vor, dass wir hier bitte nicht weiter über Interrupts bei Tasten diskutieren und wie man es auch anders machen könnte. Man könnte auch andere Hardware verwenden.

Wenn das eine Antwort auf meine Frage war (sein soll) dann verstehe ich sie nicht.

Hallo Combie

  • Fehler tritt auch bei Verwendung nur eines dieser pins 40, 42 auf
  • Fehler tritt auch bei ausschließlicher Verwendung eines dieser Pins auf
  • auch bei andern Pins z.B 52 , 53 gibts den Fehler
  • ich erkenne keine eindeutige Gesetzmäßigkeit

in der Tat merkwürdig.... mit diesem Board
https://store.arduino.cc/products/giga-r1-wifi

Danke für die Kernaussage!

Da das im Widerspruch zur Doku steht, könntest du das Problem hier melden, und auf Abhilfe/Klärung hoffen: Issues · arduino/ArduinoCore-mbed · GitHub