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
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.
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?
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)
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.