Go Down

Topic: Reset desde el programa (Read 6788 times) previous topic - next topic

flico

Feb 02, 2011, 11:19 am Last Edit: Apr 30, 2012, 04:57 am by coleoptero Reason: 1
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.

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

complubot

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
Centro de Robótica Educativa
www.complubot.com

flico

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

Staedtler

#3
Feb 02, 2011, 03:12 pm Last Edit: Feb 02, 2011, 03:16 pm by Staedtler Reason: 1
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.
--------------------------------------
Eight bytes walk into a bar. The bartender asks, 'Can I get you anything?'
- 'Yeah', reply the bytes

DRicote

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.

complubot

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.
Centro de Robótica Educativa
www.complubot.com

Jose Francisco

En algún sitio leí esto:

Quote

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.

Igor R

#7
Feb 06, 2011, 12:17 pm Last Edit: Feb 06, 2011, 12:44 pm by Igor R Reason: 1
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:

Code: [Select]

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.

complubot

Quote
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...
Centro de Robótica Educativa
www.complubot.com

Igor R

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


;)

complubot

Quote
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.
Centro de Robótica Educativa
www.complubot.com

Igor R

#11
Feb 07, 2011, 11:16 am Last Edit: Feb 07, 2011, 11:21 am by Igor R Reason: 1
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....

complubot

Quote
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.

Quote
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ó.
Centro de Robótica Educativa
www.complubot.com

Igor R

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.... ;)


flico

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

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

Go Up