Lectura tren de pulsos

Hola un saludo a todos.
Estoy intentando leer un tren de pulsos variable, pero que como máximo alcanza, 25kHz. Navegando por internet y estudiando los timers de los pic, por cierto programo en C con el CCS, Estoy teniendo algunos problemas.

Adjunto mi código:
Código:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

//DEFINES
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7

#define LCD_RS PIN_D0
#define LCD_RW PIN_D1
#define LCD_E PIN_D2

#include <flex_lcd.c>

int16 contador=0;


#int_TIMER1
void TIMER1_isr(void) 
{
   contador=get_timer0();
   printf(lcd_putc,"\f %lu",contador);
   set_timer0(0);
   set_timer1(65411);
}



void main()
{

   lcd_init();
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_8);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   
   set_timer0(0);
   set_timer1(65411);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);

   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   while(1)
   {
   
   }
   

   // TODO: USER CODE!!

}

He configurado el timer0 para que reciba la señal externa y empezará a almacenar pulsos (Contar), y el timer1 para que lo haga con pulsos del reloj interno.

con la formula del timer para que desborde:
2enpwko.jpg

La he calculado para que me cuente cada 1mS:
2ekoj82.jpg

[donde pone 250 debería poner 25]​

Por lo que si con 25kHz tengo un periodo de 40µS, haciendo una simple regla de tres cada milisegundo me contará 250 pulsos, no?
bueno pues implemento esto en el Proteus y el LCD me saca por pantalla "13" que dista mucho de los 25 que pensaba obtener.

¿Alguien que me eche una manita!?

gracias!
 
Última edición:
Hola,
Yo lo haría distinto.
Me parece que lo mejor es que esperes la interrupción INT0 en el flanco ascendente de un período por ejemplo, ahí encendés el timer y contás hasta que llegue la interrupción INT0 otra vez lo que significa que hubo un período completo. Lo mejor es incrementar una variable en función del desbordamiento del timer interruptivo.
El valor de esa variable va a ser proporcional al período.

Tal vez tu error es que no tu variable "contador" se desbordó. No uso tu complilador pero no se ve donde la declaraste ni de que tipo es. Debería ser unsigned int o long.
Saludos
 
Atrás
Arriba