///////////////////////////////////////////////////////////////////////////// // // Frequenzmessung des Drehzahlsignals // // Das zu messende Signal wird am Input Capture Pin ( PD6 ) angelegt. ///////////////////////////////////////////////////////////////////////////// #ifndef F_CPU #define F_CPU 8000000 #endif #include #include #include #include #include "lcd.h" #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif volatile unsigned char NrOverflows = 0; // Anzahl der Timer Overflows die während der Messung passiert sind volatile unsigned int StartTime = 0; // ICR-Wert bei der 1.High-Flanke speichern volatile unsigned int EndTime = 0; // ICR-Wert bei der 2.High-Flanke speichern volatile unsigned char UpdateDisplay; // Job Flag //#define LCD_LINE1 0x00 // Position an der das ERgebnis der Frequenzmessung ausgegeben wird ISR( TIMER1_CAPT_vect ) { static unsigned char ErsteFlanke = TRUE; if (UpdateDisplay) // das Display wurde mit den Ergebnissen der vorhergehenden Messung return; // noch nicht upgedatet. Die nächste Messung verzögern, bis der Start // und EndTime Variablen wieder gefahrlos beschrieben werden können. // Bei der ersten Flanke beginnt die Messung, es wird der momentane // Timer beim Input Capture als Startwert gesichert // if ( ErsteFlanke ) { StartTime = ICR1; NrOverflows = 0; ErsteFlanke = FALSE; // Die nächste Flanke ist das Ende der Messung } // das ist die zweite Flankte im Messzyklus. Die Messung wird gestoppt else { EndTime = ICR1; UpdateDisplay = TRUE; // Eine vollständige Messung. Sie kann ausgewertet werden ErsteFlanke = TRUE; // Bei der naechsten Flanke beginnt der nächste Messzyklus } } ISR( TIMER1_OVF_vect ) { NrOverflows++; } int main() { char lcdCounterString[8]; double Erg = 0.0; lcd_clrscr(); TCCR1B = (1<