0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« on: February 02, 2011, 05:19:44 am » |
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.
|
|
|
|
« Last Edit: April 29, 2012, 09:57:39 pm by coleoptero »
|
Logged
|
|
|
|
|
ALCALA DE HENARES
Offline
Sr. Member
Karma: 12
Posts: 275
ROBOTICA EDUCATIVA CON ARDUINO
|
 |
« Reply #1 on: February 02, 2011, 07:00:01 am » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #2 on: February 02, 2011, 08:17:21 am » |
Ok, gracias por la info
|
|
|
|
|
Logged
|
|
|
|
|
Dallas, TX
Offline
Jr. Member
Karma: 5
Posts: 91
Arduino rocks
|
 |
« Reply #3 on: February 02, 2011, 09:12:57 am » |
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.
|
|
|
|
« Last Edit: February 02, 2011, 09:16:38 am by Staedtler »
|
Logged
|
-------------------------------------- Eight bytes walk into a bar. The bartender asks, 'Can I get you anything?' - 'Yeah', reply the bytes. 'Make us a double'.
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #4 on: February 02, 2011, 01:25:35 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
ALCALA DE HENARES
Offline
Sr. Member
Karma: 12
Posts: 275
ROBOTICA EDUCATIVA CON ARDUINO
|
 |
« Reply #5 on: February 03, 2011, 03:09:28 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 0
Posts: 198
Arduino rocks
|
 |
« Reply #6 on: February 05, 2011, 09:24:43 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #7 on: February 06, 2011, 06:17:52 am » |
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.
|
|
|
|
« Last Edit: February 06, 2011, 06:44:02 am by Igor R »
|
Logged
|
|
|
|
|
ALCALA DE HENARES
Offline
Sr. Member
Karma: 12
Posts: 275
ROBOTICA EDUCATIVA CON ARDUINO
|
 |
« Reply #8 on: February 07, 2011, 04:29:52 am » |
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...
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #9 on: February 07, 2011, 04:47:11 am » |
Sip, pero como tampoco se para que lo necesita, yo pongo la opcion con pros y contras... 
|
|
|
|
|
Logged
|
|
|
|
|
ALCALA DE HENARES
Offline
Sr. Member
Karma: 12
Posts: 275
ROBOTICA EDUCATIVA CON ARDUINO
|
 |
« Reply #10 on: February 07, 2011, 05:12:23 am » |
Sip, pero como tampoco se para que lo necesita, yo pongo la opcion con pros y contras... Nada, nada, no tienes perdón  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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #11 on: February 07, 2011, 05:16:57 am » |
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....
|
|
|
|
« Last Edit: February 07, 2011, 05:21:18 am by Igor R »
|
Logged
|
|
|
|
|
ALCALA DE HENARES
Offline
Sr. Member
Karma: 12
Posts: 275
ROBOTICA EDUCATIVA CON ARDUINO
|
 |
« Reply #12 on: February 07, 2011, 05:28:36 am » |
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ó.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #13 on: February 07, 2011, 05:58:42 am » |
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.... 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #14 on: February 07, 2011, 07:12:24 am » |
Solamente quiero inicializar las salidas al estado original y arrancar desde el setup. Con las dos soluciones me funciona OK. Gracias a los dos.
|
|
|
|
|
Logged
|
|
|
|
|
|