Timer Interrupt?

Hallo Forum,

ich habe einen Arduino Leonardo und möchte die Zeit zwischen 2 Interrupts am selben Eingang messen
( ob low, change, rising oder falling ist erstmal egal).
Ich habe ein PDF von E.Bartmann über Interrupts gelesen und kann den Interrupt auslösen. Dann wollte ich eine
millis oder micros Funktion starten, bis zum nächsten Interrupt.. das hat aber noch nicht funtioniert.. ein
Freund sagte mir, das wäre sowieso eine schlechte Lösung, da ich so die ganze Zeit den Controller blockiere.
Ich solle lieber einen "Timer Interrupt" benutzen. Dazu habe ich leider keine passenden Informationen
(vorzugsweise auf Deutsch) gefunden. Hat jemand spontan einen Link/ PDF o.ä. das mir weiterhilft?

Vielen Dank vorab

Von welchen Zeiten zwischen 2 Impulsen reden wir?
Grüße Uwe

l_a_s_t:
Dann wollte ich eine
millis oder micros Funktion starten, bis zum nächsten Interrupt.. das hat aber noch nicht funtioniert..

Das kann natürlich nicht funktionieren, da immer nur ein Interrupt zur Zeit laufen kann. Wenn dieser eine Interrupt gerade läuft, dann sind alle anderen Interrupts gleichzeitig gesperrt. Und zwar bis der laufende Interrupt beendet ist. Erst dann können andere Interrupts zum Zuge kommen. Auch die millis() zählen innerhalb einer Interruptroutine nicht weiter, sondern behalten denselben Wert wie beim Eintritt in die Interruptroutine.

Interruptroutinen müssen KURZ laufen und innerhalb von wenigen Mikrosekunden beendet werden, wenn Dein Controller flüssig laufen soll.

Was Du in der ISR machen kannst: Du kannst bei einem Flankenwechsel innerhalb der ISR als "static" deklarierte Variablen nutzen, um Dir die Milli- oder Mikrosekunden zu merken, zu dem dieser Interrupt aufgetreten ist. Und beim Auftritt des nächsten Interrupts kannst Du dann anhand der Differenz ermitteln, wie lange der letzte High- oder Low-Impuls gedauert hat. Und den Wert dann in einer "volatile" deklarierten globalen Variablen ablegen, zur weiteren Verarbeitung in der loop.

Hallo,

Darf ich auch was fragen?
Wenn die millis() während der Interuptabarbeitung nicht weitergezählt werden, dann kann man doch die millis() hinterher nicht genau auswerten. Dann fehlt doch immer etwas an "gezählter Zeit"? Oder muß man damit leben?

@ last:
Dein Kumpel meint delay(), das blockiert den µC. millis und micros sind "nur" "Zeitzähler" die man selbst auswerten muß. Die blockieren den µC jedoch nicht.

Also, vielleicht mal im Detail was ich langfristig machen möchte:
Ich hab aus einem Kugellager, ein bisschen Metall und 2 alten Tischtennisbällen an Anemometer gebastelt.
Damit möchte ich die Windgeschwindigkeit erfassen. Entweder über eine Lichtschranke (die aber verschmutzen
könnte) oder mit Hall- Sensor. Und um die Geschwindigkeit zu erfassen, brauche ich ja die Zeit... die wollte
ich zwischen zwei Impulsen (zum testen wollte ich hier Taster nehmen... da fällt mir aber grade auf, die prellen ja...)
Genau, also... ich steh grad auf dem Schlauch, wie ich mein Problem am Besten löse... :~

PS: Ich wollte den millis oder micros erst in der Interruptroutine starten und dann irgendwie zur Berechnung übergeben....

Warum verwendest Du nicht "pulseIn()" zum erfassen der Zeit zwischen zwei Impulsen.
Oder aber auch einfach per Interrupt:
Bei meinem Anemometer habe ich es ein wenig anders gemacht.

Es gibt eine ISR die einen Counter hochzählt, bei jedem Impuls am IR-Eingang (fallende Flanke)
0) Counter auf 0 setzen

  1. die Startzeit ermitteln mittels millis()
  2. ISR per attachInterrupt() aktivieren
  3. ca. 30 Sekunden was anderes machen (timing über millis())
  4. ISR per detachInterrupt() abschalten
  5. Endzeit mittels millis() nehmen
  6. Anzahl der Impulse zählen (Wert des Counters) und vergangene Zeit ermitteln (Endzeit - Startzeit) und damit ausrechnen wie lange ein einzelner Impuls durchschnittlich gedauert hat. Daraus dann die Windgeschwindigkeit berechnen.
    Mario.

Machs mit pulseIn() und einem vernünftigen Timeout. Das Windrad wird eine Mindestwindstärke brauchen, damit es sich dreht. Den Timeout mußt Du dementsprechend wählen.
Grüße Uwe

Hallo Allerseits,

dieser Thread ist schon ziemlich alt.
Trotzdem möchte ich noch etwas Senf dazu geben.

Die Drehzahlmessung für einen Wind-Anemometer läuft vermutlich im Bereich einiger hundert Hertz.
Für Zeitmessung von solchen Drehzahlsensoren biete sich der "Input-Capture"-Interrupt an; die Funktion wurde extra für sowas erfunden.
Mit Input-Capture wird die Zeit zwischen zwei positiven oder negativen Flanken des EIngangssignals gemessen.
Hierzu wird der Zählerstand des zugehörigen Zähler per Hardware, also automatisch, bei einer erkannten Signalflanke in ein Register zwischengespeichert und ein Interrupt ausgelöst, mit dem der Event bearbeitet werden kann.
Wenn man in der Interrupt-Routine den Zähler explizit auf 0 zurücksetzt, kann man sehr genau Zeiten zwischen den Flanken messen. Die o.g. Lösungen sind dagegen weniger genau; die Frage ist, wie genau brauchst Du die Drehzahl?

Was die Verwendung von Taster zur Erzeugung von externen Interrupts angeht: ein einfaches RC-Glied entprellt ihn effektiv.
Jeder RESET-Taster arbeitet so.

LG, sepp2gl