Wie wäre es mit abwechselnd messen.
Druckbare Version
Wie wäre es mit abwechselnd messen.
Das kann ich fast nicht glauben.Zitat:
"zu früh gefreut". Man kann jeweils eine Frequenz ausreichend genau messen
Lässt Du den Timer frei laufen, oder setzt Du ihn (TCNT1) bei jedem INT Interrupt auf 0 ?
Wenn Du ihn auf 0 setzt kann es nie funktionieren, da der Timer beim esten der beiden auftretenden Interrupts auf 0 gesetzt wird. Der zweite Interrupt liest dann falsche Werte aus.
Lass den Timer frei laufen lies während der einzelnen INT Interrupts die aktuellen Zählerstände aus und zieh die jeweiligen vorhergehenden Zählerstände ab.
Das sollte funktionieren.
Wenn bei niedrigen Frequenzen die 65536 Stufen der Timers 1 nicht reichen kannst Du im Overflow Interrupt des Timers ein weiteres Register mit hochzählen lassen, das in die Berechnung mit eingeht.
Was dir jetzt immer noch passieren kann ist das was ich als Overtake Effekt bezeichne.
Der Timer steht kurz vor dem Überlauf, es wird ein INT 0 angelegt.
Während der Abarbeitung des INT 0 läuft der Zähler nach 0 über und würde einen Timer1 Overflow Interrupt auslösen. Da aber gerade ein Interrupt ausgeführt wird kann dieser Interrupt nicht ausgeführt werden.
Somit wird der Überlaufzähler nicht Upgedatet und es fehlen Dir bis zu 65536 Counts.
Bei Verwendung des ICP kann Dir das nicht passieren, weil der Zählerstand im ICP Register des Timers zwischengespeichert wird, meines Wissens ohne den Timer selber zu stoppen.
Da die Zeit vom Auftreten des ICP Interrupts bis zu Auslesen der Datei immer gleich lang dauert, dürften sich hier auch keine allzu großen Fehler einschleichen.
Die eigentliche Berechnung der Drehzahl sollte im Hauptprogramm stattfinden um die Interrupts nicht zu lange zu blockieren.
Feil noch mal ein wenig an deiner Software.