Pages: [1]   Go Down
Author Topic: Timer Interrupt?  (Read 934 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 252
Posts: 21283
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 140
Posts: 2898
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
God Member
*****
Karma: 13
Posts: 863
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.




Logged

Tschau
Doc Arduino

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-confuse

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 252
Posts: 21283
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: