retrolefty:
Note that interrupts generated from simple switch buttons will frequently cause big problems due to contact bounce. There must have good contact debouncing strategy employed to use mechanical switches to generate interrupt signals.
And the golden rule to using ISR coding is to keep the ISR as simple and short as possible, usually just setting or resetting byte size flag global static variable types and let the main loop code test the flag to actually accomplish the task that the interrupt represents and then set or reset the flag variable as applicable.
I didn't know switches bounce that much. Mine is like this one:
In fact I used a switch instead of a push button because I thought it would be more stable.
But the problem must be probably related to bouncing, since adding HW debounce fixed 3 of the 4 modes. Now only the LOW mode keeps producing unexpected results.