Por ejemplo este trozo de codigo, en teoria el WDT al estar a 128 deberia desbordar cada 2304 ms, y la interrupcion del Timer0 cada 1400 ms. Luego la ejecucion que espero, es recibir por el rs232 la cadena "int" cada 1,4 segundos.
Pues bien, no se porque pero el PIC se resetea y recibo continuamente la cadena "Hola" y en algunas ocasiones tras la cadena "Hola" recibo la cadena "int", pero solo una vez.
Es como si el watchdog desbordara antes de tiempo.
#include <18F2550.h>
#FUSES WDT
#FUSES WDT128
#fuses HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000,RESTART_WDT)
#include <stdio.h>
#include <string.h>
//________________________________________________________________________________________________
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8, stream = Canal_WC,TIMEOUT=1000)
#use rs232(baud=38400,parity=N,xmit=PIN_B1,rcv=PIN_B0,bits=8, ERRORS, stream = Canal_PC,TIMEOUT=1000)
#define Enciende Output_High
#define Apaga Output_Low
#define Conmuta Output_Toggle
#define ledSistEnchufado PIN_A0
#define ledWC PIN_A1
#define ledNaranja PIN_C0
#define ledRojo PIN_C1
#define resetWC PIN_B5
#define MAX_BUFFER 120
#define _TIMEOUT 60000
void inicializarPIC(void);
//================ Interrupción del temporizador Timer 0 =========================================================================================
/*
Puesto que el reloj es 48MHz, el preescaler es 256 y el timer1 es de 16 bits (16bits = 65536 cuentas)
El timer desbordará cada:
1
--------- · 4 · 256 · 65536 = 1,4 segundos (aprox) en realidad es cada: 1,398101333... segundos
48·10^6
con el post a 16 desbordaria cada 0,0873 seg = 87,38 ms
*/
#int_TIMER0
void TIMER0_isr(void) {
restart_wdt();
fprintf(Canal_PC,"interrupcion");
}
void inicializarPIC(void){
Apaga(resetWC);
Apaga(ledWC);
Apaga(ledSistEnchufado);
Apaga(ledNaranja);
Apaga(ledRojo);
ext_int_edge(0, H_TO_L); //Configuro las interrupciones externas para que se disparen cuando se produzca un cambio de alto a bajo
ext_int_edge(2, H_TO_L); //para utilizarlas como lineas rs232
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_TIMER0); //Interrupcion por Timer
enable_interrupts(int_ext); //Interrupcion del PC
}
void main(){
restart_wdt();
inicializarPIC();
restart_wdt();
fprintf(Canal_PC,"\r\n Hola\n");
enable_interrupts(global);
restart_wdt();
while(TRUE){
}
}