ImagenImagenImagenImagen
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

Watchdog

Postea aqui toda la parte de programación del lenguaje C, C++, C#...

Moderador: Junta Directiva

Responder
wirry
Novato
Novato
Mensajes: 16
Registrado: Dom Oct 04, 2009 2:23 am
Nombre: Carles

Watchdog

Mensaje por wirry » Sab Oct 31, 2009 11:00 pm

Hola chicos, necesito vuestra ayuda, necesito habilitar el watchdog. Tengo entendido que el watchdog funciona de la siguiente manera:
Hay un contador, y dicho contador va aumentando conforme avanza las rutinas del micro controlador, cuando llega ese contador al límite establecido, el micro se resetea solo, para eso el programador tiene que escribir un reset del watchdog para resetear el contador. Esto se hace para que no esté siempre resteándose el micro.
Vale pues ahora necesito vuestra ayuda para que este código tenga watchdog, tengo algo escrito como los fuses y algo más. Pero no sé como activar el watchdog y hacerle un reset al contador.
¿Alguien con alma caritativa me puede añadir esas pocas líneas que falta a mi código?
Estoy programando para CCS
Gracias y perdonad si abuso un poquito.

Código: Seleccionar todo

#include <16F88.h>
    #device adc=10
    #FUSES XT,WDT,BROWNOUT
    #define WDT_ON                                    //Habilito watchdog
    #define use_portb_lcd TRUE
    #use delay(clock=4000000)
    #include <math.h>
    #use rs232 (baud=9600, xmit=pin_b5, rcv=pin_b2, bits=8)
    #BYTE TRISA = 0X85
    #BYTE PORTA = 0X05
    #BYTE TRISB = 0X86
    #BYTE PORTB = 0X06
    //#BYTE CMCON = 0X9C

    void main() {

    int16 pre,temp,tempn,hum ;
    int presiol,presioh;
    int temperatural,temperaturah;
    int temperaturanl,temperaturanh;
    int humedadl,humedadh;
    int checksum;
    SETUP_WDT(2304);                     //Pongo el watchdog a 2304 milisegundos
    setup_adc_ports(all_analog);
    setup_adc (ADC_CLOCK_INTERNAL);
    setup_oscillator(OSC_4MHZ|OSC_INTRC);


    while(1){

    //TEMPERATURA POSITIVA
    set_adc_channel(0);
    temp=read_adc();
    delay_ms(20);
    temperatural=make8(temp,0);  // parte temperatura baja
    temperaturah=make8(temp,1);  // parte temperatura alta

    //TEMPERATURA NEGATIVA
    set_adc_channel(1);
    tempn=read_adc();
    delay_ms(20);
    temperaturanl=make8(tempn,0);  // parte temperatura (negativa) baja
    temperaturanh=make8(tempn,1);  // parte temperatura (negativa) alta

    //PRESIÓN
    set_adc_channel(2);
    pre=read_adc();
    delay_ms(20);
    presiol=make8(pre,0);  // parte presión baja
    presioh=make8(pre,1);  // parte presión alta


    //HUMEDAD
    set_adc_channel(3);
    hum=read_adc();
    delay_ms(20);
    humedadl=make8(hum,0);  // parte humedad baja
    humedadh=make8(hum,1);  // parte humedad alta

    // Calculamos el checksum como una XOR
    checksum = temperatural ^ temperaturah ^ temperaturanl ^ temperaturanh ^ presiol ^ presioh ^ humedadl ^ humedadh;

    bit_clear(TRISB,7);
    bit_set(PORTB,7);
    putc(0xAA);                  //Envio 170
    delay_us(5);
    putc(0xAA);                  //Envio 170
    delay_us(5);
    putc(temperatural);         //Envio 1º dato
    bit_clear(PORTB,7);
    delay_us(5);
    putc(temperaturah);         //Envio 2º dato
    delay_us(5);
    putc(temperaturanl);         //Envio 3º dato
    bit_set(PORTB,7);
    delay_us(5);
    putc(temperaturanh);         //Envio 4º dato
    delay_us(5);
    putc(presiol);               //Envio 5º dato
    bit_clear(PORTB,7);
    delay_us(5);
    putc(presioh);               //Envio 6º dato
    delay_us(5);
    putc(humedadl);               //Envio 7º dato
    bit_clear(PORTB,7);
    delay_us(5);
    putc(humedadh);               //Envio 8º dato
    delay_us(5);
    putc(checksum);                  //Enviamos el checksum
    delay_ms(500);
    RESTART_WDT();                     //Resetea el watchdog
    }
    }



Avatar de Usuario
Heli
Usuario Experto
Usuario Experto
Mensajes: 747
Registrado: Mar May 23, 2006 7:47 am
Nombre: Heli Tejedor
Ubicación: Alcala de Henares
Contactar:

Re: Watchdog

Mensaje por Heli » Lun Nov 02, 2009 9:57 am

Tienes que activarlo en los fuses, y poner en la inicialización:
setup_wdt(WDT_2304MS); // Poner el periodo de WD si lo soporta el micro
setup_wdt(WDT_ON); // Activar el WD
Luego tienes que hacer periódicamente:
restart_wdt(); // Resetearlo para que no resetee

La ayuda de CCS explica mas sobre como usar estas directivas.
¡No es imposible, lo que pasa es que no sabes como hacerlo!
http://heli.xbot.es/" onclick="window.open(this.href);return false;

Avatar de Usuario
Sphinx
Usuario Experto
Usuario Experto
Mensajes: 639
Registrado: Jue Abr 03, 2008 4:45 pm
Ubicación: Madrid
Contactar:

Re: Watchdog

Mensaje por Sphinx » Lun Nov 02, 2009 12:01 pm

virry escribió:...Tengo entendido que el watchdog funciona de la siguiente manera:
Hay un contador, y dicho contador va aumentando conforme avanza las rutinas del micro controlador, cuando llega ese contador al límite establecido, el micro se resetea solo, para eso el programador tiene que escribir un reset del watchdog para resetear el contador. Esto se hace para que no esté siempre resteándose el micro.
Hola, una puntualización: El concepto de Watchdog va asociado a un temporizador. El temporizador corre independiente de las rutinas o de lo que haga el micro (!). Cuando el tiempo establecido para el watchdog expira, el micro se resetea...y vuelta a empezar. Por eso, como dice Heli, tienes que andar ejecutando la instrucción restart_wdt(); en mitad de tu código antes de que el temporizador alcance el tiempo establecido.
Y para eso, tienes que tener en cuenta la duración(tiempos) de tus rutinas, y saber donde tienes que resetear el watchdog, antes de que este te resetee el micro cuando precisamente no querías.

Algunas notas sobre el watchdog en los tutoriales de Arde:
http://wiki.webdearde.com/index.php/Tut ... hdog_Timer" onclick="window.open(this.href);return false;

Saludos,
Sphinx.

wirry
Novato
Novato
Mensajes: 16
Registrado: Dom Oct 04, 2009 2:23 am
Nombre: Carles

Re: Watchdog

Mensaje por wirry » Lun Nov 02, 2009 6:05 pm

Gracias chicos, ya lo tengo claro.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 1 invitado