reiniciar programa

Buenas tardes,

Estoy haciendo un programa que se activa al apretar un botón y que lleva varios sensores de final de carrera (tipo botón) y una vez ejecutado el programa se apaga automáticamente. El problema viene cuando intento arrancar el programa de nuevo, apreto en botón de encendido y se inicia pero se salta etapas... es como si se quedara en memoria lo que ha ocurrido la primera vez que he ejecutado el programa. He intentado restablecer todas las variables a 0 al final del programa, pero sigue saltandose etapas, como si tuviese memoria de lo que han leido los sensores al inicio.

Solo lo puedo reiniciar apretando el botón de reset de la placa.

Alguien sabe como restablecer todas las variables y el valor de los pin's y que se inicie como si fuese la primera vez?

Muchas gracias!

angudu:
Buenas tardes,

Estoy haciendo un programa que se activa al apretar un botón y que lleva varios sensores de final de carrera (tipo botón) y una vez ejecutado el programa se apaga automáticamente. El problema viene cuando intento arrancar el programa de nuevo, apreto en botón de encendido y se inicia pero se salta etapas... es como si se quedara en memoria lo que ha ocurrido la primera vez que he ejecutado el programa. He intentado restablecer todas las variables a 0 al final del programa, pero sigue saltandose etapas, como si tuviese memoria de lo que han leido los sensores al inicio.

Solo lo puedo reiniciar apretando el botón de reset de la placa.

Alguien sabe como restablecer todas las variables y el valor de los pin's y que se inicie como si fuese la primera vez?

Muchas gracias!

Podrías usar el reset como botón de inicio, aunque ¿como es que se "apaga"?, me imagino que es más sencillo reinicializar correctamente las variables, si posteas el codigo podrias recibir mejor ayuda

Lo mejor es que pongas el código.

Justo después de despertarte tendrás que poner el contador de programa a 0x0. El reset lo puedes hacer de dos formas.

Supongo que estarás mandando a dormir al AVR y despertándolo con una de las interrupciones externas. Esto lo que hace es llamar al manejar de interrupciones, que ejecutará el código correspondiente y si no lo tiene seguirá ejecutando donde lo mandaste a dormir.

Bien en el manejador de interrupciones, bien justo después de decirle al micro que se vaya a dormir puedes:

  • programar el watchdog para que salte. Si no tienes manejador de interrupciones reseteará el AVR.
    o
void (*myReset) (void) = 0x0;    // Declaración de un puntero a función, ponlo donde declaras las variables de tu programa

...       // Tu programa

// Justo después de mandar a dormir al AVR
// Voy a resetear el procesador
   myReset();

Con la primera opción ejecutará el bootloader
Con la segunda opción reiniciará todo el programa.
Si cuando declaras todas las variables, a estas les das un valor, durante el arranque del entorno de C, te las reiniciará al valor que le hayas dicho.

1 Like

Muchas gracias por concestar tan rápido!

Pongo una parte del código ya que es un poco extenso.

Una vez definidas las variables y algunas funciones entra el void loop(), como podeis ver, si el boton de encendido se aprieta (esta en PULLUP), se va ejecutando hasta llegar a apagar(). En realidad lo que hace es dejar el lcd en blanco y esperar de nuevo a que se apriete el boton encender.

He probado con void (*myReset) (void) = 0x0 colocado donde defino las variables; pero sigue sin resetearse del todo... la primera vez lo hace todo genial, la segunda se salta pasos... Y no entiendo lo de mandar a dormir al AVR.

void apagar(){

lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Apagando sistema");
delay(1000);
lcd.clear();
digitalWrite(7,LOW);
myReset();

}

void loop() {

buttonStateEncendido=digitalRead(buttonPinEncendido);

if ( buttonStateEncendido == 0) {

if (salirMenu==0){

menu();
salirMenu=1;

};

if (salirMenu==1){

empezar();
final=1;
}

}

if (final==1){
apagar();

}
}

Muchas gracias!

Que pasos se salta?
No veo el setup ni la declaración de variables.

Lo de mandar a dormir el micro es para que entre en un estado de muy bajo consumo. Era lo que creía que estabas haciendo.

Pues la otra opción es la que te comentan: usa el botón de reset o el watchdog.

