Code:
#include <avr/io.h>#include <avr/interrupt.h>


volatile uint8_t y, p;
unsigned char b, c, a;


ISR(TIM0_COMPA_vect) // Servoansteuerung
{
	static uint16_t count=0;
	if (count>y) PORTB &= ~(1<<PB4); else PORTB |= (1<<PB4);   // solange count größer ist als y pb4=1 
	if (count < 2000) count++; else { count=0; if(p) p--; } //p wird mit 960.0000 /96 = 100khz /2000 =50hz angesteuert (20ms) p wird runtergezählt (p=50 = eine sekunde)
}


int main(void)
{
	DDRB = (1<<PB4)|(1<<PB1); // Servoausgang


	TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
	TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
	TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler!
	TIMSK0 = (1 << OCIE0A); // Interrupt ein
	OCR0A = 96; // 100kHz 1200000/12
	sei();


	y=150; 


	while(1)
	{
	p=13;
	c=0;
	 	while(p > 0) {
		a = PINB;
		a = a & 0x08;
		if (a !=0){
			c++;}
		else{
			c=c+0;}
       				}
	   	if (c > 13) {  // 50 impulse pro sekunde angestrebt
	   		y--;}
		else if (c==13) {
			y=y+0;}
		else {
			y++;}
		
	}
	return(0);
}
Hier einmal mein Versuch... egal wieviel Hertz ich an den Eingang anlege, der Servo läuft immer gaaanz langsam runter in seine Nullstellung... verändern der C-Variable ändert auch nichts...