Вам абсолютно правильно сказали по поводу задержек в обработчиках
прерываний - скорее всего там и проблема.
Если я правильно разглядел исходник, вы не конфигурируете WDT (оставляете по значение умолчанию), а оно соответствует ~16мс.
То есть, попадая в прерывание с задержками более чем 16мс собака гарантировано кусает.
Поэтому в прерываниях нужно делать только абсолютно необходимые действия. (В Вашем случае - установить флаг о том, что прерывание было. Все.)
А обработку событий перенести в основной цикл.
И не забывать о периоде WDT. Если процедура длинная (по времени естес-но) вставить код сброса WDT.
Сейчас в тупую можете поставить сбросы WDT в обаботчик прерывания, скорее всего поможет.
2 kertis
Успокойтесь, творческий подход в этом случае не поможет

У этого проца НЕТ возможности узнать причину сброса.