Arduino Neuling, Rechtecksignal halbieren und ausgeben

Aus meiner Version musste ich noch ein paar Fehler beseitigen.

  1. das Runden der Frequenz war falsch
  2. die Dauer eines Zyklus erfasste nur einen Halbzyklus.
const byte pulsePin = 2;
const byte outPin = 3;

volatile unsigned long duration;
volatile bool newDurationAvailable;
volatile bool gleicheFrequenz;
unsigned long edgeUp;
unsigned long edgeDown;
unsigned long downDuration;
unsigned long upDuration;

void takeEdges() {
  static byte currCycle;
  byte currState = digitalRead(pulsePin);
  if (gleicheFrequenz || currCycle & 1) {
    digitalWrite(outPin, currState);
  }
  if (currState) {
    edgeUp = micros();
    downDuration = edgeUp - edgeDown;
  } else {
    edgeDown = micros();
    upDuration = edgeDown - edgeUp;
    if (!newDurationAvailable) {
      duration = upDuration + downDuration;
      currCycle++;
      newDurationAvailable = true;
    }
  }
}

void setup() {
  Serial.begin(115200);
  //pinMode(pulsePin, INPUT_PULLUP);
  pinMode(outPin, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(pulsePin), takeEdges, CHANGE);
}

unsigned long lastPrint;

void loop() {
  unsigned long topLoop = millis();

  if (newDurationAvailable) {
    unsigned long frequency = 1000000L / duration;
    gleicheFrequenz = frequency < 3;
    if (topLoop - lastPrint >= 100) {
      Serial.print(F("duration: "));
      Serial.print(duration);
      Serial.print(F(" frequency: "));
      Serial.print(frequency);
      Serial.print(gleicheFrequenz ? F(" gleiche") : F(" halbe"));
      Serial.println(F(" Ausgabefrequenz"));
      lastPrint = topLoop;
    }
    newDurationAvailable = false;
  }
}