Софт-ресет делается при помощи WatchDog.
Типа так:
Код
/*! \brief Программный сброс.
*/
void sw_reset ()
{
Disable_global_interrupt();
if (wdt_get_us_timeout_period() < 0)
wdt_enable(1000000);
while(1);
}
Важный момент! В начале программы обязательно надо вставить вызвов функции wdt_disable().
Иначе будет постоянно сбрасываться.