fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Watchdog

4 Respuestas
3 Usuarios
0 Reactions
6,087 Visitas
wirry
Respuestas: 16
Topic starter
(@wirry)
Active Member
Registrado: hace 15 años

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

Responder
3 respuestas
heli
Respuestas: 748
 Heli
(@heli)
Ardero
Registrado: hace 19 años

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.

Responder
sphinx
Respuestas: 651
(@sphinx)
Ardero
Registrado: hace 17 años

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

Responder
wirry
Respuestas: 16
Topic starter
(@wirry)
Active Member
Registrado: hace 15 años

Gracias chicos, ya lo tengo claro.

Responder
Compartir: