//---------------------------------------------------------------------- // Titel : ATmega 88 //---------------------------------------------------------------------- // Funktion : // Schaltung : //---------------------------------------------------------------------- // Prozessor : // Takt : 1,0 MHz // Sprache : C // Datum : 28.10.2003 // Version : 1.4 // Autor : // Programmer : ... // Port : ... //---------------------------------------------------------------------- #define F_CPU 1000000 #include #include #include #include int Freq_0; //aktuell gemessene Frequenz uint8_t sig, sig_alt; int Freq_1; //Speicher Frequenzmessung 1 int Freq_2; //Speicher Frequenzmessung 2 int Freq_diff; //Differenz Frequenzmessung 2 - Frequenzmessung 1 int Zstd_diff; //Zustandszähler Differenzbildung Frequenzmessung 1/2 //Variablen für die Zeit volatile unsigned int intervall_1; //Zeitrahmen zur Erfassung aktuelle Frequenz volatile unsigned int intervall_2; //Zeitrahmen zur Beschleunigungsbestimmung volatile unsigned int intervall_3; //Zeitrahmen zur Erfassung Frequenz 1 und 2 volatile unsigned int count; //Impulszähler Rechtecksignal //---------------------------------------------------------------------- void uartInit() { UBRR0 = 6; //9600Baud siehe Baudratentabelle UCSR0B = 0x08; //Sender enable } //---------------------------------------------------------------------- void uart_transmit_char(char c) //Zeichen senden { while(!(UCSR0A & (1 << UDRE0))); UDR0 = c; } //---------------------------------------------------------------------- //---------------------------------------------------------------------- void uart_transmit_string(const char *str) //String senden { while (*str) { uart_transmit_char(*str++); } } //---------------------------------------------------------------------- main () { uartInit(); DDRB|=0b00111111; //Datenrichtungsregister B einstellen: Bit 1-6 sind Ausgänge PORTB|=0b11000000; //Pull Up Widerstände 7-8 auf EIN DDRD|=0b00000000; //Datenrichtungsregister D einstellen: Alle Bits sind Eingänge PORTD|=0b11111111; //Alle Pull Up Widerstände einschalten // Timer 0 konfigurieren TCCR0A = 0x00; TCCR0B = (1<100 & Freq_diff < -20) { PORTB|= (1 << PB5); //einschalten } //---------------------------------------------------------- //-Vollbremsung beendet------------------------------------- if (Freq_diff > -10) { PORTB&= ~(1 << PB5); //ausschalten } //---------------------------------------------------------- Zstd_diff=3; } //-Daten an UART senden------------------------------------- char str[10]; sprintf(str, "%d", Freq_0); // alt Freq uart_transmit_string(str); uart_transmit_char(' '); sprintf(str, "%d", Freq_diff); uart_transmit_string(str); uart_transmit_char('\n'); //---------------------------------------------------------- } } //---------------------------------------------------------------------- ISR (TIMER0_OVF_vect) { /* Interrupt Aktion alle (1000000/8)/50 Hz = 2500 Hz bzw. 1/2500 Hz = 0,4 ms */ // TCNT0=156; //256-100 ; 125000/100=1250Hz TCNT0=206; //256-50 ; 125000/50=2500Hz //-Flankenauswertung PIN--------------------------------------------------------------- sig = PIND & (1<