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