Arduino Uno Input Capture!!!

Hello together,
I tested the proposal from ballistics and made some changes. Now it seems to work. Nice code
Andreas

//
//  http://arduino.cc/forum/index.php/topic,97451.0.html
//
#include <io.h>
#include <interrupt.h>
volatile uint16_t T1Ovs1, T1Ovs2;       //OVERFLOW COUNTERS 
volatile uint16_t Capt1, Capt2, Capt3;  //VARIABLES TO HOLD TIMESTAMPS 
volatile uint8_t Flag;                  //CAPTURE FLAG
float deltatime;
#define icpPin 8                        // PB0 ICP D8  Interrupt input
/*--------------------------------------------------------------------------------------------------
INTIALIZING TIMER
---------------------------------------------------------------------------------------------------*/
void InitTimer1(void)
{
    TCNT1=0;                         //SETTING INTIAL TIMER VALUE
    TCCR1B|=(1<<ICES1);              //SETTING FIRST CAPTURE ON RISING EDGE ,(TCCR1B = TCCR1B | (1<<ICES1)
    TIMSK1|=(1<<ICIE1)|(1<<TOIE1);   //ENABLING INPUT CAPTURE AND OVERFLOW INTERRUPTS 
}
/*--------------------------------------------------------------------------------------------------
STARTING TIMER
---------------------------------------------------------------------------------------------------*/
void StartTimer1(void)
{
//    TCCR1B|=(1<<CS11)|(1<<CS10);    //STARTING TIMER WITH PRESCALER 64
    TCCR1B|=(1<<CS12);              //STARTING TIMER WITH PRESCALER 256
//    TCCR1B|=(1<<CS12)|(1<<CS10);    //STARTING TIMER WITH PRESCALER 1024
    sei();                          //ENABLING GLOBAL INTERRUPTS 
}
/*--------------------------------------------------------------------------------------------------
CAPTURE ISR
---------------------------------------------------------------------------------------------------*/
ISR(TIMER1_CAPT_vect)
{
//  TCNT1 = 0;
  if (Flag==0)
      {
        Capt1=ICR1;           //SAVING CAPTURED TIMESTAMP
        TCCR1B&=~(1<<ICES1);  //CHANGE CAPTURE ON FALLING EDGE
        T1Ovs2=0;             //RESETING OVERFLOWS
        //digitalWrite(13, HIGH);   // set the LED on
        //delay(100);              // wait for a second
      }
  if (Flag==1)
      {
        Capt2=ICR1;            //SAVING CAPTURED TIMESTAMP
        TCCR1B|=(1<<ICES1);    //CHANGING CAPTURE ON RISING EDGE
        T1Ovs1=T1Ovs2;         //SAVING FIRST OVERFLOW COUNTER
        //digitalWrite(13, LOW);   // set the LED off
        //delay(100);              // wait for a second
      }
  if (Flag==2)
      {
        Capt3=ICR1;                       //SAVING CAPTURED TIMESTAMP
        TIMSK1&=~((1<<ICIE1)|~(1<<TOIE1)); //STOP INPUT CAPTURE AND OVERFLOW INTERRUPTS
        //digitalWrite(13, HIGH);   // set the LED on
        //delay(100);              // wait for a second
      }
    Flag++;                          //INCREMENTING FLAG
}
/*--------------------------------------------------------------------------------------------------
OVERFLOW ISR
---------------------------------------------------------------------------------------------------*/
ISR(TIMER1_OVF_vect)
{
      T1Ovs2++;//INCREMENTING OVERFLOW COUNTER
}
/*--------------------------------------------------------------------------------------------------
MAIN FUNCTION
---------------------------------------------------------------------------------------------------*/
int main(void)
{
       volatile uint8_t FINALTIME;          //VARIABLE TO HOLD THE FINAL TIME 
       pinMode(icpPin,INPUT);
       digitalWrite(icpPin,HIGH);           //pull up
                                            // pinMode(13, OUTPUT); 
       InitTimer1();                        //CALLING FUNCTION INITTIMER1 TO INITIALIZE TIMER 1
       StartTimer1();                       //CALLING FUNCTION STARTTIMER1 TO START TIMER 1
        while(1)
        {
                                            //calculate duty cycle if all timestamps captured
            if (Flag==3)
            {
                    
                    
                    Serial.begin(115200);
                    Serial.print("\r");
                    Serial.print("  <Capture1>:");
                    Serial.print(Capt1);    
                    Serial.print("  <Capture2>:");
                    Serial.print(Capt2);     
                    Serial.print("  <Capture3>:");
                    Serial.print(Capt3); 
                    Serial.print("  <OVL1>:");
                    Serial.print(T1Ovs1); 
                    Serial.print("  <OVL2>:");
                    Serial.print(T1Ovs2); 
                    Serial.print("\n");            
                    Serial.print("<FINAL TIME>:");
//                    deltatime = (Capt3-Capt1)*0.004; // Prescaler 64
                    deltatime = (Capt3-Capt1)*0.016; // Prescaler 256
                    Serial.print((float)deltatime);
                    Serial.print(" Millisecond");
                    Serial.print("\n"); 
                    Flag=0;                          //CLEARING FLAG
                    T1Ovs1=0;                        //CLEARING OVERFLOW COUNTERS 
                    T1Ovs2=0;
                    TIFR1=(1<<ICF1)|(1<<TOV1);      //CLEARING INTERRUPT FLAGS TO AVOID ANY PENDING INTERRUPTS 
                    TIMSK1|=(1<<ICIE1)|(1<<TOIE1);  //ENABLING INPUT CAPTURE AND OVERFLOW INTERRUPTS 
                    TCNT1 = 0;
            }
        }
}

Moderator edit:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.