CHANGE und FALLING funktionieren genau wie erwartet und dokumentiert (auf einem Mega),
also Interrupt - FALLING verhält sich wie CHANGE:
const byte pinD2 = 2;
const byte pinD3 = 3;
uint16_t toggle2;
uint16_t toggle3;
volatile uint16_t countISR2;
volatile uint16_t countISR3;
void isr2() {
countISR2++;
}
void isr3() {
countISR3++;
}
void setup() {
Serial.begin(250000);
pinMode(pinD2, OUTPUT);
pinMode(pinD3, OUTPUT);
attachInterrupt(digitalPinToInterrupt(pinD2), isr2, FALLING);
attachInterrupt(digitalPinToInterrupt(pinD3), isr3, CHANGE);
}
void loop() {
static uint32_t lastSecond;
static uint32_t lastToggle2;
static uint32_t lastToggle3;
uint32_t topLoop = millis();
if (topLoop - lastSecond >= 1000) {
lastSecond = topLoop;
noInterrupts();
uint32_t copy2 = countISR2;
uint32_t copy3 = countISR3;
countISR2 = 0;
countISR3 = 0;
interrupts();
Serial.print(F("D2: toggled "));
Serial.print(toggle2);
Serial.print(F(" counted "));
Serial.print(copy2);
Serial.print(F(", D3: toggled "));
Serial.print(toggle3);
Serial.print(F(" counted "));
Serial.println(copy3);
toggle2 = 0;
toggle3 = 0;
}
if (topLoop - lastToggle2 >= 7) {
toggle2++;
digitalWrite(pinD2, !digitalRead(pinD2));
lastToggle2 += 7;
}
if (topLoop - lastToggle3 >= 5) {
toggle3++;
digitalWrite(pinD3, !digitalRead(pinD3));
lastToggle3 += 5;
}
}
D2: toggled 142 counted 71, D3: toggled 199 counted 199
D2: toggled 143 counted 71, D3: toggled 200 counted 200
D2: toggled 143 counted 72, D3: toggled 200 counted 200
D2: toggled 143 counted 71, D3: toggled 200 counted 200
D2: toggled 143 counted 72, D3: toggled 200 counted 200
D2: toggled 143 counted 71, D3: toggled 200 counted 200
D2: toggled 142 counted 71, D3: toggled 200 counted 200
D2: toggled 143 counted 72, D3: toggled 200 counted 200
D2: toggled 143 counted 71, D3: toggled 200 counted 200
D2: toggled 143 counted 72, D3: toggled 200 counted 200
D2: toggled 143 counted 71, D3: toggled 200 counted 200
D2: toggled 143 counted 72, D3: toggled 200 counted 200
D2: toggled 143 counted 71, D3: toggled 200 counted 200