#define SIGNAL_INPUT 2 #define PPL 22000 uint32_t edge_count; void init_timer(void) { cli(); TCCR1A = 0;// set entire TCCR1A register to 0 TCCR1B = 0;// same for TCCR1B TCNT1 = 0;//initialize counter value to 0 // set compare match register for 1hz increments OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536) // turn on CTC mode TCCR1B |= (1 << WGM12); // Set CS12 and CS10 bits for 1024 prescaler TCCR1B |= (1 << CS12) | (1 << CS10); // enable timer compare interrupt TIMSK1 |= (1 << OCIE1A); sei(); } void setup() { Serial.begin(38400); pinMode(SIGNAL_INPUT, INPUT_PULLUP); pinMode(3, OUTPUT); attachInterrupt(digitalPinToInterrupt(SIGNAL_INPUT), detectMagnet, FALLING); init_timer(); } void loop() { } // Wird bei jeder Flanke aufgerufen, trotz "FALLING" void detectMagnet() { edge_count++; } ISR(TIMER1_COMPA_vect) { uint32_t liter; liter = ((edge_count / 2) * 1000) / PPL; Serial.print("Durchfluss (Liter): "); Serial.print(liter / 1000, DEC); Serial.print("."); Serial.println(liter % 1000, DEC); edge_count = 0; }