Bueno hay un problema ahi, estas usando un delay dentro de la funcion. Esto hace que cuando muestre tenga muchos mas pulsos acumulados de los que deberia, Con lo que el valor deberia ser incorrecto.
Por lo que veo queres que se actualize cada 1 segundo... Entonces te propongo un par de cambios:
#use delay(clock=20000000)
#include "C:\Users\xxx\Desktop\libreria_lcd\flex_lcd420.c"
#include <math.h>
int16 contador=0;
int1 flag=0;
int16 pulsos=0;
float RPM=0;
float VEL=0;
#int_TIMER1
void TIMER1_isr(void)
{
Contador++;
if(Contador==10)
{
flag=1;
Contador=0;
}
set_timer1(0);//Reinicia la cuenta
}
#int_CCP1
void CCP1_isr(void)
{
Pulsos++;
}
void main()
{
Set_tris_C(0x04); //C2 ENTRADA
lcd_init();
printf(lcd_putc, "VELOCIMETRO");
lcd_gotoxy(1,2);
printf(lcd_putc,"VELOCIDAD KM/H");
delay_ms(2000);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_ccp1(CCP_CAPTURE_RE);
set_timer1(0); //Borrado contador
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
do
{
if (flag==1){
RPM=pulsos*60; //Activa el flag cada 10 * 0.1s, se guardan los pulsos por 1 segundos
pulsos=0;
VEL=RPM*0.030159089; //RADIO ES DE 8 CM
lcd_putc('\f');
printf(lcd_putc,"Vel = %0f Km/h",VEL);
lcd_gotoxy(1,1);
flag=0;
}
}while(true);
}
Puse en negrita lo que cambie, antes guardabamos la cantidad de pulsos cada 0.1s y haciamos los calculos, primero multilpicabamos por 10 y luego por 60.
Ahora directamente observamos cuantos pulsos hay en 1 segundo (el timer sigue siendo de 0.1s pero no activa el flag hasta que Contador sea igual a 10, es decir 1 segundo)
Una ves utilizada la formula que usa la variable "pulsos" ya no nos interesa saber el valor que tenga,asi que procedemos a borrar la cantidad de pulsos, para poder comenzar nuevamente.
Respecto al do ..while y el while.
Casi no hay diferencias entre estos, la unica diferencia es que el do..while se ejecuta y luego observa la condicion, mientras que el while hace lo contrario, observa la condicion si se cumple ejecuta el codigo
do
{
PrenderLed();
ApagarLed();
} while (false);
Suponiendo que tenemos unas funciones asi. Ese codigo haria que el led se encienda y luego se apague y al no cumplir se la condicion no se sigue ejecutando
While(false)
{
PrenderLed();
ApagarLed();
}
Este ultimo codigo nunca se ejecutaria, ni siquiera una sola ves.
Para lo que nos compete, es exactamente lo mismo, ya que tratamos de crear un bucle infinito, pero uso el while por que es mas corto.