which I did not look at closely, but had assumed took care of the other problem with multi-byte variables shared between an ISR and regular code.
Those variables must be volatile, you did that.
But access to them outside the ISR must be protected. Most ppl do something like
noInterrupts();
int myCopy = someVolatileInt;
interrupts();
to make their own local copy of a volatile mulit-byte variable. Here, myCopy gets the value from someVolatileInt with interrupts briefly suspendered. Then they use that copy everywhere they would otherwise the original.
You may have had no trouble, but this is def something that can bite, and can be very difficult to realize what's happening.