Buenas, el problema es el siguiente, estoy diseñando un tacomentro para auto con un PIC y un LCD.
La primer versión contaba las variaciones de entradas en la pata A1 por cada siclo completo del programa (incluía un delay_ms(1) al final del bucle principal), al tener 200ms de registros procesaba la información.
Esto no me permitía tener una buena resolución, procesando cada 200ms tengo una resolución de 150rpm.
Opte por contar 4 pulsos y en base al tiempo transcurrido medir las rpm.
Esta cuenta la hice agregando un dalay_us(100) al final del bucle principal.
Para hacerlo mas profesional pase a usar la interrupción TIMER0 pero el problema es que esta interrupción esta corriendo mas lento de lo que debería y reporta peor las RPM que el precario sistema de poner un delay al final del bucle principal.
El codigo es el siguiente:
Espero se haya entendido y puedan ayudarme.
Saludos,
Federico.
La primer versión contaba las variaciones de entradas en la pata A1 por cada siclo completo del programa (incluía un delay_ms(1) al final del bucle principal), al tener 200ms de registros procesaba la información.
Esto no me permitía tener una buena resolución, procesando cada 200ms tengo una resolución de 150rpm.
Opte por contar 4 pulsos y en base al tiempo transcurrido medir las rpm.
Esta cuenta la hice agregando un dalay_us(100) al final del bucle principal.
Para hacerlo mas profesional pase a usar la interrupción TIMER0 pero el problema es que esta interrupción esta corriendo mas lento de lo que debería y reporta peor las RPM que el precario sistema de poner un delay al final del bucle principal.
El codigo es el siguiente:
Código:
#include <16f877A.h> /* PIC16F877A */
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT /* Fusibles (lo mas comun) */
#use delay (clock=20000000) /* Ajuste retardos 20M*/
//#use delay (clock=4000000) /* Ajuste retardos 4M*/
#use fast_io(a) /* Opcional */
#define LED_SHIFT PIN_C1
#define RPM_SIG PIN_A0 //IN
#include <lcd.c>
//VARIABLES!
int32 tmp1;//USO TEMPORAL.-
int32 tmp2,tmp3,tmp4;//USO TEMPORAL.-
long rpmant,rpm,rpmcount;//RESULTADO DE RPM Y CUENTA PARCIA.-
short int rpmhi,velhi;//GUARDA ESTADO DE SENSORES.-
int32 rpmtime1,rpmtime2;
void sensores2()
{
if((input(RPM_SIG)) && !rpmhi)
{
rpmhi=1;
rpmcount++;
if(rpmcount==1)
{
rpmtime1=tmp3;
}
else if(rpmcount==2)
{
/*
DEBERIA HACER 20.000 SICLOS CADA 1 SEGUNDO
EN REALIDAD HACE 15.533 POR SEGUNDO
*/
rpmcount=0;
rpmtime2=tmp3;
tmp1=rpmtime2-rpmtime1;
//rpm=1200000/2/tmp1; //VALOR IDEAL (20.000 * 60) /2 /tmp1
rpm=932000/2/tmp1; //VALOR FORZADO (15533 * 60) /2 /tmp1
tmp3=0;
}
}
if((!input(RPM_SIG)) && rpmhi)
{
rpmhi=0;
}
}
#int_TIMER0
Void TIMER0_isr(void)
{
tmp3++; //LO USO PARA VER LA VARIACION EN TIEMPO DENTRO DE sensores();
tmp2++; //LO USO PARA PRENDER Y APAGAR UN LED CADA 1 SEGUNDO.
if(tmp2==10000)
{
output_high(LED_SHIFT);
}
if(tmp2==20000)
{
tmp2=0;
output_low(LED_SHIFT);
}
sensores2(); //RECIBO DATA DE RPM Y PROCESO.
set_timer0(0);
}
//PROGRAMA PRINCIPAL !!!
void main(void)
{
lcd_init();
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(GLOBAL | INT_TIMER0);
set_timer0 (0);
rpmcount=0;
rpm=0;
while(TRUE)
{
printf(lcd_putc,"\fTMP1: %Lu", rpmtime2);
printf(lcd_putc,"\nTMP2: %Lu", rpm);
delay_ms(1);
}
}
Espero se haya entendido y puedan ayudarme.
Saludos,
Federico.