Forum: Mikrocontroller und Digitale Elektronik Overflows im Interrupt zählen


von Thomas (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


Lesenswert?

Ich sehe da eigentlich nur 1 Möglichkeiten:

Dein Input Capture löst immer noch aus.
Leg doch den Input Capture Softwaremäsig still, dann weißt du es ganz 
genau.

von Thomas (Gast)


Lesenswert?

Ah, gut. werde ich machen
Danke

von Thomas (Gast)


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?

von Karl H. (kbuchegg)


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)

von Thomas (Gast)


Lesenswert?

@kbuchegg

Danke für die konstruktive Kritik! Werde die genannten Punkte nochmal 
nacharbeiten, insbesondere meine merkwürdigen Berechnungen..;-(

Gruß
Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.