Reset desde el programa

Hola,

Puedes hacer un reset software usando ensamblador ( asm("jmp 0x0000"); ). Ésto salta tu programa a la zona de memoria "reset vector".
Es similar a lo que ha puesto Jose Francisco, que en su caso es usando un puntero a funciones y que esta apuntando a reset vector (0x0).

Pongo un ejemplo:

unsigned int tstart;

void setup() 
{ 
  Serial.begin(9600); 
  Serial.println("EMPEZANDO...."); 
  tstart=millis();
} 



void loop() 
{ 

    if ( (millis()-tstart)>1000 )
    {
      Serial.println("Un segundo! Reseteando");  
      asm("jmp 0x0000"); 
    }

}

La salida es:

EMPEZANDO....
Un segundo! Reseteando
EMPEZANDO....
Un segundo! Reseteando
EMPEZANDO....
Un segundo! Reseteando
EMPEZANDO....
Un segundo! Reseteando
EMPEZANDO....
Un segundo! Reseteando
EMPEZANDO....
Un segundo! Reseteando
EMPEZANDO....

Para hacerlo más "user friendly" puedes declarar al principio del código:
#define RESTART asm("jmp 0x0000")
y ahora puede usar el macro RESTART; en tu código.

Ésto no es un "power cycle" del micro, pero me imagino que te hará un "apaño" para lo que quieras hacer. Me refiero, que cuando reseteas hardware, todas las entradas/salidas vuelves a sus valores iniciales y luego el programa empieza desde dicha dirección (Reset Vector). Con ésta instrucción lo que haces es saltar por software otra vez a dicha dirección, pero no pasa por el estado en que todas las entradas i/o del micro pasan por estado inicial del micro.

Saludos!!

Igor R.