Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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.#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
}
}
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.
...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/Tutorial:_Programaci%C3%B3n_de_PICs_en_Ensamblador#El_Watchdog_Timer " onclick="window.open(this.href);return false;
Saludos,
Sphinx.
Gracias chicos, ya lo tengo claro.