#include <16f877a.h>
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOLVP,BROWNOUT
#use delay(clock=20M)
#include <stdio.h>
#use fast_io(B)
#use standard_io(D)

#define LCD_DB4  PIN_D4
#define LCD_DB5  PIN_D5
#define LCD_DB6  PIN_D6
#define LCD_DB7  PIN_D7
#define LCD_RS   PIN_D2
#define LCD_E    PIN_D3
#include <LCD_16X2.c>



int16 contador;
int16 Desbordamientos; 

int16 Ta;
int16 Tb; 
int16 Tick;

int16 T2_desbor;
int16 T_desbor;



#INT_EXT
void RB0() // Lee lo de la entrada en RB0
{
  Ta= get_timer1(); // Guardo el tiempo de Timer1 en una variable Ta
  Tick= Ta-Tb; // Obtiene el tiempo entre Ta y un Tb anterior a Ta
  Tb=Ta; // Tb es igual a Ta por que es el anterior al Ta 
}


#INT_TIMER1  // Interrupcion del timer 1 
void TIMER1_isr() //Incrementa 1 cuando se desborda el Timer1
{
  Desbordamientos=contador++; // Aumenta en 1 cuando se desborda
  T_desbor= Desbordamientos- T2_desbor; // Obtiene el numero de desbordes entre pulsos
  T2_desbor=Desbordamientos; 

}


void main()
{
   lcd_init(); // Inicializo el LCD
   
   SETUP_TIMER_1(T1_INTERNAL  |T1_DIV_BY_8);//Prescaler = 8
   
   enable_interrupts(INT_EXT);// Habilita la interrupcion externa en RB0
   ext_int_edge(L_TO_H);// Flanco de subida
   
   enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1
   ext_int_edge(L_TO_H); // Para Flanco de Subida
   
   enable_interrupts(GLOBAL);// Habilita la interrupciones globales
   
   while(true)
{

      lcd_gotoxy(1,1);
      printf(lcd_putc,"Tick : %Lu", Tick); // Imprime el tiempo entre periodos menores al desbordamiento
      
      lcd_gotoxy(1,2);
      printf(lcd_putc," Desb= %Lu  ", Desbordamientos); //Imprime el numero de desbordamientos
      
      
   }
}


