Kann ein Interrupt nur extern ausgelöst werden?

Hi

Ich bin neue im Bereich Arduino und habe mich in letzter Zeit viel mit den Grundlagen beschäftig und bin nun bei Intterrupts angekommen. Jetzt lese ich oft das nur bestimmte Pins einen Interrupt auslösen können. Meine Frage kann denn ein Interrupt nur durch einen Pin Ausgelöst werden oder auch z.B. Durch Eingabe im Seriellen Monitor. Ich möchte nämlich einen Abstandssensor ( I2C ) sobald eine bestimmte Entfernung unterschritten ist, dass ein Interrupt ausgelöst. Ist das möglich? Ich habe ein paar Beispiele gesehen, die das mit den Timern im Arduino machen und ein paar mit einer Funktion ‘pin_isr‘ und attachinterrupt. Welche der beiden Varianten ist besser und welche ist für einen Anfänger vorteilhafter ? Freu mich über jede Anwort:)

Auf einem Uno haben alle Pins PinChangeInterrupts.

Interrupts die durch Pinveränderungen ausgelöst werden,
lassen sich natürlich auch von innen - durch Ändern der Pins - auslösen.

Anfänger meinen sehr oft dass Interrupts die einzige Möglichkeit ist um "sofort" auf etwas zu reagieren. Aber können dabei überhaupt nicht die Zeiten einschätzen. Taster z.B. bewegen sich im Millisekunden Bereich. Das ist eine sehr lange Zeit für einen µC.

Wenn man das eigentliche Programm vernünftig und nicht-blockierend schreibt kann man auch ohne Interrupts schnell genug auf Änderungen reagieren. Bei dir reicht es den Sensor einfach regelmäßig auszulesen. Interrupts braucht man da nicht

Das kann sehr gut sein, dass ich sie gar nicht brauche aber ich möchte ja lernen wie Sie Funktionieren und habe den hatte ich noch so rumliegen

Kerem28_03:
Ich möchte nämlich einen Abstandssensor ( I2C ) sobald eine bestimmte Entfernung unterschritten ist, dass ein Interrupt ausgelöst.

Wie funktioniert denn dein Abstandssensor ( am Besten ein Link dazu ). Kann der überhaupt ein Signal bereitstellen, wenn der Schwellwert erreicht ist?
Wenn Du ihn sowieso immer per I2C auslesen musst, macht ein Interrupt überhaupt keinen Sinn. Wer sollte den dann auslösen?

Dein Sensor arbeitet mit I2C und wird mit Software ausgelesen. Interrupts bringen da einfach nichts.

Sensoren die direkt Impulse ausgeben kann man dagegen Interrupts auzulesen. z.B. Durchfluss-Sensoren. Oder eine Lichtschranke

Wenn Du den Wert des Sensors über I2C holen mußt und dann noch kontrollieren willst ob er bestimmten Bedingungen entspricht dann rufe die entsprechende Funktion auf. Das geht am schnellsten.
Ein Aufruf einer Interruptfunktion ist auch nicht schneller.

Zusatzinfo.
Ein interrupt kann auch intern durch Zähler und Timer ausgelöst werden. Genaues findest Du im Datenblatt des Controllers.
Grüße Uwe

Also danke für die vielen Antworten aber Ich glaube ihr habt die Intention dabei nicht verstanden ( vielleicht falsch rübergebracht ). Also es geht mir da nicht darum einen guten oder schnellen Code zu haben, sondern um allgemein zu lernen wie die funktionieren was man damit alles machen kann und wie heißt es so schön learning by doing ( Jaja die Ironie das ich jetzt im Forum Frage versteh ich auch )
Also der Sensor ist ein vl53l0x Abstandsensor. Wie gesagt I2C Auslesen geht ohne Probleme hab es auch schon so gemacht, dass wenn mein Schwellwert erreicht worden ist der Arduino die onboard led abschaltet. Und das wollte ich eben mit einem Interrupt machen um es eben zu lernen. Falls ihr meinen Code haben wollt kann ich euch den gerne zeigen :slight_smile:

Ich denke schon, dass ich es verstanden habe. Aber vielleicht wäre ein halbwegs praxisnahes Beispiel besser gewesen. Du hast ja eigentlich gar nichts, was den Interrupt auslösen kann.
Klar, Du kannst einen Interrupt auf einen digitalen Pin legen, und von innen auslösen, so wie Whandall das schon ganz am Anfang geschrieben hat:

Whandall:
Interrupts die durch Pinveränderungen ausgelöst werden,
lassen sich natürlich auch von innen - durch Ändern der Pins - auslösen.

Also der Sensor ist ein vl53l0x Abstandsensor.

Das hat ja was gedauert .....

Naja..
Der vl53l0x hat einen Interrupt Output.
Das heißt zwar nicht, dass man den auch vom AVR im ISR Betrieb auswerten lassen muss...
Kann man aber!

Und für Übungszwecke ist das doch völlig ok.

Was man aber nicht machen darf:
In einer ISR den Baustein per I2C auslesen.
Zumindest nicht, ohne die ISR und Wire Reentrant zu machen.

Hallo,

"Ich möchte nämlich einen Abstandssensor sobald eine bestimmte Entfernung unterschritten ist, dass ein Interrupt ausgelöst."

Das bringt dir eigentlich nichts. Du musst den Sensor sowieso ständig auslesen. Ob per Polling oder Interrupt ist ziemlich egal. Wenn du den aktuellen Wert eingelesen, erst dann kannst du prüfen ob er deinen Mindestabstand unterschritten hat. Und genau an dem Punkt kannst du schon unmittelbar reagieren was dann passieren soll. Warum an der Stelle einen zusätzlichen internen Interrupt auslösen. Ich sehe dabei keinen Vorteil.

Der Interruptpin vom Sensor meldet nur das er ein neuen Wert zum auslesen zur Verfügung hat.

Besser wäre es es gebe einen Sensor wo man einen Schwellwert reinschreiben kann und der dann bei über/unterschreiten an einem Ausgang schaltet. Ob es sowas gibt weiß ich nicht.

Ok, der Sensor hat wohl eine einstellbare Messzeit und kann melden wenn eine Messung fertig ist. Praktisch wird es aber sinnvoller sein diese Zeit in Software einzuhalten. Wie z.B. beim DS18B20
Den eigentlichen Wert musst du immer noch per Hand auslesen. Du bekommst nur eine Meldung wann du das tun sollst

Und ja, du willst nur mit Interrupts spielen um zu sehen wie sie funktionieren. Da gibt es aber einfachere Anwendungen um was zu lernen. Wie gesagt kannst du in einem Interrupt kein I2C auslesen da das selbst Interrupts verwendet. Und auf einem AVR können sich Interrupts normal nicht gegenseitig unterbrechen. Das sind alles so Fallen in die Anfänger immer wieder stolpern. Sie sind anders als oft gedacht keine einfache Lösung.

Da muss man dann in der ISR nur ein Flag setzen auf das man in loop() abfragt. Das ist kein Problem, aber zwingt dich dann trotzdem dazu den Rest des Codes nicht-blockierend zu schreiben