Forum: Compiler & IDEs Problem mit Frequenzzähler


von Daniel S. (enton)


Angehängte Dateien:

Lesenswert?

Hallo Leute

Ich wollte mir nen Frequenzzähler machen.
Aber in der Routine ist irgendwo der Wurm drin. Ich hab aber keine 
Ahnung warum( Routine im Anhang).

Anstatt das eine konstante Frequenz auf dem Display ausgegeben wird, 
beginnt es bei ca. 500 und zählt dann runter bis auf 0. Dort bleibt es 
dann stehen.

Wenn ich in der Frequenzberechnung uint64_t durch uint32_t ersetzte, 
zählt es von ca. 500 auf ca. 20 und fängt dann wieder von neuem an.
(Schätze das der Fehler irgendwo in der Berechnung liegt.)

Ich hab schon alles mögliche probiert, kann aber nirgends nen Fehler 
erkennen.
Wäre euch sehr dankbar, wenn ihr mir weiterhelfen könntet.

Falls jemand zufällig schon ne fertige Routine zur Frequenzmessung hat 
wäre auch nicht schlecht, falls sich der Fehler nicht beheben lässt.

Gruß Enton

von Karl H. (kbuchegg)


Lesenswert?

Ich kann nirgends sehen, wo du deine 'Stoppuhr' nach einer
Messung wieder auf 0 zurückstellst.

PS: Du treibst zwar ne Menge Aufwand um da möglichst auf einen
Takt genau zu messen, versaust dir das aber alles unter Umständen
damit, dass in deiner INT1 ISR viel zu viel passiert.

Während deine ISR mit der Auswertung und der Ausgabe auf das LCD
beschäftigt ist, kann ein weiterer Input Puls kommen. Der muss
warten, bis die ISR fertig ist und triggert dir dann sofort
wieder den nächsten Interrupt.

-> zumindest am Ende der INT1-ISR einen möglichen INT1 Interrupt
Flag löschen.

von Daniel S. (enton)


Lesenswert?

Wäre es geschickter die Ausgabe in die main Routine zu packen?

von Εrnst B. (ernst)


Lesenswert?

Daniel Schillinger wrote:
> Wäre es geschickter die Ausgabe in die main Routine zu packen?

Auf jeden Fall.

Und dann wärs natürlich noch sinnvoll, dein Signal nicht an den INT-Pin 
zu geben sondern an den Externen Clock-Eingang vom Timer0 oder Timer1 
(T0 oder T1-Pin). Dann kommt dein Interrupt (der TimerOverflow) nämlich 
nur einmal alle 256 (oder 65536) Takte, und du kannst wesentlich höhere 
Frequenzen genau auszählen.

von Daniel S. (enton)


Lesenswert?

> Und dann wärs natürlich noch sinnvoll, dein Signal nicht an den INT-Pin
> zu geben sondern an den Externen Clock-Eingang vom Timer0 oder Timer1
> (T0 oder T1-Pin). Dann kommt dein Interrupt (der TimerOverflow) nämlich
> nur einmal alle 256 (oder 65536) Takte, und du kannst wesentlich höhere
> Frequenzen genau auszählen.

Sehe ich das richtig?
Ich zähle mit dem Timer1 meine Zeit und mit dem Timer0 zähle ich meine 
positiven Flanken des Signals. Sobald der Timer0 dann nen Overflow hat, 
lese ich die Zeit aus, die der Timer 1 gezählt hat und berechne daraus 
meine Frequenz?

Noch ne kurze Frage zur Interruptflag:
Ich wollte die Interruptflag bei INT1 löschen(in der INT1 ISR):
1
INTF1=0;
Dann bekomm ich aber folgende Fehlermeldung:
main.c:82: error: invalid lvalue in assignment

Was mach ich da falsch?

Gruß Enton

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.