Go Down

Topic: Re: Verständnisfrage Interrupt und Timer (Read 958 times) previous topic - next topic

sepp2gl

Hallo Allerseits,

bin relativ neu im Forum und lese mich durch die Threads zum Thema TIMER-INTERRUPTS.
Ich kenne mich sowohl mit Mikrokontrollern versch. Hersteller als auch mit der Verwendung von Interrupts aus, möchte sie in einem Arduino-Projekt nutzen.

Wenn ich durch die Foren lese, finde ich sehr viel Unklarheit darüber, ob Interrupts überhaupt Sinn machen.
Ich kann hier nur sagen: Es kommt darauf an:
1. wie oft die entsprechende Funktion genutzt wird; bei 1-mal pro Minute oder länger eher nicht
2. wie stark der Mikrokontroller rechenzeitmäßig ausgelastet ist, so dass wichtige Funktionen zeitlich nicht ausreichend oft oder zeitlich nicht ausreichend genau ausgeführt werden können.
3. wenn mehrere sehr schnelle Vorgänge gesteuert werden müssen, kommt man an Interrupts wohl kaum vorbei

Nun meine konkreten Fragen:
1. Ich möchte das Rad nicht unbedingt neu erfinden; gibt es bereits exisiterende Lösungen für die Initialisierung und
    Ausführung von Timer-Interrupts gibt. Wenn ja, wo?
2. welcher Timer wird von millis() und micros() genutzt? Ich möchte mit eigenen Timer-Funktionen die Funktion von
    vorhandenen Funktionen wie millis() nicht stören.

Für die Beantwortung dankt
sepp2gl


postmaster-ino

Hi

Bevor ich hier wiederkäue, was bereits im INet geschrieben steht, hier drei Links.
Dort steht auch, welcher Timer wofür benutzt wird.
http://www.hobbytronics.co.uk/arduino-timer-interrupts
https://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072
https://www.instructables.com/id/Arduino-Timer-Interrupts/

Hoffe, Das hilft Dir etwas weiter

MfG

Doc_Arduino

Hallo,

die Notwendigkeit für einen Interrupt sehe ich etwas anders. Hardware Interrupts sind in meinen Augen nur dann notwendig wenn der Zeitpunkt und dessen Auswertung maßgeblich sind. Wenn zum Bsp. schnelle Impulse gezählt werden müssen und keiner verpasst werden darf. Oder wenn die Zeit zwischen den Ereignissen gemessen werden muss usw.
Wenn die loop schnell genug ist um den Impuls erkennen zu können, Impuls muss eine entsprechende Länge haben, und mir der Abarbeitungszeitpunkt egal ist, Hauptsache der Impuls wird erkannt, dann kann man auch pollen. Bsp. dafür sind Taster. Die kann man oft und auch selten drücken. Der genaue Zeitpunkt spielt keine Rolle. Ist alles immer noch schnell genug um unter der Wahrnehmungsgrenze einer spürbaren Verzögerung zu bleiben.

Von der IDE vorgesehen ist folgendes. Findet man auch in den IDE Beispielen wieder.

attachinterrupt

detachinterrupt

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sepp2gl

@Doc_Arduino:
ich glaube, wir meinen das Selbe, sagen es nur anders. Es kommt darauf an.
Wenn einer nur zweimal am Tag einen Event verarbeitet, benötigt er keine Interrups.
Wenn er aber im Millisekundenbereich mehrere unterschiedliche Events hat, und mit einem 8-Bitter eh schon hart an der Kante rechnet, sollte er delay() und Warteschleifen vermeiden und Interrupts verwenden.
Generell sehe ich eigentlich keine systematischen Nachteile von Interrupts, egal was die EInsatzbedingungen sind,
jedoch viele Einschränkungen, wenn man Interrupts nicht nutzen will.

LG, sepp2gl

PS: Sorry für die späte Antwort: Ich  habe Deine Antwort gerade erst bemerkt.
Werde meine Benachrichtigungen aktualisierne.

uwefed

Nein, würde ich so nicht sagen.
Quote
Wenn einer nur zweimal am Tag einen Event verarbeitet, benötigt er keine Interrups.
Auch wenn nur selten, wenn die Reaktion auf das Ereignis im µS bereich sein muß, und der kontroller ziemlich ausgelastet ist ( Loopdurchlauf mehr als 1ms),  dann braucht es einen Interrupt.

Quote
Generell sehe ich eigentlich keine systematischen Nachteile von Interrupts, egal was die EInsatzbedingungen sind,
Ich schon. Interrups halten den Sketch an und führen den Interrupcode aus. Wenn jetzt der Interrupt zu häufig kommt dann kann der Hauptsketch ausgebremst werden.

Grüße Uwe


sepp2gl

...typischerweise führen Interrupts Funktionen aus, die höher priorisiert sind als die Hauptschleife (=Hauptsketch?),
und die ausgeführt werden MÜSSEN. Sollte die Interrupt-Last so hoch sein, dass die Hauptschleife nicht mehr ausgeführt werden kann, hat man ein generelles Problem mit der Rechenleistung. Dann bekommst Du die Funktion ohne Interrupts aber auch nicht mehr realisiert.
Dabei möchte ich es aber auch belassen.
Ich bin ja nicht hier um einen Glaubenskrieg zu führen.

Meine Frage bzgl. Timer-Interrupts sind dank der Antwort oben gelöst.
Meinen Dank an postmaster-ino.

LG, sepp2gl

agmue

