Go Down

Topic: reiniciar programa (Read 2820 times) previous topic - next topic

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!

eried



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
My website: http://ried.cl

Cheyenne

Lo mejor es que pongas el código.
http://cuadricopterodiyarduino.blogspot.com/

fm

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
Code: [Select]

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.
   

angudu


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!

fm

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.
   

flico

Quote
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. :smiley-sad-blue:
Trabajando en ...

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

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

fm

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

angudu


He descubierto que en la placa hay un pin que pone reset  :smiley-red:, 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

curro92


flico

@fm gracias por la aclaración.
Trabajando en ...

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

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

fm

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.
   

ionhs

#12
Aug 23, 2012, 10:59 am Last Edit: Aug 23, 2012, 11:54 am by ionhs Reason: 1

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  :D


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 http://www.nongnu.org/avr-libc/ se llama avr-libc Reference Manual 1.8

Igor R

#13
Aug 23, 2012, 01:54 pm Last Edit: Aug 23, 2012, 01:59 pm by Igor R Reason: 1
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
http://real2electronics.blogspot.co.uk/2009/09/power-sleep-mode.html

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

ionhs

Gracias Igor, me guardo el link para cuando tenga tiempo  :smiley-sweat:

Go Up