Medición de ancho de pulso externo pic16f876.
Hola.
Estoy tratando de medir el ancho de un pulso externo con un microcontrolador pic16f876, el problema es que solo consigo medir pulsos aproximadamente de 0.524 seg. Esto es debido a la configuración del Timer1. El Timer1 se desborda cada 65536 pulsos y con el divisor de frecuencias de 8us, esto multiplicado me da 0.524 seg. pero no paso de ahi. El programa en que lo estoy llevando acabo es el c ccs compiler. La simulación está en el proteus. La entrada del pulso se realiza por medio de Rb0. Este es el programa:
#include <16F876.h>
#device adc=10
#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)
#include <LCD.C>
Int16 TFB; // Tiempo flanco de bajada
float AP; // Valor final del ancho de pulso
int1 nuevopulso=0; // Entra otro pulso
int1 cambio=0; //Cambio de flanco de disparo
float d=0.8;
float velocidad;
float tiempo;
#int_ext
void funcion_ext_int(){ //Función Interrupción
if(cambio==0){ // Flanco de Subida
set_timer1(0); //Inicializa TMR1
TFB=get_timer1();
ext_int_edge(0,H_TO_L); // Configurar para flanco bajada
cambio=1; // Control de cambio de flanco
} else { // Flanco de Bajada
TFB=get_timer1(); //Valor del Timer1 para el Flanco de bajada
ext_int_edge(0,L_TO_H); //Configurar para flanco subida
cambio=0; //Control de cambio de flanco
if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //Pulso a calcular
}
}
}
void main() {
int16 q;
float p;
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
lcd_init();
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Configuración TIMER1
ext_int_edge(0,L_TO_H); // Configurar para flanco subida
cambio = 0; // Control de cambio de flanco
enable_interrupts(int_ext); //Habilitación interrupción RB0
enable_interrupts(global); //Habilitación general
while (True) {
set_adc_channel(0); //Habilitación canal0
q = read_adc(); //Lectura canal0
p = 90.0 * q / 1022.0; //Conversión a grados
printf(lcd_putc, "\f%01.2f Grados\nTiempo = %1.3f S", p,AP);
delay_ms(10);
if(nuevopulso==1){ // ¿Pulso nuevo?
AP = (TFB)*8.0/1000000;
velocidad=d/AP; // a 4MHZ el T=1us*Timer1
tiempo=d/velocidad;
}
}
}
Adjunto una carpeta con la simulación.
Saludos y mil gracias.