Hallo Leutz,

ich habe meinen Servo soweit, dass er sich entsprechend seiner Funktion verhält.
Warum weiss ich allerdings nicht.

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

int ontime = 0;
int offtime = 2000;

ISR(TIMER0_COMP_vect)
{
    static int onBuf;

    if( offtime - ontime > 0 )
    {
        onBuf = ontime;
        offtime--;
    }
    else
    {
        if( onBuf == 0 )
        {
            offtime = 8000;
            PORTA &= ~0x80;
            onBuf = ontime;
        }
        else
        {
            if( onBuf == ontime )
                PORTA |= 0x80;
            onBuf--;
        }
    }   
}

int main(void)
{

    DDRA = 0x80;
    PORTA = 0x00;

    // CLK/8 Prescaler                  CS01
    TCCR0 = (1<<CS01);

    OCR0 = 20;  // 16000000/8 = 1999490/20 = 99974,50Hz => 0,01ms

    TIMSK |= (1<<OCIE0);

    sei();

    int i = 0;

    ontime = 3; // links

    for(i=0;i<312;i++)
        _delay_ms( 16 );

    ontime = 11; // mitte

    for(i=0;i<312;i++)
        _delay_ms( 16 );

    ontime = 19; // rechts

    for(i=0;i<312;i++)
        _delay_ms( 16 );

    ontime = 0;

    while(1);
}
Kann mir einer meinen Code erklären (klingt lächerlich, ich weiss)?

Warum müsste lt. Theorie die Interrupt-Routine alle 0.01ms aufgerufen werden oder täusche ich mich da?
@Hubert G.: Du hattest recht, auch wenn diese minimalistische Bemerkung, das hätte was mit 1MHz zu tun, in der avr-Libc-Doku irgendwie missverständlich für eine _delay_ms-Funktion ist.
Warum veranlasst ein ontime=4 die linke Position, wenn das theoretisch niemals 1ms sein kann?
Warum diese komischen anderen Werte für Mitte/Links?
Ich benutze kein PWM, generiere ich da unwissentlich ein Software-PWM?
Bewegt sich ein Servo immer in so ruckartigen Bewegungen, oder gibt es eine Möglichkeit von einer zur nächsten Position kontinuierlich zu kommen?

thx4Help

Banzai