autoreset en funcion de unas condiciones determinadas?

Hola,
¿Es posible que el propio arduino se resetee ante un evento determinado?
Por ejemplo a lo mejor nos interesa que se ejecute el void setup por alguna razon.
Saludos

Mete el contenido del void setup en una función y llámala, no hace falta reiniciar el arduino

tienes razon Chiva, en cualquier caso, no estaría demás si alguien supiera como hacer un autoreset.
saludos!

para resetear sino me equivoco con esta funcion valdria

void(* resetFunc) (void) = 0;

y se llamaria asi:

resetFunc();

Espero que os sirva.

Si lo que necesitas es un soft-reset valdría.

Buenas!

Estas son las únicas formas que conozco de forzar un reset:

  1. La primera sería la que ha comentado "riscking". Que lo que realmente provoca es que el "Contador de Programa" vuelva a cero y se ejecute el código desde el principio. Esto no llega a ser un reset real, ya que el hardware no se reinicia. Si el reset lo haces por temas de seguridad, no te recomiendo esta opción. Pero si simplemente quieres reiniciar el programa, te serviría.

  2. La segunda opción sería activando el Watchdog (perro guardían) y provocando un bucle infinito, lo que hará que el hardware se reinicie automáticamente. El perro guardían está para detectar fallos del sistema y evitar daños en el hardware. Haciendo esto le engañamos y nos reinicia la placa. Aquí te dejo un código de ejemplo que he encontrado:

#include <avr/wdt.h> // incluyes la librería del Watchdog

cli(); // eliminas todas las interrupciones
wdt_enable(WDTO_15MS);	// le pedimos al perro guadían que reinicie tras 15ms
while(1); // provocamos el bucle infinito
  1. La tercera opción es la que más me gusta y es la que tengo pensado utilizar en mi proyecto.
    Simplemente hay que puentear una salida digital de tu Arduino al pin de RESET. Y cuando quieras reiniciar la placa, pones el estado del pin a LOW. Esto hará que la placa se reinicie tal y como si tú le dieras al botón RESET.
    Eso si, recuerda inicializar el pin a HIGH y ponerle una resistencia de pull-up.

Espero haberte servido de ayuda.
Un saludo!!

Con respecto al 2: hay bootloaders (no se si todos) con los que que tras hacer un watchdog-reset se quedan en un bucle infinito. Cuando no se hace caso a las sugerencias del fabricante es lo que pasa.
Con respecto al 3: el pin de reset hay que mantenerlo a nivel bajo un tiempo mínimo determinado, cosa que no puede hacerse el Arduino a si mismo sin hardware extra. Es posible que se quede en otro bucle infinito de resets.

Un saludo

Con respecto al 2: hay bootloaders (no se si todos) con los que que tras hacer un watchdog-reset se quedan en un bucle infinito. Cuando no se hace caso a las sugerencias del fabricante es lo que pasa.
Con respecto al 3: el pin de reset hay que mantenerlo a nivel bajo un tiempo mínimo determinado, cosa que no puede hacerse el Arduino a si mismo sin hardware extra. Es posible que se quede en otro bucle infinito de resets.

Chiva has dado en el clavo, he probado con varios bootloaders y hace lo que comentas, se queda en un bucle. Opcion 2 no valdría.
Con respecto al punto 3, como bien dices el reset tiene que durar un tiempo determinado.
Una variante de la opción 3 seria usar un MAX812, asi haces un reset con un pin y además de resetear el micro cuando hay algo raro en la tensión de alimentacion.

Max812

Espero que te sirva.

Respecto a la opción 2, es cierto lo que comentas chiva, se me olvido comentarlo.

Y la solución para la tercera opción que propone flico, me ha gustado mucho, no conocía ese micro. Me va a venir genial para mi placa.

Gracias!!

Se soluciona desactivando el watchdog en el bootloader, creo que adafruit tiene algunos bootloaders recompilados con el fix

La verdad que no se me había ocurrido la aplicación de ese chip para este problema, muy ingenioso.

Se soluciona desactivando el watchdog en el bootloader, creo que adafruit tiene algunos bootloaders recompilados con el fix

Chiva, a que bootloader te refieres? He cargado varios pero no funcionan.

Saludos.

Aquí tienes: Arduino Hacks

No hacéis lo mismo con un transitor y una resistencia de pull-up a modo de inversor, sin necesidad de poner integrados?

Es decir cuando el pin a la base del trt se ponga a uno el transistor conduce poniendo a nivel bajo el reset (el reset conectado al drenador/colector del trt y a vcc a través de la R, no he mirado datasheets para ver valores de tensión), sigue a uno hasta que el micro se resetea, al resetearse por defecto todos los puertos se configuran como entradas, todos los registros del puerto que controlar el modo de funcionamiento y la salida se inicializan a cero, que aquí es donde puede residir el problema de conectarlo el pin directamente para hacer el reset pudiendo éste quedar en un reset infinito (habría que mirar los tiempos).

También poner una resistencia de pull-down en la base del trt para evitar el estado indeterminado en el arranque del microcontrolador.

Es lo que comentaba en la opción tres, pero sin el transistor.

Que función cumpliría aquí el transistor? (perdona mi ignorancia)

Usando un transistor o directamente usar una salida para resetear funcionara casi siempre, pero habrá alguna vez que se quede frito en un bucle. Existen montonazo de integrados para hacer reset, incluyendo cuando la tensión baja por debajo de un valor. Para este caso suelo usar el MC331, porque tengo un montón de ellos.

Saludos.

Hacer de inversor, de puerta NOT.

Para resetear el micro es necesario poner a nivel bajo el pin del reset y el problema es que cuando se resetea todos los puertos del micro son configurados como entrada, en alta impedancia, por lo que la tensión que se le está metiendo al reset no está determinada a través del pin del puerto que hace el reset, y aquí es donde podéis entrar en el búcle que decís.

Una forma de evitarlo es utilizar un transistor para hacer la conmutación, el reset se conecta al drenador/colector del transistor y cuando éste conduce pone el pin del reset a tierra, la base lleva una resistenca de pull-down para evitar el estado indeterminado de arranque del microcontrolador, estando el trt en corte y proporcionandole un uno al reset.

Por decirlo de una forma rápida el transistor es equivalente al botón que se pondría en el reset.

Incluso se podría hacer con un divisor resistivo conectado al reset y un pin del micro conectado al reset, habría que mirar los niveles de tensión del datasheet necesarios.

De todas formas yo creo que lo más adecuado es mirar de hacerlo por soft, ya que no se gasta ningún pin del microcontrolador y no hay que añadir componentes adicionales.