Nur ein Schuss ins Blaue, aber probiers mal so:
Code:
ISR(INT0_vect)
{ 
  if (on) {
    on = false;
    ...   
  } else {
    on = true;
    ...
  }
}
Wer weiß, wie der Compiler das else if wirklich evaluiert und was dann passiert wenn du die Bedingung im ersten Teil veränderst...