Que solucioón me darias amigo pikman???
elfrancho, en principio te cuento que para nada soy de los que no les gusta brindar informacion, solamante que estoy demasiado ocupado hace un tiempo y no le estoy dedicando al foro el tiempo que se merece, asi que perdon por no responderte.
No tenes resolucion porque cuando tenes bajas revoluciones la cantidad de pulsos no la podes dividir, lo que tenes que hacer es medir el tiempo entre pulso y pulso, que sera el periodo, y a eso le haces la inversa y listo tenes la frecuencia por lo tanto las revoluciones, aca te pego un codigo que funciona, y lo podes adaptar al 16f628 porque tiene modulo CCP, que lo usa capturando los valores del timer1 entre un pulso y el otro, podes usar un XTAL de 4 MHZ y asi vas a tener incremento de 1 ms en el timer1 y es mas facil sacar las cuentas, de cualquier manera con 10 Mhz podes tener mas resolucion pero para lo que vos queres con 4 Mhz sobra, espero que te sirva, de hecho la rutina hace lo que vos queres.
saludos
ARIEL
//**********************************************************************
//
// Calcula la velocidad de rotacion contando el tiempo entre pulsos
//
//**********************************************************************
#include <16F877.h>
#fuses HS, NOWDT, NOLVP
#device *=16 ADC=10
#define COMENZAR 0
#define CONTANDO 1
#define TERMINO 2
#define VECES 2
#use delay (clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
// Variables Globales
char cEstado;
int32 int32Cont;
float fRpm;
//************************************************************************
// RUTINAS DE INTERRUPCION
#int_ccp1
void CCP1__isr(void) {
if (cEstado == CONTANDO) { // Segundo Pulso
int32Cont += CCP_1; // Toma el valor de captura
cEstado = TERMINO; // Evito que vuelva a procesarse durante esta interrupcion
}
if (cEstado == COMENZAR) { // Primer Pulso
set_timer1(0); // Restaura el timer1 en este pulso
cEstado = CONTANDO;
int32Cont = 0;
}
} // Fin CCP1__isr()
//************************************************************************
// CALCULO DE LA VELOCIDAD de rotacion
void velocidad(void){
char cCnt;
int32 int32Suma;
long tiempo;
cEstado = TERMINO;
while (TRUE) {
int32Suma = 0;
int32Cont = 0;
for (cCnt = 0; cCnt < VECES; cCnt++) { // Acumula VECES lecturas
cEstado = COMENZAR; // Permite comenzar a la interrupcion
while (cEstado != TERMINO) { // Espera hasta que se activa la interrupcion
tiempo = get_timer1();
if (tiempo > 65500) { // Controla si el contador excedio el tiempo. Valor Original = 60000
set_timer1(0); // Restaura el timer1 para seguir sumando el tiempo de este pulso
int32Cont += tiempo; // Acumula para velocidades de viento bajas
} // Fin if
} // Fin if
int32Suma += int32Cont; // Acumula los tiempos
} // fin for
int32Suma /= VECES; // Saca el promedio de las VECES que se tomo la medicion
fRpm = 1 / ( float ) int32Suma / 8 * 2.5; // Periodo en uS
fRpm *= 1000000; // Periodo en segundos
printf("\rFRECUENCIA %05.1f Hz\r\r",fRpm);
fRpm *= 60; // Periodo en minutos
printf(" %f \r", fRpm);
}
}// Fin velocidad()
//*****************************************************************
// MAIN
//
void main (void){
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8 );
setup_ccp1 (CCP_CAPTURE_FE); // Captura cada pulso = 0 (0v)
delay_ms (200);
enable_interrupts (INT_CCP1);
enable_interrupts (GLOBAL);
while(1){
velocidad();
} //Fin While
} // Fin Main
//*****************************************************************************
que bueno que encontraste esa solucion tengo el mismo problema pero lamentablemente se programar en picbasic
te molesto mucho si me haces un ejemplo de cuenta el tiempo entre pulsos en basic???
desde ya te agradesco la molestia
saludos