#ifndef F_CPU // sicherheitshalber #define F_CPU 20000000 // Prozessortakt eisnstellen #endif // sbi == Set Bit cbi == clear Bit #define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT))); #define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT))); #include // Integriert Interrupt service routinen // für Makro's verknüpft I-vector's #include #include #include #include "lcd.h" #ifndef TRUE // sicherheitshalber #define TRUE 1 #define FALSE 0 #endif //----------------------------------------------------------------------------// volatile unsigned char overflows=0; // Azahl der Überläufe volatile unsigned int starttime=0; // ICR-Wert 1.High-Flanke volatile unsigned int endtime=0; // ICR-Wert 2.High-FLanke volatile unsigned char workflag; // WorkFlag Flag volatile float erg = 0; // Ergebniss der Rechnung ISR( TIMER1_CAPT_vect ) // ISR für Timer/Counter1 Capture-Event { static unsigned char ersteflanke = TRUE; if( workflag ) // IF-Anweisung verzögert die ISR { // bis die starttime & endtime Variablen return; // wieder gefahrlos beschrieben werden } // können else // Solange workflag nicht FALSE ist { ; // (Am Ende des Hauptprogrammes) wird } // diese ISR mit return sofort beendet if( ersteflanke ) { starttime=ICR1; // ICR1-16Bit-Register. TIMER REGISTER // des TCNT1-16Bit-Counter bei capture. overflows=0; // Überlauf 0 setzen ersteflanke=FALSE; // erste Flanke = 0 } else { endtime = ICR1; // ICR1-Wert in endtime workflag = TRUE; // 1 vollständige Messung abgeschlossen ersteflanke = TRUE; // beginn der nächsten Messung möglich } if ( workflag ) { erg = (overflows*65536) + endtime - starttime; // allg. Formel erg = F_CPU / erg; // f = 1/T } // Ziel: Zeitdauer zwischen Flanken zu bestimmen. // Da endtime und starttime unsigned sind brauch nicht // darauf geachtet zu werden das endtime kleiner als starttime sein // kann. Dies wird zusätzlich durch den Überlauf erfasst. } ISR ( TIMER1_OVF_vect ) // ISR für den Überlauf { overflows++; // Überlauf wird von Variable gezählt } int main() { //Variablen Deklarieren & Initialisieren char fqstring[8]; // Endergebnis auf dem Diplay uint8_t i; // Laufvariable für Messschleife uint8_t j; // Anzahl der Messungen float summe = 0; // Summe der ermittelten T's float mittelwert = 0; // Mittelwert aus j Messungen j = 10; // Anzahl der Messungen // j hier ändern lcd_init(); // Initialisierung LCD //TCCR1B = (1<