Der erste Impuls am Eingang kommt an und der Timer läuft los und läuft jede ms über. Somit wird meine Zählervariable hochgezählt in der ISR. Wenn der 2. Impuls kommt stopt der Timer und ich lese aus wie hoch meine Zählervariable steht. Als beispiel nehme ich mal einfach 70. Jetzt weiß ich, dass zwischen 2 umdrehungen 70ms liegen. Ich rechne dann also 60000/70 = ~857 rpm.
Das mit dem aug 0 stellen muß so nicht sein.
Leg doch nach der Drehzahlberechnung die aktuellen Zählerstände in einer Variable z.B. Oldvalue ab.
Beim nächsten Drehzahlimpuls ziehst Du dann vom aktuellen Zählerstand diese Oldvalue Variable ab und erhältst als Ergebnis wieder deinen Zählerstand, der der Zeit zwischen 2 Impulsen entspricht. Den neuen aktuellen Wert legst Du dann widerum in der Variable Oldvalue, für die nächste Berechnung, ab.
Der Vorteil der Methode ist, das man bei jedem Geberimpuls eine Aussage über die Drehzahl machen kann und nicht nur bei jedem 2ten.
Wenn die Variablen als unsigned definiert werden, sollte es auch keine Probleme bei einem Zähler Überlauf geben, der ja zwangsläufig irgendwann stattfindet.
Allerdings darf natürlich die Zeit zwischen 2 impulsen niemals so lange werden, das der Zähler sich einmal komplett überholt.
Ich hab das so gelöst, das im Hintergrund ein Timer mitläuft, der bei jedem Interrupt Impuls hochgezählt wird. Wenn dieser Zähler eine bestimmte Grenze erreicht wird ein Flag gesetzt und in der Drehzahlberechnung das nächste Ergebnis als null dargestellt.
Ich glaube auch, wenn Du nur die Impuls Abstand Methode wählst, das Du mit dem ICP Pin ( Input Capture Pin ) genauere Ergebnisse kriegt.
Da es hier um mehrere Timer geht, hatte ich auch den ATMEGA 8 vorgeschlagen.