Hallo Leute,
ich habe einen standart-servo von conrad an einen mega8 (8mhz) angeschlossen. Zur ansteuerung benutze ich den code aus RN-Wissen.
Ich will erreichen, dass jedes mal, wenn ich den taster drücke die position geändert wird. wenn der servo an der einen seite angekommen ist wird die position jedes mal in die andere richtung geändert. allerdings funktioniert das programm nicht:

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

#define SERVOPIN 7
#define SERVOPORT PORTD
#define DDRSERVO DDRD
#define BUTTON !(PIND & (1 << PD2 ))


volatile unsigned char servopos;

void servo_init()
{
	TIMSK|=(1<<OCIE2);
	TCCR2 |= (1<<WGM21) | (1<<CS20);	//Prescale=1, CTC mode
	OCR2 = 80;			//alle 10µS ein IRQ bei 8mhz
	DDRSERVO|=(1<<SERVOPIN);
    sei();
}

ISR(TIMER2_COMP_vect)
{
    static int count = 1;
	if(count>servopos)SERVOPORT&=~(1<<SERVOPIN);
	else SERVOPORT|=(1<<SERVOPIN);
	if(count<2000+servopos){count++;}
	else{count=0;}
}

int main(void)
{
    DDRD &= ~(1<<PD2); //Taster
    DDRC |= (1<<PC5);  //LED
    PORTC &= ~(1<<PC5);//einschalten
    servo_init();
    int r = 5;
    servopos = 150;    //servo in mittelposition
    while(1)
    {
        if(BUTTON)
        {
            servopos = servopos + r;
            if( servopos > 200 )
            {
                servopos = 200;
                r = -1;
            }
            if( servopos < 100 )
            {
                servopos = 100;
                r = 1;
            }
            _delay_ms(50) //taster entprellen
        }
    }
    return 0;
}
ich weiß nicht, woran es liegt
komischer weise flackert die LED zwischen drinn, darum vermute ich, dass irgendwie ein reset durchgeführt wird...

danke schon mal für eure hilfe