Hallo Leute,

irgendwie stehe ich auf der Leitung und kann den Code nicht ganz kapieren . Und zwar ist das die Servosteuerung von der Seite: http://www.schoeppl.info/de/elektron...rvotester.aspx

Und zwar muss ja für ein Servo nach 20ms ein Signal folgen das zwischen 1ms und 2ms liegt.

Wie wird hier im Quellcode sichergestellt das SIGNAL (SIG_OVERFLOW1) nach 20ms erst aufgerufen wird?

Irgendwie verstehe ich nicht wie das timming gesetzt ist.

Code:
#define F_CPU 8000000

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


void initadc(void);
void inittimer1(void);

unsigned char volatile liADC = 0;
unsigned char volatile liPause = 0;
unsigned int volatile liPreload = 0;

int main()
{

    initadc();
    inittimer1();
    sei();
    DDRB = 255;
    

    while (1==1)
    {
        // Timer Preload berechnen, bei 8 Mhz entspricht 8000 ca. 1ms, +max 1ms des ADC - Da Servosignal zw. 1 und 2ms spezifiziert ist
        liPreload = 65536 - 8000 - ((8000 / 256) * liADC); // Entspricht 1 ms
        
    }

}

SIGNAL (SIG_OVERFLOW1)
{
    // 1 Volldurchlauf dauert ca. 8ms, 2 x 8 = 16 ms Pause, dann port einschalten, dauer einstellen, dann port abschalten
    liPause++;
    if (liPause==2)
    {
        PORTB=255;
        TCNT1=liPreload;
    }
    if (liPause==3)
    {
        PORTB=0;
        liPause=0;
    }
    
}


SIGNAL (SIG_ADC)
{
    liADC = ADCH;
}

void initadc(void)
{

    //interne Referenzspannung und AD-Wandlerkanal 0, ADLAR setzen, 8 Bit des High Registers reichen
    ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR);



    // AD Wandler einschalten, Freerunning einschalten, Conversion starten, Interrupt einschalten, Prescaler auf 64
    ADCSRA = (1<<ADEN)|(1<<ADFR)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);

}

void inittimer1(void)
{
    TCCR1B = (1<<CS10); // Direkter Takt, kein Prescaling
    TIMSK |= (1<<TOIE1); // Overflowinterrupt aktivieren

}
[/url]