Go Down

Topic: WatchDog (Read 4090 times) previous topic - next topic

flico

Quiero poner un watchdog para que cuando algún proceso del programa tarde mas tiempo de la cuenta se resetee el micro. Estoy usando un Duemilanove con un Atmega168, con este codigo pasado el tiempo del watchdog (8 segundos), el led del pin 13 se queda parpadeando de forma muy rápida pero no resetea el programa. Podéis probarlo con un atmega328 para ver si este es el problema.

Code: [Select]

#include <avr/wdt.h>

void setup()   { 
  wdt_disable(); 
  Serial.begin(9600);       
  wdt_enable(WDTO_8S);
}

void loop()                     
{
Serial.println("Test");
delay(10000);
wdt_reset();
}



Saludos.
Trabajando en ...

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

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

flico

Me puedo imaginar que el tema esta en el bootloader que tengo metido.
Trabajando en ...

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

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

flico

Pues he probado a meter otra versión de bootloader y hace lo mismo, cuando llega el tiempo que tienes puesto en el watchdog empieza a parpadear el led del pin 13 de forma muy rápida.

Saludos.
Trabajando en ...

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

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

aero_yo

#3
Jul 22, 2011, 12:32 pm Last Edit: Jul 22, 2011, 12:39 pm by aero_yo Reason: 1
Por lo visto es un problema del bootloader, el de ladyada tiene este problema resuelto

http://www.ladyada.net/library/arduino/bootloader.html


http://code.google.com/p/arduino/issues/detail?id=181

flico

Voy a probar a cargar este bootloader y te cuento.

Gracias.
Trabajando en ...

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

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

aero_yo

SE me ha ocurrido otra solución leyendo otro hilo del foro, programar el arduino sin bootloader.

Evitas el problema del bootloader en el reset y éste es más rápido.


Hola

Con esos programadores haces lo mismo que siempre, sigues usando el ide del arduino y cargas el programa en el arduino pero con una ventaja, no cargas el bootloader (parte de programa para que puedas programar los arduinos desde el usb) y consumes menos memoria, aparte que cargas mas rapido la compilacion en el arduino.

Eso no quita cuando quieras, vuelvas a cargar el bootloader y vuelvas a usar el arduino programandolo por el usb.

Ventajas:
Rapidez y economia de ram.
Cargas bootloaders en chips Atmel virgenes.
Cargas el programa mas rapido.

Desventajas:
no puedes programar el arduino por usb ya que le quitas el bootloader pero puedes cargar el bootloader siempre que quieras, no es irreversible.

Yo, ultimamente, estoy cargando todos los pde a traves del usbtiny, ya no uso el bootloader del arduino salvo contadas ocasiones.

Un saludo

PD: si vas a usarlo, y necesitas ayuda dentro de mis posibilidades, comentalo en el foro, solo hay un detalle, es que cuando cargas los pde a traves del usbtiny hay que cambiar un fichero de configuracion:

  La solucion esta en editar un fichero de texto que se encuentra (en el caso de usar windows) en:

c:\Documents and Settings\<USERNAME>\Application Data\Arduino\preferences.txt

En mi caso:
c:\Documents and Settings\administrador\datos de programa\Arduino\preferences.txt

ese fichero hay que editarlo y cambiar la linea de texto que dice:

upload.using=bootloader

por este otro:

upload.using=usbtinyisp

flico

Esta solución esta bien para ahorrarte el bootloader, pero no es lo que busco. La historia es saber como hacer un reset cuando el programa se queda frito en algún sitio.
Por cierto de donde has sacado aero_yo lo del usbtiny?

Saludos.
Trabajando en ...

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

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

aero_yo

de aquí:
http://arduino.cc/forum/index.php/topic,66375.msg497039.html

El problema del reset es el bootloader, con lo que has puesto antes debería hacerlo, pero se queda pillado en la recarga del bootloader al hacer el primer reset, sin bootloader no hay problema.


Según esto:
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
entiendo que cada vez que haces reset el Watchdog se reinicia con el valor más bajo (15ms) con lo que no da tiempo a completar la ejecución del código del bootloader.

flico

Quote
Según esto:
http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
entiendo que cada vez que haces reset el Watchdog se reinicia con el valor más bajo (15ms) con lo que no da tiempo a completar la ejecución del código del bootloader.


He probado ha subir el tiempo hasta 8 seg que es el maximo y hace lo mismo, se queda frito.

Voy a ver si puedo cargarlo sin bootloader, porque no tengo apaños.

Saludos.
Trabajando en ...

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

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

aero_yo

  da igual que pongas 8s, porque cuando se resetea vuelve a 15ms en el bootloader por defecto, y no le da tiempo a leer la orden de volver a 8s, que va después del boot.

Suerte y ya me contarás porque yo también quiero implementarlo en un proyecto pero no tengo el programador isp aún.

flico

No lo sabia que por defecto son 15ms.
Saludos.
Trabajando en ...

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

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

Sergegsx

como ha terminado esto?

tengo un proyecto en el que me vendria genial. Es un medidor electrico que sube los datos a internet cada 10segundos, el problema es que a veces (pueden pasar dias que va todo OK) se queda colgado y no reconoce la conexión a internet.

me interesaria alguna forma que cada "1 hora" se resetee el arduino este ejecutando el codigo en el punto que sea.

se puede hacer esto con lo que estas investigando tu flico??

gracias

aero_yo

#12
Jul 31, 2011, 10:01 pm Last Edit: Jul 31, 2011, 10:07 pm by aero_yo Reason: 1
El tiempo máximo es de 8s, si puedes cambiar esos 10 segundos a 8 y le da tiempo a ejecutar todo el código de conexión en ese intervalo igual te puede servir.

Podrías esquivar esta limitación activando el wtd después de conectado, pero te la juegas a que si hay un cuelgue durante la conexión no entre el reset.

Sergegsx

#13
Jul 31, 2011, 10:06 pm Last Edit: Jul 31, 2011, 10:57 pm by Sergegsx Reason: 1
en realidad los 10 segundos son porque tengo una condicion if que hace que se ejecute cada 10 segundos. es decir, el bucle loop esta todo el rato dando vueltas sin problemas.
en cuanto a subir los datos, tarda 2 segundos en llamar a la web para subir los datos.

dicho esto, me valdria el watchdog para resetear el arduino cada 1 hora ?
en tal caso, se define el watchdog al principio y el ya se encarga de ejecutar el codigo de reset cuando se cumpla la hora??

muchas gracias pero es que lo del watchdog es nuevo, pero estoy leyendo para intentar entenderlo.

edit...

este link lo explica facilito y creo que ya lo tengo claro, voy a aplicarlo en mi codigo a ver que tal.
http://blog.bricogeek.com/noticias/arduino/como-utilizar-watchdog-con-arduino/

edit2...

mierda no habia visto que hay que cambiarle el bootloader !!
Esto no lo he hecho nunca y no tengo un programador externo, asi que mi gozo en un pozo!!! que rabia.
tendre que hacerme con un programador externo de esos y probar.

shaktale

No hace falta que compres un grabador, solo compra otro atmega y con el que tienes ahora puedes programarlo por ISP, cargando el ejemplo que viene en el IDE llamado ArduinoISP, tienes mas info aqui:

http://arduino.cc/es/Tutorial/ArduinoISP
Si quieres ser mas positivo....pierde un electrón......

Go Up