"Idee" der Interrupts so richtig?

Gast #3327952
Lesenswert?

Ich möchte ein Tachosignal auswerten / auslesen und habe mir folgendes 
überlegt um den µC nicht zu belasten:


1. Alle ..ms über einen Hardwaretimer einen Interrupt setzen und einen 
Eingansport an dem das Tachosignal sitzt abfragen.

2. in der Interruptroutine den Flankenwechsel nur in einer int-Variable 
mitzählen lassen und nach ..ms Interrupt verlassen.

3. die Datenverarbeitung findet dann in der main-Schleife statt.

So dürfte ich meinen µC nicht unnötig lange aufgehalten haben und 
trotzdem saubere Ergebnisse erhalten.


Jetzt habe ich nur ein Problem.. wenn der µC sich in einer 
Interruptroutine befindet wird der wohl kaum den Timer im Hintergrund 
weiterlaufen lassen..
Wäre es denn hier ok einen 2ten Timer im Interrupt laufen lassen der 
beispielsweise nur 2ms den Flankenwechsel aufzeichnet? Oder wäre damit 
ein Interrupt wieder überladen?


Danke & Gruß
Fillialleiter
#3327957
Lesenswert?

Fillialleiter schrieb:
> Jetzt habe ich nur ein Problem.. wenn der µC sich in einer
> Interruptroutine befindet wird der wohl kaum den Timer im Hintergrund
> weiterlaufen lassen.
Warum nicht?

Du könntest auch einfach beim Flankenwechsel am Port-Pin einen Interrupt 
ausführen lassen, ein Flag setzen und dieses dann in der Main-Funktion 
auswerten bzw. die Zeit messen.
Oder du kannst einen Timer asynchron als Counter zählen lassen, sprich 
das Tacho signal lässt den Counter hochzählen. In einem festen 
Zeitintervall (z.B. 1 Sekunde) guckst du dann wieviele Impulse der 
Counter gezählt hat.
Gast #3328007
Lesenswert?

Timmo H. schrieb:
> Du könntest auch einfach beim Flankenwechsel am Port-Pin einen Interrupt
> ausführen lassen, ein Flag setzen und dieses dann in der Main-Funktion
> auswerten bzw. die Zeit messen.

Hallo Timmo,

ich denke das ist die perfekte Lösung! Der Flankenwechsel am Pin + 
Interrupt wird kürzer sein als jede Lösung die ich mir einfallen lassen 
könnte. Werde dann einen festen Timer alle paar ms. abfragen & auf die 
Minute hochrechnen. Merci für den Hinweis!


Danke & Gruß ;O)
Fillialleiter
Persönliche Seite #3328953
Lesenswert?

Fillialleiter schrieb:
> 2. in der Interruptroutine den Flankenwechsel nur in einer int-Variable
> mitzählen lassen und nach ..ms Interrupt verlassen.

Warten in einer Interrupt-Routine ist eine schlechte Idee. Besser: In 
der ISR wird ein Zähler runtergezählt — falls er nicht bereits 0 ist. In 
main wird der Countdown-Zähler auf den benötogten Wert aufgezogen.  Er 
ist abgelaufen, wenn er den Wert 0 enthält, und kann dann neu aufgezogen 
werden.
Gast #3329733
Lesenswert?

Fillialleiter schrieb:
> ich denke das ist die perfekte Lösung! Der Flankenwechsel am Pin +
> Interrupt wird kürzer sein als jede Lösung die ich mir einfallen lassen
> könnte. Werde dann einen festen Timer alle paar ms. abfragen & auf die
> Minute hochrechnen. Merci für den Hinweis!

Kann aber auch nach hinten losgehen: Wenn du dir z.B. Störungen an 
besagtem Pin einfängst, laufen sehr viele Interrupts auf und dein 
Prozessor wird praktisch nur noch mit den Interrupts beschäftigt sein.
Also ggf. mit der externen Beschaltung noch etwas nachhelfen. 
Beispielsweise die Impulsrate, die an den Prozessor weitergereicht wird, 
mit einem Monoflop auf einen plausiblen Wert begrenzen.

Oder mal nachsehen, was der Prozessor so an Input-Capture-Einheiten 
bietet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren