ImageImageImageImage
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#...

Moderator: Junta Directiva

Post Reply
wirry
Novato
Novato
Posts: 16
Joined: Sun Oct 04, 2009 2:23 am
Nombre: Carles

Watchdog

Post by wirry » Sat 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.

Code: Select all

#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
    }
    }

User avatar
Heli
Usuario Experto
Usuario Experto
Posts: 747
Joined: Tue May 23, 2006 7:47 am
Nombre: Heli Tejedor
Location: Alcala de Henares
Contact:

Re: Watchdog

Post by Heli » Mon 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;

User avatar
Sphinx
Usuario Experto
Usuario Experto
Posts: 639
Joined: Thu Apr 03, 2008 4:45 pm
Location: Madrid
Contact:

Re: Watchdog

Post by Sphinx » Mon Nov 02, 2009 12:01 pm

virry wrote:...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
Posts: 16
Joined: Sun Oct 04, 2009 2:23 am
Nombre: Carles

Re: Watchdog

Post by wirry » Mon Nov 02, 2009 6:05 pm

Gracias chicos, ya lo tengo claro.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest