Offline
Newbie
Karma: 0
Posts: 12
|
 |
« on: August 20, 2012, 12:41:35 pm » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Chile
Offline
Edison Member
Karma: 28
Posts: 1146
Arduino rocks
|
 |
« Reply #1 on: August 20, 2012, 12:47:44 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 2
Posts: 508
|
 |
« Reply #2 on: August 20, 2012, 12:48:28 pm » |
Lo mejor es que pongas el código.
|
|
|
|
|
Logged
|
|
|
|
|
Málaga, Spain
Offline
Edison Member
Karma: 33
Posts: 2017
|
 |
« Reply #3 on: August 20, 2012, 01:05:47 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #4 on: August 20, 2012, 01:37:26 pm » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Málaga, Spain
Offline
Edison Member
Karma: 33
Posts: 2017
|
 |
« Reply #5 on: August 20, 2012, 02:46:25 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #6 on: August 20, 2012, 04:35:14 pm » |
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. 
|
|
|
|
|
Logged
|
|
|
|
|
Málaga, Spain
Offline
Edison Member
Karma: 33
Posts: 2017
|
 |
« Reply #7 on: August 20, 2012, 05:27:44 pm » |
La primera opción era usar el watchdog. La segunda opción usar el puntero a función.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 12
|
 |
« Reply #8 on: August 20, 2012, 06:12:48 pm » |
He descubierto que en la placa hay un pin que pone reset  , 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
|
|
|
|
|
Logged
|
|
|
|
|
Euskadi
Offline
God Member
Karma: 10
Posts: 594
Arduinotarrak
|
 |
« Reply #9 on: August 20, 2012, 10:48:38 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #10 on: August 21, 2012, 04:00:18 am » |
@fm gracias por la aclaración.
|
|
|
|
|
Logged
|
|
|
|
|
Málaga, Spain
Offline
Edison Member
Karma: 33
Posts: 2017
|
 |
« Reply #11 on: August 21, 2012, 04:38:38 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Donostia
Offline
God Member
Karma: 0
Posts: 672
elektronikadonbosco
|
 |
« Reply #12 on: August 23, 2012, 03:59:50 am » |
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  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
|
|
|
|
« Last Edit: August 23, 2012, 04:54:16 am by ionhs »
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #13 on: August 23, 2012, 06:54:07 am » |
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.htmlhttp://real2electronics.blogspot.co.uk/2009/09/power-sleep-mode.htmlLa verdad que tampoco me lo he vuelto a mirar, y ha pasado bastante tiempo de esto ...
|
|
|
|
« Last Edit: August 23, 2012, 06:59:52 am by Igor R »
|
Logged
|
|
|
|
|
Donostia
Offline
God Member
Karma: 0
Posts: 672
elektronikadonbosco
|
 |
« Reply #14 on: August 23, 2012, 07:56:56 am » |
Gracias Igor, me guardo el link para cuando tenga tiempo 
|
|
|
|
|
Logged
|
|
|
|
|
|