#include <16f876.h>
#use delay (clock=8000000)
/*Con Xtal de 8MHz, prescalador dividiendo entre 2
y si es de 16MHz entonces prescalador dividiendo entre 4*/
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT /* Fusibles (lo mas comun) */
#define Por2Vuelta PIN_B1 /*Pin para asignar 2 chispas por revolucion
valor por default es 1.*/
long Vrpm,Sample,Temporal;
short Tipe;
#define Inverso=1000000 //Resultado de multiplicar el inverso por 1^6.
#define Minutos=60 //Constante de llevar segundos a minutos.
#INT_EXT //Salta cada vez que hay un pulso.
void Sample_isr(void){ //Funcion para tratar la iterrupcion EXTERNA.
if(Por2Vuelta==0){ //Si el motor es de 2 Chispas por revolucion,
Tipe++; //tomo el valor del timer cada 2 saltos.
if(Tipe==0){
Sample=get_timer1(); //Guardo el tiempo en uS.
set_timer1(0); //Reinicio el valor del timer 1.
}
}
else
{
Sample=get_timer1(); //Si es un motor de 1 Chispa por revolucion.
set_timer1(0);
}
}
void main(void){
Temporal=0;
Tipe=0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); //Por utilizar un cristal de 8MHz.
enable_interrupts(GLOBAL | INT_EXT);
do{
Vrpm=Minutos*(Inverso/Sample);
if(Vrpm<>Temporal){
printf("Las revoluciones del motor son: %LuRPM\n\r",Vrpm);
Temporal=Vrpm;}
}while(True);
}