Difference between ICR1 and OCR1A - in Fast PWM?

/******* Sketch to test Input Capture interrupt handling *********************************
functionality: measure length of pulses on the ICP pin with precision of 0.5 microseconds
Show the min and max pulse widths in microseconds on the serial port

**************************************************************************************************************/
#include <stdio.h>      // for verbose debugging using sprintf 
//#include "TimerOne.h"
//#include "Timer.h"
#include "PWM.h"

#define icpPin 8        // ICP input pin on arduino
//#define outPin 9        // output pin that will shadow the input, can be monitored with a scope 
#define outPin 9
                       
volatile uint8_t rising;                      

                     
                       
                       
                       
                       
// some variables to help see that something is happening in the interrupt handlers
volatile unsigned int Value;     // this stores the current ICR1 value
volatile unsigned int MinValue;     
volatile unsigned int MaxValue;
volatile unsigned int Overflows;
volatile unsigned int PulseCount;


unsigned long duration;

//int32_t frequency = 125000

char buffer[800];
short i;

//Timer t;
/* Overflow interrupt vector */
ISR(TIMER2_OVF_vect){                 // here if no input pulse detected 
  Overflows++;                       // incriment overflow count  
}

/* ICR interrupt vector */
ISR(TIMER2_CAPT_vect){
  TCNT1 = 0;                            // reset the counter
  catchRisingEdge();
  /*if( bit_is_set(TCCR1B ,ICES1)){       // was rising edge detected ?   
       digitalWrite(outPin,HIGH );      // yes, set our output pin high to mirror the input
  }
  else {                                // falling edge was detected 
       Value = ICR1;                    // save the input capture value 
       digitalWrite(outPin,LOW );       // set our output pin low to mirror the input  
       PulseCount++;
  }/*if(Value < MinValue)             // update min or max values as appropriate   
           MinValue = Value;
       if (Value > MaxValue)
           MaxValue = Value;    
  }  */   
  TCCR1B ^= (1<<ICES1);                 // toggle bit value to trigger on the other edge
   
  /*if(bit_is_set(TCCR1B, ICES1)){
    digitalWrite(OUT, HIGH);
    }
   else{
    Value = ICR1;
    digitalWrite(OUT, LOW);
    PulseCount++;
    
   }*/
 /* static byte lastEdge;
  byte thisEdge = ICR1;
  byte difference = lastEdge - thisEdge;
  if (difference
  
  lastEdge = thisEdge;  */ 
}

/*ISR(TIMER0_COMPA_vect){
  
  if(i<800){
    
    buffer[i] = digitalRead(icpPin);
    }i++;
  
  }*/
//int val = 0;
//int ledPin = 11;
//int analogPin = 3;

//int pwmPin = 9;

//const int16_t TOGGLE_TIME = 8;

void setup() {
 Serial.begin(9600);
 //pinMode(outPin, OUTPUT);               // declare the ledPin as an OUTPUT
 //pinMode(icpPin, INPUT); // ICP pin (digital pin 8 on arduino) as input
 
 //MinValue =    30000;                   // Initialise with extreme values 
 //MaxValue =    0;
 //SetPinFrequency(9, 125000);
 pinMode(9, OUTPUT);//125kHz carrier to be generated here
 //Timer1.initialize(8);
 //Timer1.pwm(9, 512);
 
 /*digitalWrite(9, HIGH);
 delayMicroseconds(8);
 digitalWrite(9, LOW);
 delayMicroseconds(8);*/

 //USE FAST MODE TO ENABLE DOUBLE BUFFERING - GIVES A GLITCH FREE OUTPUT


 //TCCR1A |= (0<<COM1A1)|(1<<COM1A0) ;        //Toggle on reaching OCRA            // this register set to 0!
 //TCCR1A |= (1<<WGM10);
 
 TCCR1A |= (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10);
 TCCR1B |= (1<<ICNC1)|(1<<WGM13)|(1<<WGM12)|(1<<CS11);  //prescaler 8  //SET TO Fast PWM MODE        // NORMAL MODE!!, prescaler 8, rising edge ICP1 - this works
            // enable input capture
 OCR1A = 127;
 OCR1B = 63;    

 TIMSK1 |= (1<<ICIE1)|(1<<TOIE1);                       // enable input capture interrupt for timer// enable overflow interrupt to detect missing input pulses 

/*
 TCCR2A |= (1<<WGM21);
 TCCR2B |= (1<<CS22)|(1<<CS21);
 OCR2A = 1;

 TCCR0A |= (1<<WGM01);
 TCCR0B |= (1<<CS02) | (1<<CS00);
 OCR0A = 1;*/
 Serial.print("Finished setup\r\n");
 //duration = pulseIn(9,HIGH);
 //Serial.println(duration);

 //t.start(8);
 //t.pwm(9,512);
 //t.pulse(9, 0.008, LOW);
 //t.oscillate(9,0.008,LOW);
 //t.every(4, takeReading);
 
 //t.oscillate(9,8, LOW);
 //delayMicroseconds(8);
 //t.oscillate(9,8, HIGH);
 //delayMicroseconds(8);
 //t.every(4000000, takeReading);
}


