#device PIC16F877
#include <16F877.h>
#fuses XT, NOWDT
#use delay(clock=4MHZ)
#define use_portb_lcd TRUE
#define LCD_ENABLE_PIN PIN_B0 ////
#define LCD_RS_PIN PIN_B1 ////
#define LCD_RW_PIN PIN_B2 ////
#define LCD_DATA4 PIN_B3 ////
#define LCD_DATA5 PIN_B4 ////
#define LCD_DATA6 PIN_B5 ////
#define LCD_DATA7 PIN_B6
#include <lcd.c>
#use standard_io(B)
#use standard_io(A)
#BYTE TMR0 = 0x01
#BYTE TMR2 = 0x11
#BYTE OPTION_REG = 0x81
#BYTE T2CON = 0x12
int16 rpm=0;
int8 tim,cont=0;
// *************** FUNCION CONTADOR DE RPM ***************
void cont_rpm() {
tim,rpm=0;
tim=get_timer0(); // Almacena el valor del contador en la variable "tim"
rpm=tim*60; // Cálculo RPM motor a partir de los pulsos almacenados en "tim"
set_timer0(0); // Resetea el contador a 0
}
// *************** FUNCION MOSTRAR EN LCD ***************
void display_rpm() {
lcd_gotoxy(1,1);
printf(lcd_putc,"RPM = %Lu",rpm);
}
// *************** INTERRUPCION EN TIMER 2 ***************
#int_TIMER2
void TIMER2_isr(void){
if (cont==15){ //Contador a 15 para que haga 1s de conteo en TMR0
set_timer2(255); //Carga del TMR2 a 255 para obtener 1s/15
output_toggle(pin_A0); //Simplemente para saber que está funcionando
cont_rpm(); //Llamada a función de conteo RPM
cont=0;} //Borra el contador para volver a esperar 1s
else{
set_timer2(255); //Vuelve a cargar el TMR2
cont++;} //Sigue contando hasta hacer 1s
}
// *************** PROGRAMA PRINCIPAL ***************
void main() {
lcd_init(); // Inicializar LCD
OPTION_REG=0x28; // Registro para habilitar el TIMER0, en flanco ascendente, con un Prescaler de 1:1 al WDT
setup_timer_2(T2_DIV_BY_16,255,16); // Prescaler = 1:16 | Carga TMR2 = 255 | Postcaler = 1:16
enable_interrupts(global); // Habilitación interruppciones globales
enable_interrupts(INT_TIMER2); // Habilitación interrupciones TMR2
while (1); // Bucle de repetición indefinido
display_rpm(); //Representar constantemente las RPM, aunque el muestreo de pulsos durante 1 segundo no esté completo
}