studiere gründlich das datenblatt, das ist eigentlich sehr aufschlussreich aber hart im lesen

versuch mal mittels datenblatt folgendes zu verarbeiten
Code:
SIGNAL (SIG_OVERFLOW2)
{
	if ((TCCR2 & (BV(COM21) | BV(COM20))) != 0) TCCR2 &= ~(BV(COM21) | BV(COM20));
	else if (Count%32 == 0) TCCR2 |= BV(COM21) | BV(COM20);
	if ((PIND & BV(PD6)) && !(PIND & BV(PD7))) OCR2 = -55-16;
	else if ((PIND & BV(PD7)) && !(PIND & BV(PD6))) OCR2 = -55+16;
	else {
		diff = ADCL + (ADCH << 8);
		diff = (diff/32)-16;
		OCR2 = -47+(diff);  
	}
}

SIGNAL (SIG_OUTPUT_COMPARE2)
{
//	TCCR2 &= ~(BV(COM21) | BV(COM20));
}

int main(void)
{
	Count = 0;
	diff = 0;
	dir = 4;
	cli();
	ADCL = 0;
	ADCH = 0;
	DDRB = BV(PB4) | BV(PB5) | BV(PB3);
	PORTB = BV(PB4);
	TCNT2 = 0;
	OCR2 = -55;
	TCCR2 = BV(WGM21) | 
			BV(WGM20) |
			BV(COM21) |
			BV(COM20) | 
			BV(CS22) | 
			BV(CS21);
	TIMSK = BV(TOIE2);// | BV(OCIE2);
	sei();
	PORTB = BV(PB5);
	ADCSRA = BV(ADFR) | BV(ADPS2) | BV(ADPS1);
	ADMUX = BV(REFS0);
	ADCSRA |= BV(ADEN);
	ADCSRA |= BV(ADSC);
	while (1){
	}
}
Atmega8 mit 8Mhz intern getaktet, das oszi hat ne saubere 1ms +-0.5ms flanke angezeigt und der servo reagiert auch wie erwartet

Link zu Youtube-Video