/*
// Turn the frequency on
void on()
{
  TCNT1H = 0;
  TCNT1L = 0;  
  TCCR1A |= (1 << COM1A0);
}

// Turn the frequency off and turn of the IR LED
void off()
{
  TCCR1A &= ~(1 << COM1A0);
}
*/

long lastTime;
int dataState = 0;



void catchRisingEdge()   {TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); rising = 1;}
void catchFallingEdge()  {TCCR1B &= ~(1<<ICES1); TIFR1 |= (1<<ICF1); rising = 0;}

// this loop prints the number of pulses in the last second, showing min and max pulse widths 
void loop() {
 //char buffer[800];
 // show the captured data, divide pulse widths by 2 to display time in microseconds
 //sprintf(buffer,"Got %d pulses: min=%d, max=%d (%d timer overflows)\r\n", PulseCount, MinValue / 2, MaxValue / 2, Overflows);         

 
 //SetPinFrequency(9, 125000);
 //on();
 // digitalWrite(OUT, HIGH);
 // delay(8);
 // digitalWrite(OUT, LOW);
 // delay(8);
 //off();
 
 //int val = digitalRead(9);
 /*uint8_t state = 0;
 while(1) {
    if(state == 0) {
      digitalWrite(9, LOW);
      state = 1;
      delay(8);
      catchRisingEdge();
      //Serial.println(state);
      //Serial.println(rising);
    } 
    else {
      digitalWrite(9, HIGH);
      state = 0;
      delay(8);
      catchFallingEdge();
      //Serial.println(state);
      //Serial.println(rising);
    }} */
  //Serial.println(rising);

  //duration = pulseInLong(9, HIGH);
  //Serial.println(duration);
  //value = pulseIn(9, HIGH);

/*
  int analogValue = analogRead(9);
  int newdataState = (analogValue > 600);//need to check, hoping boolean will evaluate to 1 when true

  if(dataState == 0 && newdataState == 1){//if the led was off, but will be turned on, start the stop watch
    lastTime = millis();//store the current time
    dataState = newdataState;
  }

  if(dataState == 1 && newdataState == 0){//if the led was on, but will be turned off, get the difference between the last time we started counting time
    long difference = millis() - lastTime; //get the current time, but subtract the last stored time
    dataState = newdataState;
    Serial.println(difference);
  }

  digitalWrite(9,dataState);*/
  
/*
 while(1){
  if
  
 }*/
/*/////////////////////////////////////////////*/

 /*static uint16_t last_toggle;

    if ((uint16_t) micros() - last_toggle >= TOGGLE_TIME) {
        PINB = _BV(PB1);             // invert pin state
        last_toggle += TOGGLE_TIME;
    }

   Serial.println(last_toggle); */
/*///////////////////////////////////////////////////////*/ 
 //Serial.println(val);
 //val = analogRead(pwmPin);
 //analogWrite(ledPin, val/4);
 //Serial.println(val);
 //Serial.print(buffer);    // send the info to the serial port
 /* reset variables ready for the next reading */   
 /*PulseCount = Overflows = 0; // reset counts
 MinValue =    30000;        // set values to extremes
 MaxValue =    0;      
  
 delay(800);  */           // wait 1 second for next update  [/font]            
}


/*
void takeReading(){
  int val = digitalRead(9);
  val++;
  Serial.println(val);
}
*/

west, I changed the settings as directed but all I get on the Serial monitor is trash values. Not sure if I y algorithm is right. Could you take a look? Most of it is commented as I have been working on the same code.

Best,
A