Что не так с сторожевым таймером, который у вас уже есть в коде вопроса? Это будет работать, но нужно потратить деньги:
void ex0() interrupt 0
{
if(!btn)
{
EA = 0; // Disable interrupts
// Set watchdog counter and timeout
// to zero for immediate reset
PCA0L = 0x00;
PCA0H = 0x00;
PCA0CPL2 = 0x00;
// Enable watchdog
PCA0MD |= 0x40;
for(;;); // Wait for reset
}
}
Лучшее решение, если вы можете, - это подключить GPIO к выводу сброса (с подтягиванием) и сбросить его напрямую. При сбросе GPIO будет в трех состояниях, поэтому сбросьте сброс - благодаря подтягиванию. При инициализации GPIO вам необходимо позаботиться о том, чтобы вы не сразу понизили его. Вероятно, лучше оставить его как триединый вход, пока вы на самом деле не захотите выполнить сброс.