Hmm
Deine Einrechnung der Overflows
1 | ergebnis = impulse;
|
2 | ergebnis = (ergebnis << 16) + zahl2 - zahl1;
|
ist falsch.
Wenn zahl2 kleiner als zahl1 ist (es also mindestens 1 Overflow gab),
dann zählst du einen Overflow zu viel.
(Annahme: es gab genau einen Overflow)
Der springende Punkt ist, dass durch die Differenzbildung Ende - Anfang
mittels unsigned Rechnung, du 1 Overflow nicht berücksichtigen
musst/brauchst. Solange deine Timerwerte so sind, dass du nicht mehr als
65535 Timerticks zählen musst, kommt durch die unsigned Subtraktion
IMMER das richtige Tick-Differenz-Ergebnis raus, selbst wenn da 1
Overflow dazwischen lag.
Ich hab jetzt die Zahlen nicht kontrolliert und nachgerechnet. Aber
durch den einen zuviel gezählten Overflow, kriegst du eine zu lange Zeit
als Messergebnis und dadurch eine zu geringe Geschwindigkeit.
Frage: kann es dir überhaupt passieren, dass dein Messergebnis den Wert
65535 übersteigt? Jetzt rein rechnerisch. Oder anders gefragt: Wie
schnell (bzw. langsam) müsstest du fahren, damit Endzeitpunkt -
Startzeitpunkt überhaupt größer als 65535 werden kann?
Denn wenn da jetzt 0.5km/h raus kommen, dann kannst du dir die ganze
Overflow Berücksichtung in der Berechnung komplett sparen. Du benutzt
den Overflow dann nur noch dazu um den Stillstand zu detektieren, alles
an Geschwindigkeit kleiner als 0.5km/ definierst du als Stillstand und
zeigst am Tacho 0 an. Aber wie gesagt: ich hab die Rechnerei nicht
gemacht und nicht nachgesehen, was da für Zahlen raus kommen.