//
// 32 bits Capture
// By pek '2005
//
// MCU: 18F248
// Clock: 40 MHz
//
// To be used with the CCS compiler
//

#include <18F248.h>
#fuses EC_IO,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT

#use delay(clock=40000000)
#use fast_io(C)

// Global variables
int16 gOFCntr = 0; // Overflow counter
int1 gEnableCntr = 0;

// Timer Overflow ISR
#INT_TIMER1
void overflow_isr()
{
   if(gOFCntr == 0xFFFF)
   {
      gEnableCntr = 0;
   }

   gOFCntr++;
}

// Capture ISR
#INT_CCP1
void capture_isr()
{
   int32 cntr;

   set_timer1(0);

   if(gEnableCntr)
   {
      cntr = make32(gOFCntr, CCP_1); // Use 32 bits
      cntr += 53; // Add constant

      gEnableCntr = 0;      
   }
   else
   {
      gEnableCntr = 1;
   }

   gOFCntr = 0;
}

// Main
void main()
{
   // Setup ports
   output_c(0x00);
   set_tris_c(0xFF);

   // Setup timer
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_ccp1(CCP_CAPTURE_FE);   // Capture on falling edge

   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_CCP1);
   enable_interrupts(GLOBAL);    // Enable global interrupts

   while(1);
}
