Tacometro con pic16f877a

Hola amigos, he estado tratando de hacer un tacometro digital con el pic16f877A para visualizarlo por LCD. He utilizado las interrupciones externas por el TMR0 que se supone es lo más conveniente para éste tipo de proyectos. El programa que he intentado hacer es el siguiente:

#include "16f877a.h"
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <math.h> //Necesaria para los cálculos matemáticos
#include <lcd.c>

int16 rpm=0;
int32 rpm_odl=0;

#int_TIMER0
void TIMER0_isr(void) //function interrupción TMR0
{
rpm=rpm*60;
if(!rpm_odl==0 && !rpm==0)
{
rpm=(rpm+rpm_odl)/2;
}
if(rpm==0)
{
rpm_odl=0;
}
rpm_odl=rpm;
printf(lcd_putc,"\fRpm \n%Lu", rpm);
delay_ms(1500);
rpm=0;
set_TIMER0(0xBCD); //inicializamos el TMR0
}

void main()
{
port_b_pullups(TRUE);
Lcd_init();
delay_ms(50);
lcd_putc("\f\NIngElectrica");
delay_ms(1000);
lcd_putc("\fTacometro\nUdisttrital");
delay_ms(500);
printf(lcd_putc,"\fRpm \n%Lu", rpm);
delay_ms(1500);
rpm=rpm++;
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_8);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
setup_comparator(NC_NC_NC_NC);

while(TRUE)
{
if(!input(PIN_D3))
{
while(!input(pin_D3)){}
delay_us(50); //Antirebote
}
}
}

El problema que tengo es que parece que no me cuenta el número de interrupciones externas y mucho menos me las muestra en el LCD, simplemente me aparece RPM y en la otra línea 0 pero no me está tomando valores. La vdd es que le he estado trabajando arto al código pero no logro obtener los resultados que quiero. Le agradecería mucho a alguno de ustedes que hechara una :apreton: para ver si logro salir de éste proyecto. El preescaler que quiero es de 8. También adjunto el archivo en proteus para que por favor revisen el montaje.

Adjunto el archivo en proteus, el archivo del código (PICC) y el .hex generado por picC.
 

Adjuntos

  • Tacometro.rar
    18.6 KB · Visitas: 110
Al simularlo después de 20 segundos en prouteus me muestra un valor de 60rpm, luego me muestra un valor de 1860rpm y luego de 23992 y luego de 43658 rpm, sin embargo no se si estará bien, por favor si alguno me ayudara a revisar el código y el montaje se lo agradecería.
 
Atrás
Arriba