TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
TCCR2B |= (1<<CS20)|(1<<CS21); //(1<<CS21)|(1<<CS20)|(1<<CS22); //установка предделителя 32
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
TCNT2 = TCNT2_Const;
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
sei();

Это можно просто переписать - инициализирует таймер.

volatile uint16_t WaveLength;
volatile uint16_t CalcedWaveLength;
объявляет две переменных, которые не должны быть оптимизированы процессором.
Беззнаковые, 16-битные.

for (;
{
for (;CalcedWaveLength==0;
uint16_t cwl=CalcedWaveLength;
CalcedWaveLength=0;
UART_SendByte(cwl&255);
UART_SendByte(cwl>>8);


}

Это основной цикл, который можно запихнуть в void Loop(void);

Ждет пока в CalcedWaveLength будет что-то отличное от нуля, копирует его в переменную, отправляет в uart (в бинарном виде), и обнуляет.

SIGNAL(TIMER2_OVF_vect)
{
TCNT2=TCNT2_Const; // задает параметр таймера. Переписать как есть.
uint16_t WL=WaveLength; // копирует счетчик в локальную переменную
if (Pd2::IsSet()); // если нога Digital2 в верхнем положении
WL++; // то увеличиваем счетчик
else // иначе
{
if (WL!=0) // если там что-то было в счетчике (не 0)
{
CalcedWaveLength=WL; // то то, что было складываем в CalcedWaveLength
WL=0; // и очищаем
}
}
WaveLength=WL; Задаем новое значение в основной счетчик (или 0)
}



Итого - логика такая - таймер считает время, пока нога в верхнем положении. Для этого использует переменную - счетчик WaveLength.
Когда таймер обнаруживает, что нога в нижнем положении, она копирует WaveLength в CalcedWaveLength, а WaveLength очищает.