Overflows im Interrupt zählen

Gast #2047794
Lesenswert?

Hallo,

mit einem Atmega 162 führe ich eine Frequenzmessung über ICP mit Timer 1 
durch, 0,5 bis 2 Hz. Nun möchte ich eine LED schalten, wenn innerhalb 
von ca 5 sec kein ICP ausgelöst wird. Habe die 50 Hz Auslösungen mit 
einem Stützkondensator abgefangen.

Die ISR (TIMER1_OVF_vect) zählt bei prescale 256 ca alle 4,5 sec 1 hoch.

In der ISR (TIMER!_CAPT_vect) wird die Overflow Variable 0 gesetzt.

Nun dachte ich, dass OHNE die Capture ISR der Wert nicht 0 gesetzt wird 
und sich, weil der timer 1 ja durchläuft, alle 4,5 sec die Variable um 1 
erhöht.
Ich lasse die Variable über UART ausgeben und sehe, dass sie sich NICHT 
erhöht. Ich verstehe nicht warum ;-(

Denn wenn das ginge, könnte ich ja über eine Bedingung NrOverflows > 2 
eine LED schalten, die anzeigt, dass das Messsignal fehlt.

Über einen Tipp würde ich mich freuen.

Thomas
Angehängte Dateien:
Gast #2047853
Lesenswert?

So:

ich hatte übersehen, dass die Overflowvariable in einer if Schleife 
gesendet wurde, die als Bedingung die ICP ISR hatte

if (UpdateUart)

Habe die ICP ISR rausgeschmissen und in die Overflow ISR zu

NrOverflows++:
UpdateUart = TRUE;

geschrieben. Jetzt bekomme ich eine steigende Ausgabe , ca alle 4,5 sec, 
allerdings

6, 12, 18, 24, 30....etc.

habe doch kein 6er Increment?

Woran kann das liegen?
#2047858
Lesenswert?

Thomas schrieb:
> So:
>
> ich hatte übersehen, dass die Overflowvariable in einer if Schleife

if ist keine Schleife.

Zum Wesen einer Schleife gehört es, dass etwas wiederholt wird. Deshalb 
heißt es Schleife. So wie ein Tonband, das man zu einer Schleife 
zusammenklebt, wieder und immer wieder dasselbe abspielt.
Wo wird bei einem if etwas wiederholt? if trifft eine Auswahl aus 2 
Möglichkeiten, aber da wird nichts wiederholt! if ist so gesehen eine 
Verzweigung in eine von 2 Möglichkeiten. Eine Abfrage.

Nicht alles wo ein { - } vorkommt, ist automatisch eine Schleife.

>
> 6, 12, 18, 24, 30....etc.
>
> habe doch kein 6er Increment?

Doch.
Sieh dir deinen Code noch mal an. Du zählst da in der Hauptschleife an 
einer Stelle ziemlich unmotiviert noch 5 dazu.

(Und rechnest mit deinen Messwerten möglichst sinnlos rundherum um nur 
ja möglichst viel Genauigkeit bei Rundungsfehlern während der Berechnung 
zu verlieren. Aber das ist eine andere Geschichte. Etwas weniger naiv an 
die Sache rangehen! Nur weil Mathematiker und Computerprogramme 
dieselben Symbole benutzen, heißt das noch lange nicht, dass da ein 
Zusammenhang besteht. Für einen Mathematiker ist  3/5*2 identisch zu 
3*2/5. Für deinen Computer ist das aber nicht so. Dein Mathematiker 
bringt in beiden Fällen 1.2 heraus. Dein C-Programm berechnet den ersten 
Ausdruck als 0 und den zweiten als 1)

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