//################################################################## //# MC: Atmega8 16Mhz # //# Compiler: AVR-GCC 4.1.2 20061115 # //# Version: 1.01 # //# Ports: (TXD) PD1 (3); (ICP1) PB0 (14), (INT0) PD2 (4) # //# Funktion: Frequenzzahler, Timer0 an INT0, Timer1 an ICP # //################################################################## #define F_CPU 16000000 #include #include #include #include #include "rs232.c" #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif volatile unsigned char NumberOverflow0 = 0; // Anzahl Timer0 Overflows volatile unsigned char NumberOverflow1 = 0; // Anzahl Timer1 Overflows volatile unsigned int StartTime0 = 0; // TCNT0-Wert bei 1.High-Flanke speichern volatile unsigned int StartTime1 = 0; // ICR1-Wert bei 1.High-Flanke speichern volatile unsigned int EndTime0 = 0; // TCNT0-Wert bei 2.High-Flanke speichern volatile unsigned int EndTime1 = 0; // ICR1-Wert bei 2.High-Flanke speichern volatile unsigned char Update0; // Flag volatile unsigned char Update1; // Flag //---------------------------------------------------------------------------------- // Flankenauswertung Timer0 INT0 ISR(INT0_vect) { static unsigned char ErsteFlanke0 = TRUE; if( Update0 && Update1) return; if( ErsteFlanke0 ) { StartTime0 = TCNT0; NumberOverflow0 = 0; ErsteFlanke0 = FALSE; // Die naechste Flanke ist das Ende der Messung } else { EndTime0 = TCNT0; Update0 = TRUE; // Eine vollstaendige Messung. Sie kann ausgewertet werden ErsteFlanke0 = TRUE; // Bei der naechsten Flanke beginnt der naechste Messzyklus } } //--------------------------------------------------------------------------------- // Flankenauswertung Timer1 ICP1 ISR( TIMER1_CAPT_vect ) { static unsigned char ErsteFlanke1 = TRUE; if( Update1 && Update0 ) return; if( ErsteFlanke1 ) { StartTime1 = ICR1; NumberOverflow1 = 0; ErsteFlanke1 = FALSE; // Die naechste Flanke ist das Ende der Messung } else { EndTime1 = ICR1; Update1 = TRUE; // Eine vollstaendige Messung. Sie kann ausgewertet werden ErsteFlanke1 = TRUE; // Bei der naechsten Flanke beginnt der naechste Messzyklus } } //---------------------------------------------------------------------------------- // Timer0 Overflows zählen ISR( TIMER0_OVF_vect ) { NumberOverflow0++; } //---------------------------------------------------------------------------------- // Timer1 Overflows zählen ISR( TIMER1_OVF_vect ) { NumberOverflow1++; } //--------------------------------------------------------------------------- int main(void) { double Erg0 = 0.0, Erg1 = 0.0; char Wert0[8], Wert1[8]; initrs232(); DDRB &= ~(1<