Ich habe einen Uno R3.
Damit hat man die Möglichkeit, mit attachInterrupt() eine ISR an die Hardware Inputs 2+3 anzuhängen.
Gibt es auch die Möglichkeit, einen Software-Interrupt zu benutzen, so dass z.B. eine ISR alle 100ms aufgerufen wird? Damit könnte man kurze Aktionen durchführen, auch wenn er gerade mit delay() "beschäftigt" ist.
Sieh dir mal das Beispiel "Blink Without Delay" an.
Versuch mit diesem Beispiel zwei LEDs voneinander unabhängig blinken zu lassen.
Wenn du 3 LEDs blinken lassen kannst, wirst du delay kaum mehr benötigen.
Danke schon mal
Das Beispiel kenne ich und es zeigt wie man auf das delay() verzichten kann. So ähnlich programmiere ich auch beruflich, da wir viele verschiedene Dinge parallel erledigen müssen und uns dieses "Ausruhen" nicht leisten können.
Hier auf dem Arduino finde ich die Möglichkeit mit dem delay() deutlich entspannter und das lässt ein wesentlich einfacheres Design zu, ohne mit vielen Timern und State-Machines arbeiten zu müssen.
Allein schon die Anforderung während eines Delay was machen zu wollen deutet halt schon darauf hin, dass delay ungeschickt eingesetzt wurde.
Klar kannst einen Hardware Timer setzen und etwas periodisch auslösen. Genau das macht das Arduino Framework für dich und stellt dir millis() zur Verfügung. Da fragt man sich dann halt schon, warum man nicht gleich aus dem Einzeiler (delay) einen Zweizeiler (millis - previousmillis > Interval, previousMillis = millis() ) macht.
Oder du schaust dir yield() an.
Aber wenn man das braucht ist zu 99% der "entspannte" delay() Weg eben der falsche gewesen.
Edit:
Ich habe mir mal den Spaß gemacht. Neue portable IDE installiert. Uno gesucht (hat am längsten gedauert). Aufgespielt. Funktioniert einwandfrei.
Man kann Timer-Interrupts verwenden. In meinen Augen sind es aber mehr Zeilen Code als bei Millis. Und es ist im Programmablauf dann nicht sofort ersichtlich. Fehlersuche erschwert sich. Hinzu kommt, wenn du den Überlauf oder Prescaler änderst, Funktion die sich bereits auf diese Timer beziehen, störst, und noch mehr Fehler provozierst die du nicht schnell erkennst.
Ich hatte yield() in der Doku nur in Zusammenhang mit Scheduler.startLoop() gefunden. Da wär ich ja nie drauf gekommen, das das so einfach funktioniert.
Multitasking und Interrupts haben übrigens weniger miteinander zu tun als man denkt.
Jede Frage in diese Richtung geht vermutlich in die falsche Richtung.
Oh!
Für mich sind (Timer?) Interrupts die Urform, oder gar die unabdingbar notwendige Basis, für präemptive Multitasking Systeme.
Interrupts ist genau das Multitasking, was ein AVR schon in Hardware mit bringt.
Natürlich fehlen da dann noch so Feinheiten, wie Task Control Blocks, Stackswitching usw.
Aber vielleicht ist meine Sicht ja mal wieder gegen den Mainstream...
Also bitte nicht zuhören, am besten noch nicht mal ignorieren.
Das ist zwar richtig, aber dadurch auch sehr eingeschränktes Multitasking, das aus Sicht eines unbedarften Programmierers den Namen Multitasking nicht verdient, da man in einer Interrupt-Routine nichts darf. Z.B. keine Library-Funktion aufrufen, die nicht speziell dafür zugelassen ist, nicht mal Serial.print() oder delay()
Man beachte meine Verwendung des Worts weniger vor miteinander zu tun.
Oder:
Multitasking als Werkzeug, sich das Leben zu erleichtern, hat nichts mit attachInterrupt() zu tun.
Der Timer0 Overflow ist auf dem Uno schon in Nutzung.
Dieser Timer hat allerdings noch 2 freie Compare Kanäle, welche Interrupts auslösen können.
Insgesamt gibt es also noch 8 freie mögliche Timer ISR für dich