Im Prinzip hast Du recht - Ich seh da aber keinen Weg hin.Ich würde mal die gesamte Verarbeitung der Daten aus der ISR rausnehmen - die ISR sollte so kurz wie möglich sein. Dort gehört eigentlich nur die Abfrage des Timers rein.
Im Prinzip frag ich eigentlich nur den Timer ab und zieh den letzten gemessenen Wert ab und summiere dann die Werte 25 mal.
Erst bei 25 Durchlauf wird das Ergebnis übertragen.
Die komplette Interupt Routine ohne Registerrettung dauert übrigens 44 Prozessortakte = 2,75µs ohne Aufruf und Registerrettung ( Die ohnehin immer stattfindet ).
Die Berechnung in der Hauptroutine zu machen funktioniert leider nicht, weil allein die Displayausgabe 11ms dauert und somit mindestens eine Messung verloren ginge!
Da alle Variablen als Unsigned definiert sind, sollte das kein Problem geben.Du rechnest newcount-oldcount. Was passiert, wenn der Timer übergelaufen ist und newcount kleiner ist als oldcount? Du hast measure als uint32 und oldcount und newcount als uint16 definiert - kann das probleme geben? Ich denke eigentlich nicht.
Hab Ich auch des Öfteren schon so gemacht.
Die Lösung mit den kurzen 8ms hab ich so gewählt, weil nach 25 Durchläufen 200ms erreicht sind und somit das Ergebnis für die Ausgabe nur noch mit 5 multipliziert werden muß um die reale Frequenz zu erhalten.Die Lösung mit Loopcount finde ich auch nicht besonders elegant. Ich würde im Hauptteil eine Zeitgesteuerte Ausgabe basierend auf millis machen.
Trotzdem, abgesehen davon, das der größte Teil deiner Programmlogik in der ISR steht, wo er nicht hin gehört, finde ich keinen Grund, warum das nicht halbwegs ordentlich laufen soll.
Zudem kann TCNT1 bis maximal 65635 Zählen. Damit sind theoretisch Frequenzen bis 8MHz messbar, was auch gewollt ist ( Ich brauch mindesten 1,2MHz ).
Ich hab auch schon versucht 2 Timer hintereinander zu schalten und somit den kompletten Zählvorgang in Hardware zu erledigen.
Da die Timer aber dann wieder auf 0 gesetzt werden müssen, was ja nicht absolut gleichzeitig geschehen kann gab hier noch mehr Probleme.
Genau 200ms zu generieren ist mit den gegebenen 16Mhz Quarz und einem 8 Bit Timer nicht möglich.Übringens - was soll das eigentlich bringen, wenn du 25 Messungen in 8 ms Abstand machst? Dadurch wird es doch nicht genauer... (im Gegenteil) stell den Timer auf 200 ms, messe den Wert und gib ihn aus...
Ausserdem würde man so die max mögliche messbare Frequenz auf 327KHz beschränken.
Lesezeichen