Hola como estan, estoy intentando hacer un detector de velocidad con un pic16f876 y utilizando ccs para hacer el programa, la cuestion esta en que para ello requiero que el pic me logre contrar almenos en centenas de microsegudos, es decir, de 100u en 100u, asi que empece por hacer una rutina que me active el timer0 cuando se active el puerto A0 y que se detenga cuando se active el puerto A1, ya que usare dos detectores de presencia para calcular la velocidad. pero al hacerlo me da tiempos equivocados y por tanto velocidadades equivocadas, pense en principio que era por los retardos que me dan las instrucciones del ccs, por eso entré en la opcion del compilador que me da el assembler de cada instruccion, saque mis cuentas de los retardos por instruccion y observo que las cuentas se cumplen perfectmente cuando la cuenta estaba por los segundos, pero cuando se cuenta en milisegundos que va!! da errores y peor aun llego un punto en el que solo era de contar 18.4 milisegundos, es decir, a partir de 30 milisegundos para abajo solo contaba 18,4 milisegundos por favor requiero ayuda que puedo hacer para tener el tiempo mas exacto sin tener que usar nada mas que el pic?
aca coloco el codigo:
#include <16f876.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#include <lcd.c>
double useg=0;
double v=0,th=0;
#int_TIMER0
void TIMER0_isr()
{
useg=useg+1;
set_timer0(220);
}
void main()
{
lcd_init();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_BIT);
enable_interrupts(int_timer0);
enable_interrupts(global);
WHILE (1)
{
while (input(PIN_A0)==0){}//Espera activación de primer sensor
set_timer0(220);
enable_interrupts(INT_TIMER0);
while (input(PIN_A1)==0){}//Espera activación de segundo sensor
th=useg*0.0001;
v=(1.5/th)*3.6;// calculando la velocidad asumiendo distancia de 1.5 metros
printf(lcd_putc,"\fTiempo:\n%01.4g",th);
useg=0;
while (input(PIN_A0)==1){}//Espera desactivación de primer sensor
}
}
aca coloco el codigo:
#include <16f876.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#include <lcd.c>
double useg=0;
double v=0,th=0;
#int_TIMER0
void TIMER0_isr()
{
useg=useg+1;
set_timer0(220);
}
void main()
{
lcd_init();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_BIT);
enable_interrupts(int_timer0);
enable_interrupts(global);
WHILE (1)
{
while (input(PIN_A0)==0){}//Espera activación de primer sensor
set_timer0(220);
enable_interrupts(INT_TIMER0);
while (input(PIN_A1)==0){}//Espera activación de segundo sensor
th=useg*0.0001;
v=(1.5/th)*3.6;// calculando la velocidad asumiendo distancia de 1.5 metros
printf(lcd_putc,"\fTiempo:\n%01.4g",th);
useg=0;
while (input(PIN_A0)==1){}//Espera desactivación de primer sensor
}
}