TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jnavarro en 16 de Junio de 2008, 09:33:27
-
Hola,
Trato de añadirle a un proyecto con un 18LF2550 un perro guardian.
Necesitaria que el perro saltase cada 2 segundos aproximadamente.
He mirado la configuracion, y por mucho que mas la miro no encuentro donde me equivoco, el caso es que como configuracion hago lo siguiente:
añado el: #FUSES WDT128
y luego en mi programa principal, al iniciar el main:
setup_wdt(WDT_ON);
restart_WDT();
Tengo una interrupcion por el Timer0 cada 1024ms que funciona correctamente, la he testeado, y en ella hago un restart_WDT();
Utilizo un reloj a 48MHz, y segun he visto en la configuracion, al poner el WDT128 el watchdog deberia de saltar cada 2304ms, pero el pic se me resetea continuamente, es como si no llegara ni siquiera a 1 segundo.
¿alguna idea?
-
Sería muy interesante que pusieras el código.
Yo no te recomendaría que refrescaras el WDT en la interrupción.
Puedes leer cosas muy interesantes aquí:
http://www.todopic.com.ar/foros/index.php?topic=18647.msg130137#msg130137
Seguro que no le da tiempo a refrescarse por primera vez y por eso se te resetea continuamente.
Un saludo desde Alicante.
-
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){
}
}
-
Hola jnavarro.
Si colocas #FUSE WDT128 estas definiendo un postescalador para el perro de 128 veces el periodo nominal del mismo, el cual es 4 ms. Entonces, 4 ms x 128 = 512 ms. No son 2304 ms obviamente y dado el periodo del perro y los postescaladores a tu disposición, no puedes obtener 2304 ms de periodo del wdt con un 18F2550. El valor más cercano a este es el periodo 2048 ms si utilizas un postescalador de 512, o sea colocando #FUSE WDT512.
Espero haberte sido de utilidad.
0x01 Saludo.