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.
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.
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.
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.
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.
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.