//Variablen //RC-bezogen int cnt_CH_1 = 0; //Zähler Channel 1 für Interruptroutine int frqraw_CH_1 = 0; //Übergabewert Channel 1 aus Interruptroutine int cnt_CH_2 = 0; //Zähler Channel 2 für Interruptroutine int frqraw_CH_2 = 0; //Übergabewert Channel 2 aus Interruptroutine int cnt_CH_3 = 0; //Zähler Channel 3 für Interruptroutine int frqraw_CH_3 = 0; //Übergabewert Channel 3 aus Interruptroutine int cnt_CH_4 = 0; //Zähler Channel 4 für Interruptroutine int frqraw_CH_4 = 0; //Übergabewert Channel 4 aus Interruptroutine //Programmbezogen const int deadzone = 10; const int hlevel = 174; //höchste gelieferte Frequenz const int llevel = 115; //niedrigste gelieferte Frequenz const int glevel = 310; //Grenzlevel für Ergebnis void setup() { // Controller pins DDRD = 0b11000011; //Setzt D2-D5 als Eingang 0 und die restlichen als Ausgang 1 cli(); // Clear interrupts Interrupts ausschalten // Register zurücksetzen TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 20; //Output Compare Register auf Vergleichswert setzen, war 20 TCCR1B |= (1 << CS11); //Prescale 8 // 16MHz/8=2MHz mit OCR1A=20 Interrupt alle 10µs TCCR1B |= (1 << WGM12); //CTC-Mode einschalten TIMSK1 |= (1 << OCIE1A); //Timer Compare Interrupt setzen sei(); // Set Interrupts Interrupts einschalten Serial.begin(9600); //serielle Verbindung etablieren } ISR(TIMER1_COMPA_vect) { //die Interruptroutine gibt ein Zehntel der Impulsbreite in µs zurück if (PIND & (1< 100) { // nur Werte > 100 verwerten, andere sind Störung oder Sender off pulse = map(pulse, llevel, hlevel, -500, 500); // Ausgabewertebereich verschieben pulse = constrain(pulse, -glevel, glevel); // und jetzt noch begrenzen } else { pulse = 0; // keine sinnvollen Impulse } // Ruhezone einrichten if (abs(pulse) <= deadzone) { pulse = 0; } return pulse; }