// Prozessor Taktfrequenz einstellen sofern es nicht eine Vorgabe // beim Aufruf des C Compilers gab. #ifndef F_CPU #define F_CPU 4000000 #endif #include #include #include #include #include "lcd-routines.h" #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif volatile unsigned char NrOverflows = 0; // Anzahl der Timer Overflows die waehrend // der Messung passiert sind volatile unsigned int StartTime = 0; // ICR-Wert bei 1.High-Flanke speichern volatile unsigned int EndTime = 0; // ICR-Wert bei 2.High-Flanke speichern volatile unsigned char ProgrammDurchlauf; // Job Flag char lcdCounterString[8]; char lcdDrehzahlString[8]; double Erg = 0.0; double drehzahl = 0.0; // LCD Position an der das Ergebnis der Frequenzmessung ausgegeben wird #define LCD_LINE1 0x00 // ist diese definition notwendig?? schadet aber auch nicht.. ISR( TIMER1_CAPT_vect ) { static unsigned char ErsteFlanke = TRUE; if( ProgrammDurchlauf == TRUE) // Das Display wurde mit den Ergebnissen der vorhergehenden return; // Messung noch nicht upgedated. Die naechste Messung // verz?gern, bis die Start und EndTime Variablen wieder // gefahrlos beschrieben werden koennen // Bei der ersten Flanke beginnt die Messung, es wird der momentane // Timer beim Input Capture als Startwert gesichert if( ErsteFlanke == TRUE ) { StartTime = ICR1; // Startzeit= ICR 1 NrOverflows = 0; ErsteFlanke = FALSE; // Die naechste Flanke ist das Ende der Messung } // das ist die zweite Flanke im Messzyklus. Die Messung wird gestoppt else { EndTime = ICR1; // Stopzeit für die Messung= ICR1 ProgrammDurchlauf = TRUE; // Eine vollst?ndige Messung. Sie kann ausgewertet werden ErsteFlanke = TRUE; // Bei der naechsten Flanke beginnt der naechste Messzyklus } } ISR( TIMER1_OVF_vect ) { NrOverflows++; } void init_interrupt(void) // Interrups klar machen { TCCR1B = (1<