Uno R3: Gibt es Software-Interrupts?

Hallo,

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.

Gruß,
Axel

Deine Frage deutet in eine Richtung:

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.

1 Like

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.

Gruß,
Axel

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.

1 Like

Für die bisherige Aufgabe ist delay() schon der richtige Weg, aber nun möchte ich das ganze erweitern und da stößt das Design an seine Grenzen.

Danke für den Hinweis mit yield(). Die Scheduler library wäre schon mal passend, läuft aber leider nicht auf dem Uno :frowning:

Gruß,
Axel

unsigned long yieldCount = 0;
void setup()
{
  Serial.begin(9600);
}
void yield(void) 
{
  Serial.println(++yieldCount);
}
void loop() 
{
  delay(500);
}

Läuft nicht?

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.

Super, danke!
Das ist das was ich brauche.
:smiley: :smiley: :smiley:

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.

Gruß,
Axel

Ob es wirklich der einfache Weg ist, wirst du später erkennen. Viel Glück.

Nein es gibt keinen Software Interrupt!

Das ist dagegen sehr wohl möglich!
Schließlich hat so ein UNO 3 Hardware Timer.
Mit dem WDT sogar 4 Timer.
Damit lässt sich sowas bauen.

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.

Bei dir kommen sehr viele "nicht" und "nichts" vor....
Versuche es doch mal aus positiver Sicht.

Ab wann ist Multitasking?
Was ist die einfachste Form, die unterste Grenze, ab der man/ich es Multitasking nennen darf, ohne mir dir zu kollidieren.

Wenn gewünscht, kann ich dir auch gerne meine Untergrenze benennen, denn ich habe "für mich" da schon eine recht klare Definition gefunden.

Da das Thema gelöst ist, hoffe ich mal, dass wir uns diese fast OT Diskussion leisten können.

@combie: Hast Du da mal ein Stichwort für mich, mit dem ich in der Doku suchen kann?

Ja: "Datenblatt"

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

Da er den millis()-Zähler erzeugt, ist dessen Verwendung im eigenen Code das einfachste, meiner Meinung nach. (BlinkWithoutDelay)

Die anderen Timer werden übrigens beim Uno R3 für PWM (analogWrite) verwendet.

Der Meinung bin ich auch. Das will der TO aber nicht. Siehe Post #3

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