Reset desde el programa

Existe alguna manera de hacer un reset desde el programa, ahora mismo lo tengo hecho usando una salida conectada a un transistor, cuando quiero hacer un reset activo la salida y listo.

Saludos.

Por desgracia yo no conozco ninguna forma 100% estable para hacer un reset por software. La idea que tu planteas de usar una salida digital con un transistor en colector abierto conectado a la linea de reset es "peligrosa" y no es muy aconsejable.

El motivo de esto es que para garantizar un reset correcto la entrada de reset tiene que permanecer a nivel bajo un cierto tiempo. Si esto lo haces con una propia salida del microcontrolador y un transistor, en cuanto comienza el proceso de reset la salida se pone en alta impedancia y levanta el reset sin completar el tiempo minimo de seguridad.

Una solicion es poner un monoestable (con un 555 o similar) que se dispare por flanco a una salida digital y de esta forma poder generar un pulso de reset que respete el tiempo minimo.

PD. Disculpar pero por alguna estraña razon se me ha desconfigurado el teclado y no he conseguido poner ningun acento :0

Ok, gracias por la info

De hecho la idea de transistor no es mala idea, (si respetas las leyes de Ohm). Yo utilizaria un capacitor para resolver el problema de tiempo.

Utilizar un 555 no es mala idea para nada tampoco, y tienes que tener las mismas precauciones como el ejemplo anterior.

Lo mismo iba a comentar yo, el tiempo de reset se puede alargar un poco con un condensador electrolítico., y no hace falta que sea muy grande, dependerá del tiempo que quiera hacerse reset claro.

Sea con un filtro RC, sea con un monoestable, el tiempo mínimo que debemos mantaner a nivel bajo el Reset (según el fabricante) son 2.5us (microsegundos). Si conectamos directamente una salida digital a la pata de reset el pulso es mucho más corto y aunque puede funcionar, nadie nos garantiza que sea de una forma estable.

En algún sitio leí esto:

Yo lo reseteo con esto. void(* resetFunc) (void) = 0; // esta es la funcion resetFunc(); // la llamo con esto

Si funciona me lo decís, que yo no lo he probado.

Un saludo.

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.

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.

Claro Igor, este es justo el problema, lo que propones reinicia el programa pero no hace un reset como tal. El peligro es que hay gente que piensa que si hace un reset como tal...

Sip, pero como tampoco se para que lo necesita, yo pongo la opcion con pros y contras...

;)

Sip, pero como tampoco se para que lo necesita, yo pongo la opcion con pros y contras…

Nada, nada, no tienes perdón :smiley:

Sinceramente siento curiosidad por saber la utilidad de un “reset” por software. Si es para tratar una escepción, el programa debería estar preparado para ello. Si es para solucionar un problema, el POR (Power On Reset) o el watchdog deberían ser suficiente.

Y para que te puede interesar un reset hardware??

Por cierto, el watchdog funciona con el bootloader que viene con Arduino??? Tenia entendido que no....

Y para que te puede interesar un reset hardware??

No, lo que quería decir es que no entiendo la necesidad de hacer un reset de ese estilo desde el propio programa.

el watchdog funciona con el bootloader que viene con Arduino???

Pues no lo sé ya que casi siempre usamos la programación por ISP y la única prueba que he hecho del Watchdog si que funcionó.

Si no me equivoco, hay que usar el bootloader de Adafruit si quieres usar watchdog. Pero no se si con la version UNO lo han solucionado.
Lo de hacer el reset, seguro que flico nos puede explicar sus intenciones… :wink:

Solamente quiero inicializar las salidas al estado original y arrancar desde el setup. Con las dos soluciones me funciona OK. Gracias a los dos.

Siempre puedes llamar a la funcion setup() en cualquier parte de tu programa y/o configurar las salidas,variables,etc al estado deseado (sin hacer "reset").

;)

Disculpen que me entrometa jaja pero me fue muy curioso el post, (corríjanme si me perdí) el arduino tiene un puerto junto a los 3v3, 5v, gnd, 9v que dice "RESET" ¿no sería más fácil enviar un pulso ahí de el mismo arduino y listo?

Disculpen que me entrometa jaja pero me fue muy curioso el post, (corríjanme si me perdí) el arduino tiene un puerto junto a los 3v3, 5v, gnd, 9v que dice "RESET" ¿no sería más fácil enviar un pulso ahí de el mismo arduino y listo?

Pues si, te has perdido un poquito, te sugiero que leas los post de este hilo y encontrarás por que eso no se debe hacer

complubot:

Sip, pero como tampoco se para que lo necesita, yo pongo la opcion con pros y contras...

Nada, nada, no tienes perdón :D

Sinceramente siento curiosidad por saber la utilidad de un "reset" por software. Si es para tratar una escepción, el programa debería estar preparado para ello. Si es para solucionar un problema, el POR (Power On Reset) o el watchdog deberían ser suficiente.

A mi por ejemplo me ha servido para lo siguiente: Estaba haciendo un sensor de distancia por ultrasonidos y cuando la medida es "fuera de rango" el sensor se queda "bloqueado" o pensando unos 10 o 15 segundos hasta que vuelve a reaccionar. Sin embargo, ahora cuando da "fuera de rango" acto seguido le hago un reset por software y apenas tarda 1 segundo en volver a funcionar el programa. Gracias Igor R ;)

Los resets que se comentan en este hilo, solucionaría el bloqueo del micro-controlador?

Con el bloqueo me refiero a que tengo un arduino yun. Desde la parte linux pido la lectura de varios sensores y parece ser que cuando lleva unos días trabajando, los sensores siempre responden vacio. Por lo que he leído, no soy el único, y parece ser que se "satura" el micro-controlador y deja de enviar datos.

De momento la única solución que encuentro es ir al botón de reset de la parte arduino y que vuelva a funcionar. El problema es que una de las ventajas de tener un arduino yun, es que puedes programarlo a distancia y no veo "normal" que al tiempo se bloquee y te toque ir a resetearlo a mano.