#6
Feb 23, 2019, 10:57 am Last Edit: Feb 23, 2019, 11:03 am by agmue
... ob Interrupts überhaupt Sinn machen.
...
1. Ich möchte das Rad nicht unbedingt neu erfinden;
Als ich mich anfänglich mit Arduino beschäftigte, habe ich mich auch gleich auf Interrupts gestürzt, um dann festzustellen, daß ich sie nur sehr selten benötige. Daher kenne ich auch Timer-Bibliotheken, beispielsweise TimerOne, die einem das Beschreiben der Register abnehmen, eine Empfehlung kann ich aber nicht aussprechen.

Ich bin ja nicht hier um einen Glaubenskrieg zu führen.
Man kann Dinge immer aus unterschiedlichen Perspektiven beleuchten und kommt dann zu abweichenden Formulierungen.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sepp2gl

@agmue:
Habe mir soeben TimerOne und TimerThree angesehen.
Sind soweit ganz OK, erlauben aber nur Overflow-Interrupts, jedoch keine Capture/Compare Funktionen.
Stellen somit aber eine gute Basis für eigene Erweiterungen dar.

LG, sepp2gl

P.S.: Du hast Recht, was die dünne Wand angeht... ;-)

agmue

Stellen somit aber eine gute Basis für eigene Erweiterungen dar.
Sehe ich auch so. Und Doc_Arduino ist der Experte an Deiner Seite, er kennt sich da aus.

Es gibt auch eine unveröffentlichte Beschreibung mit einem Bergsteiger. Ich konnte mangels Wissen nur Rummeckern, was beduerlicherweise zur Demotivation führte. Eventuell freut sich da jemand über einen Co-Autor. Nur so eine Idee :)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sepp2gl


agmue

...Bergsteiger?  :-S
Es geht um eine anschauliche Erklärung eines Timers, in der auch ein Bergsteiger vorkommt. Der Autor hatte mir eine Kopie zum Korrekturlesen gegeben. Wie ich so bin, habe ich meine Meinung kundgetan, was zu meinem großen Bedauern zum Abbruch führte.

Ein Co-Autor könnte möglicherweise, so meine Idee, dem Projekt wieder Leben einhauchen. Als Unwissender fände ich das gut. Denn viele Dokumentationen bleiben recht oberflächlich.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sepp2gl

...strenger Lektor...so, so...
Habe es gerade versucht zu googeln.
Fand zwei Dateien namens index.php.
Werde aber nicht schlau daraus, was das nun mit dem Bergsteiger zu tun hat, u.s.w.

Diese Sache hat nichts mit den Thread zu tun
Details per PN, wenn nötig.

LG, sepp2gl


Doc_Arduino

Hallo,

um die aktuelle Verwirrung aufzuklären. Ich bin der Autor. Nach dem Dokument kannste jedoch lange im Netz suchen, du wirst es nicht finden. Das ging unter 3 Leuten privat rum. Das ist jetzt alles Insiderwissen. Das damalige "Gemecker" war schon berechtigt. Da ich selbst hohe Ansprüche an so eine Doku habe wurde das erstmal bis heute auf Eis gelegt. Weil einen Timer vernünftig und anschaulich zu erklären ist nicht einfach. Ich möchte keine unfertige Doku raushauen. Datenblatt abschreiben macht auch keinen Sinn. Deswegen habe ich es bis heute so gehalten jemanden an seinem konkreten Bsp. seine erforderliche Timereinstellung zu erklären. Das dazu.

In dem Thread hier gehts aber nicht wirklich um Timer sondern um allgemeine Interrupts - sagt mir mein Gefühl.

Uwe hat meine Sichtweise nochmals bestätigt. Interrupts sind allgemein nur notwendig wenn unmittelbar dem Ereignis folgend irgendwas ausgeführt werden soll. Wie oft das am Tag vorkommt ist dabei irrelevant. Alles andere kann man mit Polling erschlagen. Zu Polling zähle ich (meine Sichtweise) auch, wenn man in einer ISR nur ein bool Flag setzt und dieses im Hauptprogramm auswertet und zurücksetzt. Allerdings kann die ISR dennoch mehrfach aufgerufen werden bis zur Abarbeitung des Flags im Hauptprogramm. Man könnte dann in der ISR diese ISR abschalten und wenn im Hauptpropgramm verarbeitet und Flag zurückgesetzt wieder einschalten. Das sind aber Feinheiten wenn man weiß warum man das macht.

Der Millisekundenbereich ist im Grunde noch keine CPU Last in dem Sinne. Deswegen sollen ISR's immer so kurz wie möglich gehalten werden. Bestes Bsp. dafür ist millis(). Jede ms wird in der Overflow ISR der Counter inkrementiert. micros() wird "nur" aus dem ms Zählerstand und dem aktuellen Timercounter berechnet.

Vielleicht kannst du deine Frage nochmal konkretisieren um den Zusammenhang der Frage zuverstehen in Bezug Timer und dessen Interrupts. Ums abzukürzen. Overflow und Compare Match Interrupt kann man vom Timer alles einschalten. Compare Matches müssen nicht zwangweise einen Timer zugehörigen Pin schalten/toggeln.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

agmue

...strenger Lektor...so, so...
Ich schaue nochmal nach #0: Mir fallen zwei Kriterien ein, einen Interrupt nutzen zu wollen oder müssen:
  • Der zeitliche Abstand zwischen zwei Ereignissen soll möglichst exakt gemessen werden.
  • Das Ereignis ist kürzer als die Zeit für einen Loopdurchlauf.

Anmerkung zu 1: Der zeitliche Abstand zwischen den Ereignissen ist unerheblich.
Anmerkung zu 2: Gemeint ist die Zeit von beispielsweise Loop-Anfang bis zum nächsten Loop-Anfang, wobei ein Sicherheitspuffer eingeplant werden sollte. Problematisch dürfte die Einbeziehung anderer per Interrupt gesteuerter Ereignisse sein.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up