TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: eleazar83 en 02 de Noviembre de 2009, 02:59:04
-
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.
-
Mira por aquí (http://174.123.172.210/~todopicc/foros/index.php?topic=14427.msg87502#msg87502)sobre técnicas de medición de pulsos.
Saludos!
-
Gracias suki.
Hice la prueba con un pic 18f452 y cambie en el programa la libreria de #include16f876 a #18f452 y me corrio como debia. Mi duda porque con el pic 16f876 no lo puedo simular en el proteus y con el 18f452 si???. Envio los archivos correpondientes para q lo puedan ver.
-
Hola,
Me da la impresión que estoy dando los mismos pasos que eleazar83. Actualmente estoy usando el libro de C CCS, asta ahora lo poco que he hecho era en ensamblador con MPLAB, y el C es nuevo para mi.
Añado a este hilo que he probado el programa directamente en el PIC en mi entrenador y va perfectamente, incluso con osciloscopio, generador, y mide bien el pulso, con sus límites en baja y en alta, el cual no encuentro los datos que apunte.
La pena es que el proteus no haga ni mu. Para mi que no entra en la interrupción y se queda esperando.
-
Gracias suki.
Hice la prueba con un pic 18f452 y cambie en el programa la libreria de #include16f876 a #18f452 y me corrio como debia. Mi duda porque con el pic 16f876 no lo puedo simular en el proteus y con el 18f452 si???. Envio los archivos correpondientes para q lo puedan ver.
buenas noches. el mismo problema, alguien me podria indicar como se puede solucionar esto y otra consulta esta line del codigo que funcion tiene: #byte PIR1=0x0C
gracias por la ayuda