TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gera en 21 de Julio de 2008, 17:47:07
-
Hola a todos! Que tal?
Estoy haciendo un programa que mida el periodo de un pulso con un pic 16f873A y lo muestre por un LCD. El problema es q no se por q se reinicia constantemente... llega a escribir algo en el LCD y luego se reinicia.
Me preocupa un warning q tira el compilador, pero no se q quiere decir:
Warning 216 "codigo.c" Line 40(0,1): Interrupts disabled during call to prevent re-entrancy: (@MULFF)
Me extraña porq no hay linea 40... pongo el codigo a continuacion.
#include <16f873a.h>
#FUSES NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=20000000)
#include "lcd.c"
float const usxtick = 0.2;
float st=0;
#int_ccp1
void handle_ccp1_int()
{
st=get_timer1()*usxtick;
set_timer1(0);
}
void main()
{
delay_ms(200);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(int_ccp1);
enable_interrupts(global);
lcd_init();
while(TRUE)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"T=%f us",st);
}
}
Alguien sabe por qué pasa esto? Muchas gracias de antemano!!
-
Hola.
Porque no procesas la multiplicacion en el main? Coloca un flag en la interrupcion para salir lo mas rapido de ahi.
Saludos
-
No, no hay caso... no entiendo por q se reinicia. Lo programe como para q actualice la medicion cada un segundo, y sin embargo lo hace mucho mas rapido. Sospecho q tiene q ver con los fusibles... pero la verdad q ni idea
Este es el nuevo codigo.
#include <16f873a.h>
#fuses NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=20000000)
#include "lcd.c"
float const usxtick = 0.2;
#int_ccp1
void handle_ccp1_int()
{
set_timer1(0);
}
void main()
{
int16 ticks;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
lcd_init();
while(TRUE)
{
ticks=CCP_1;
lcd_gotoxy(1,1);
printf(lcd_putc,"t=%f us",ticks*usxtick);
delay_ms(1000);
lcd_putc("/f");
}
}
ayuda por favor!!!
-
Hola.
Pues :? para que se reinicie solo seria por el WDT, pero veo que lo tienes deshabilitado :?, has hecho el debug en proteus? de pronto yendo paso a paso y coloca watch en los registros del WDT a ver que sucede.
Saludos
-
Es lo q se me ocurrio, que sea el WDT, porq se reinicia en una etapa bastante avanzada del programa. Pero esta apagado, asiq no se. No tengo el proteus como para probar, y no se como se usa :(
Voy a seguir probando a ver si descubro qué es... sospecho q es problema del código. Insisto en q me preocupa este warning:
Warning 216 "codigo.c" Line 40(0,1): Interrupts disabled during call to prevent re-entrancy: (@MULFF)
muchas gracias!
-
Hola.
Ese warning es porque el tiempo que toma hacer esa multiplicacion es largo y CCS desactiva las interrupciones para evitar entrar en ella nuevamente, por eso te dije al inicio del post que es mejor colocar un flag en la interrupcion (int1) y en el programa principal lo procesas con un if(flag), de esta manera no te demoras tanto en la interrupcion.
Saludos
-
Bien, parece q el problema no es el programa... buscando por el foro encontre este tema http://www.todopic.com.ar/foros/index.php?topic=20928.0
y segun veo, parece q este pic en particular tiene problemas con el modulo ccp :S
El otro pic q tengo para probar esto es el pic18f2550, pero no lo puedo programar hasta q me llegue mi nuevo programador :(
Muchas gracias por tu ayuda MLO, cuando me llegue el programador nuevo pruebo con este otro pic y vemos q sale.
Saludos!