Zitat Zitat von markusj Beitrag anzeigen
Du könntest dich auf die erste Variante zurückbesinnen, statt einer Sekunde aber nur 1/10 lang Zählen und die gezählten Flankenwechsel dann in eine Geschwindigkeit umrechnen. Diesen Wert vielleicht noch etwas glätten und volia hast du eine feinere aber dennoch recht genaue Anzeige der Geschwindigkeit.
Ich glaube das geht genau in die Falsche Richtung.

Gehen wir mal von einer "Standard"-Geschwindigkeit von 10 km/h aus. Das würde bedeuten ich erhalte in einer Sekunde 65 Flankenwechsel. Für die gewünschte Auflösung von Zenhtel-km/h bräuchte ich hier aber mindestens einen Wert von 100.
Wenn ich jetzt das Zeitfenster noch kürzer wähle erhalte ich ja noch weniger Impulse, die ich nur mit einer größeren Zahl multiplizieren muss und dadurdch wird die Auflösung noch geringer.
Oder stehe ich gerade auf dem Schlauch?

Zitat Zitat von markusj Beitrag anzeigen
Zu den anderen Problemen: Nur die Zeit zwischen zwei Flanken zu nehmen, stellt höhere Ansprüche an die Rechenleistung
Sollte eigentlich nicht der Fall sein. Timer1 sollte bei FCPU = 8000000 mit Prescaler 8 im Overflow nur ca. 15x pro Sekunde aufgerufen werden. Und dabei wird eine U16-Variable um 1 erhöht. Das ist quasi nix.
Und der INT0 für den Flankenwechsel kommt bei 100 km/h ca. 646x pro Sekunde und dabei wird die U16-Variable in eine andere U16 kopiert und die beiden 8-Bit-Register des Timers in zwei U8-Variablen kopiert. Das ist zwar ein bischen mehr, aber eigentlich auch nix.

Die Berechnung wird dann in der main-Schleife durchgeführt. Und hier habe ich die restlichen ca. 79000000 Zyklen von FCPU frei um den Wert zu berechnen und am Display anzuzeigen. Aber ich vermute selbst dass schafft der AVR noch mehrere Male pro Sekunde.

Da die IRQ's so schnell wieder verlassen werden sollte eigentlich hier keine Flanke verpasst werden...

Hier mal der Code der Interrupts als Beweis:

Code:
// Tacho-Eingang Signalwechsel:
SIGNAL (INT0_vect)
{
 TachoTimeLow = TCNT1L;
 TachoTimeMiddle = TCNT1H;
 TachoTimeHigh = TachoTimeCounterHigh;
 TCNT1L = 0;
 TCNT1H = 0;
 TachoTimeCounterHigh = 0;
}
 
// Tacho-Eingang-Zeitmessung:
SIGNAL (SIG_TIMER1_OVF)
{
 if (TachoTimeCounterHigh < 0xFFFF)
  TachoTimeCounterHigh++;
}
Viele Grüße
Andreas