Unterbricht Interrupt delay?

Hallo liebe Gemeinde
ich frage mich ob ein externer Interrupt auch ausgeführt wird wenn ein Arduino gerade ein Delay befindet?
Falls die Frage Plattform abhängig ist, mich interessiert das verhalten bei einem Arduino Nano und/oder Uno.

Um die Frage zu konkretisieren, ich habe ein Programm das sich gerade in einem delay(x) befindet und ein externer Interrupt wird ausgelöst. Unterbricht das das delay oder wird der Code der an dem Interrupt hängt erst nach Beendigung des delays ausgeführt?

Herzlichen Dank fürs darüber nachdenken und mögliche Antworten!

MagierPhil

Warum probierst du das nicht aus?

Tipp:
Du könntest in den Quellcode des Delay schauen. Denn er liegt auf deinem Rechner vor und zudem im Internet öffentlich aus.

Hallo MagierPhil

Ja.

Eine Interruptanforderung unterbricht den aktullen Programmablauf, egal wo sich die CPU gerade im Programm befindet. Es wird eine ISR gestartet, beendet und die CPU arbeitet dort weiter wo es zu der Interruptanforderung gekommen ist.
Die CPU kennt keine delay() Funktion.

2 Likes

Ohne viel Nachdenken kann ich die Aussagen in #3 bestätigen, weil ich es schon ausprobiert habe :slightly_smiling_face:

Allerdings stelle ich mal folgende These auf: Dein Programm läuft auch ohne delay und vermutlich sogar besser!

Und ich stelle die (tausendfach bestätigte) These auf, dass delay() OHNE aktivierte Interrupts gar nicht richtig funktioniert.
Zumindest nicht auf AVR Arduinos.

Wie schon gesagt, der Grund findet sich in den Quellen(wiring.c).

Am Rande:
Es reicht ja bei @MagierPhil noch nicht mal zum Doku lesen!
Siehe: delay() doku

and interrupts will work as they should.

Und wenn man auf der Seite „Deutsch“ auswählt, muss man noch nicht mal englisch verstehen.

1 Like

Oder er hat sie nicht gefunden :slightly_smiling_face:

Ich habe sehr lange gebraucht, um die Referenz zu entdecken. Aber ich kann auch ewig vor einem Anschlagbrett stehen, ohne die für mich relevante Info zu finden. Jeder hat so seine Schwächen :blush:

1 Like

Häh? Deine These ist falsch. Denn der allgemeine Interrupt ist bei Arduino immer aktiviert und das delay funktioniert auch jederzeit.

Eine 1/2 Stunde habe ich dir jetzt Zeit gegeben, deine Behauptungen nochmal zu überdenken.

Jetzt wird Widerlegt!

Falsch!
Du selber verwendest cli(). (atomic)
Und was tut das?

Auch sind in ISR die Interrupts dekativiert.

Das ist eine Doppelwiderlegung!

Auch falsch.

Der Beweis:


void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  cli();
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(1000);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1000);                       
}

Wenn in einem solchen Fall delay() in Loop nicht funktioniert, dann auch ganz sicher nicht in ISRs

Ich verstehe nicht, wie du auf solche absurde Behauptungen kommst.
Gerade, weil ich genau weiß, dass gerade du es besser wissen müsstest.

Hallo,

selten so einen Unsinn gelesen. Jetzt baust du dir schon einen Strohmann zur Ablenkung auf und widerlegst deine eigenen Argumente. Du weißt doch hoffentlich selbst das cli() den allgemeinen Interrupt abschaltet. Darum und nur darum funktioniert dein Strohmann Bsp. mit dem delay nicht mehr. In Arduino ist jedoch der allgemeine Interrupt mittels sei() immer eingeschalten. Muss er ja auch sonst würde millis, delay und Co nicht funktionieren. Das beweist du ja sogar selbst indem du ihn mittels cli() bewusst ausschaltest damit delay und Co nicht mehr funktioniert.

Der TO wollte nur wissen ob irgendeine Interruptanforderung ein delay() unterbricht. Ja das tut es. Darum ging es. Nicht mehr und nicht weniger.

1 Like

Am einfachsten du löscht beide Posts, dann können sie sich auch nicht widersprechen.

Es gibt noch viele andere Möglichkeiten Unsinn zu machen, so dass (unter anderem) kein delay mehr funktioniert. Aber noInterrupts(); ist am nächsten am Thema.

Hallo Micha,

wenn du dir alles nochmal in Ruhe durchliest und ggf. abseits von diesem Thread alles notwendige gedanklich durchgehst, wirst du hoffentlich zur Erkenntnis kommen, dass meine Aussagen vollkommen korrekt sind. Es widerspricht sich absolut nichts. Nicht im Geringsten. Deine Zitate von mir sind weder falsch noch widersprechen sie sich. Sie sind einzeln und zusammen betrachtet richtig und im gesamten Kontext ebenfalls.

Egal, was du nimmst, bitte wechsele die Sorte.

mal ein Snickers reinwerf

1 Like

Typisch combie. Erst Nebelkerzen werfen und dann solche dummen Sprüche. Damit wäre ja alles gesagt. Macht was ihr wollt. Ich hoffe der TO nimmt die richtige Antwort für sich mit.

Danke paulpaulson
deine Antwort ist kurz und hilfreich.

Und ja ich habe einen Fehler gemacht. Es stimmt, unter delay steht es, nur könnte ich schwören das das letzte Woche noch nicht da stand. [wohl aber eher mein Fehler], habe die Seite definitiv gelesen. Die Hauptsache aber wohl überlesen. Sorry.
Ich weiß noch das ich mich geärgert habe das ich zu dem Thema nichts gefunden habe. Als ich nach Arduino+delay+Interrupt+unterbrechen (in verschieden Versionen) gesucht habe, habe ich einen Haufen Infos gefunden, wieso man in einem ISR kein Delay verwendet usw usw....

Habe wohl den Wald zwischen den ganzen Bäumen übersehen. Entschuldigung!

Wer keine Fehler macht, er kann auch nix lernen.

Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

1 Like

Danke werde ich haben, du auch :smile:

Sehe ich auch so... wünschte andere würden diese Sichtweise auch entdecken. :face_with_hand_over_mouth:

Ich sage nur soviel zu diesem Thema:

  1. Interrupts kann man ein und ausschalten.
  2. delay() verwenden ist meist keine gute Idee.
    Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.