Hola a todos:
Miren tengo un problema para medir el ancho del pulso mediante el modulo ccp. Les envio 2 programa q tengo(en teoria hacen lo mismo), lo compilo y cero problemas, pero en el proteus no me muestra el valor del ancho del pulso.
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte pir1=0x0c
#include <math.h>
int1 nuevopulso=0; //Entra otro pulso
int16 TFB=0; //Tiempo flancos
int16 TFS=0;
int16 TF=0;
float AP; //Valor final del ancho de pulso
int1 cambio=0; //Cambio de flanco de disparo
#int_ccp1
void ccp1_int(){ //Función interrupción
if(cambio==0){ //Flanco de subida
TFS=CCP_1; //Carga del valor del registro CCPR1 en flanco subida
setup_ccp1(CCP_CAPTURE_FE); //Configuración modo Captura en flanco de bajada
cambio=1; //Control de cambio de flanco
} else { //Flanco de Bajada
TFB=CCP_1; //Carga del valor del registro CCPR1 en flanco bajada
setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //pulso a medir
}
}
}
void main() {
lcd_init();
disable_interrupts(global);
setup_timer_1(T1_INTERNAL); //Configuración TMR1
setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
cambio = 0; //Control de cambio a 0
enable_interrupts(int_ccp1); //Habilitación interrupción modulo CCP
enable_interrupts(global); //Habilitación interrupción global
do {
if(nuevopulso==1){ //¿Pulso nuevo?
TF=(TFB-TFS); //Ancho de pulso.
AP = TF*1.0; //Ancho de pulso en microsegundos (a 4MHz:1us)
printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
nuevopulso=0; //Pulso ya medido, espera nuevo
}
} while (TRUE);
}
--------------------------------------------------------------------------------------------------------------------
Este es el otro programa:
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte PIR1=0x0C
float AP=0.0; //Valor final del ancho de pulso
int1 nuevopulso=0;
long rise,fall;
int16 TF=0;
#int_ccp2
void isr()
{
rise = CCP_1;
fall = CCP_2;
nuevopulso=1;
// CCP_1 is the time the pulse went high
} // CCP_2 is the time the pulse went low
// pulse_width/(clock/4) is the time
// In order for this to work the ISR
// overhead must be less than the
// low time. For this program the
// overhead is 45 instructions. The
// low time must then be at least
// 9 us.
void main()
{
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
do {
if(nuevopulso==1){ //¿Pulso nuevo?
TF=(rise-fall); //Ancho de pulso.
AP = TF*1.0; //Ancho de pulso en microsegundos (a 4MHz:1us)
printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
nuevopulso=0; //Pulso ya medido, espera nuevo
}
} while (TRUE);
}
Les adjunto tambien el archivo de proteus para q lo puedan simular.
Ojala me puedan ayudar. Y decirme cual es mi error.
lo raro es q al cambiar el #include<16f876> por #include <18f452> (hago el cambio del cto. en el proteus obvio) me muestra por pantalla.
Porque sera????