Con la primera opción ejecutará el bootloader
Con la segunda opción reiniciará todo el programa.

A que te refieres con primera y segunda opcion @fm, lo siento estoy espeso despues de venir de currar. :disappointed_relieved:

La primera opción era usar el watchdog. La segunda opción usar el puntero a función.

He descubierto que en la placa hay un pin que pone reset :blush:, he leido que si le envío un valor LOW se reinicia la placa, probaré a ver si me funciona bien así. Muchas gracias por los comentarios.

fm, me interesa bastante esto que comentas de dejar el micro en bajo consumo, no sabia que se podía hacer algo así con arduino. Me podrías explicar mas o menos como hacerlo? o como buscarlo... Muchas gracias!

Saludos

Hola,
algo similar se trató en otra ocasión
http://arduino.cc/forum/index.php/topic,103225.0.html

@fm gracias por la aclaración.

La otra opción es usar un salida del propio AVR para que resetee el micro.

De todas formas, creo que lo más práctico es mandar a dormir al micro, consume algo, pero muy poco, y para aplicaciones que funcionan con batería es imprescindible. Ahora bien, si lo conectas a un LCD pues ... se beberá la batería si no se apaga en modo ahorro de energía.

El tema de mandar a dormir al micro:
todos los AVRs tiene varios modos de ahorro de energía. En esencia lo que hace el micro es entrar en modo bajo consumo apagando buena parte de los periféricos. Para sacar al micro de este letargo hay muchas formas de hacerlo una de ellas es usando una interrupción externa (aka un pin).

Lo más práctico es que te leeas el datasheet del micro para ver cómo funciona. Creo recordar que por la red hay mucha información y con ejemplos prácticos. Si tengo un rato publico un cacho de código que uso en algunos de mis chismes de ultra-bajo consumo.

Todo el entorno arduino está montado sobre la libAVR que es la librería con el runtime de C y muchas funciones de bajo nivel. Leerse el manual de la libAVR no está de más.

fm:
Si tengo un rato publico un cacho de código que uso en algunos de mis chismes de ultra-bajo consumo.

Te tomo la palabra :smiley:

fm:
Todo el entorno arduino está montado sobre la libAVR que es la librería con el runtime de C y muchas funciones de bajo nivel. Leerse el manual de la libAVR no está de más.

He buscado sobre la libAVR, el manual que comentas es la página www.nongnu.org, ¿hay un manual en formato pdf o similar? creo que lo he encontrado en AVR Libc Home Page se llama avr-libc Reference Manual 1.8

ionhs, si quieres una primera introduccion, yo escribi hace algun tiempo los resultados de unas pruebas del modo power sleep mode, el cual usa un timer para despertar el micro. Yo lo use para sustituir todos los delays de una maquinita a bateria que hice, que usaba un display y tenia grandes tiempos de espera para refrescar (por ejemplo 200ms o mas).
http://arduino.cc/forum/index.php/topic,31365.0.html

La verdad que tampoco me lo he vuelto a mirar, y ha pasado bastante tiempo de esto ...

Gracias Igor, me guardo el link para cuando tenga tiempo :sweat_smile:

Buenas tardes,

En un equipo de trabajo estamos haciendo un proyecto el cual no deja encender el motor de un auto cuando detecta un alto nivel de alcohol, estamos usando el alcoholimetro "mq3", ya tenemos la programacion pero en ella hay un problema ya que al detectar el alcohol se apaga el motor pero la unica manera de reiniciar el programa es o apretando el boton de reset que esta incluido en el arduino o volviendo a subir el programa

Alguien sabe como hacer que se inicie como si fuese la primera vez o como puedo insetar un boton para reiniciar todo?

Muchas gracias!

RonalZelaya, cuando llegas a un foro debes leer sus normas y respetar las advertencias.
**Este hilo no se ha movido desde el 2012 y antes de postearlo te apareció una advertencia de que tenia mas de 120 dias sin movimientos. **
Los hilos viejos se consideran salvo puntuales excepciones que estan terminados porque la mayoría de sus interlocutores ya no estan o no te van a responder.

Este hilo se va a cerrar y espero crees un hilo nuevo en el foro adecuando luego de haber leído las normas y con gusto todos te responderemos.