Guten Abend,
Für die Ansteuerung meiner Servos benutze ich den Timer0 eines ATMega644.
Das funktioniert auch super.. aber nur bis 3Servos und dann "zerfällt" das Signal.
Folgend Ausschnitte aus meinem Code:

Code:
void servoposH(void)
{

	//HÜFTEN
	// (1)
	if(countH1>=posH1)
		PORTA &= ~(1<<PORTH1);
	else
		PORTA |= (1<<PORTH1);
	

	// (2)
	if(countH2>=posH2)
		PORTA &= ~(1<<PORTH2);
	else
		PORTA |= (1<<PORTH2);
	
	
	// (3)
	//........... -6

};

//INTERUPT
ISR(TIMER0_OVF_vect) 
{

	TCNT0 = TIMER;
	
	if(countH1<=(1740-posH1))
	countH1++;
	else
	countH1 = 0;	
	
	if(countH2<=(1740-posH2))
	countH2++;
	else
	countH2 = 0;
	
	if....... 
                //.....-6
};

int main(void) 
{
	//INITIALISIEREN DER PORTS
	initialisieren();

	//TIMER LADEN
	timer_init();		

	//GLOBALE INTERUPTS AKTIVIERT
	sei();

	posH1 = 135;
	posH2 = 119;
	posH3 = 130;
	posH4 = 127;
	posH5 = 135;
	posH6 = 132;	

	//HAUPTSCHLEIFE
	for(;;)
	{
		servoposH();
					

	}

}
Das mache ich eigentlich 18mal.
Also in der funktion servoposH() 6x, servoposSCH() 6x, servoposK 6x.
Die Lowabfragen mache ich 18x im ISR.
Ich hoffe ihr versteht was ich meine, die High abfragen sind auf 3 Funktionen verteilt und die Lowabfragen stecken im ISR.

Der obige Quelltext ist natürlich nicht vollständig.

Die Variablen posH^n sind mit Testwerten initialisiert. Wie gesagt es funktioniert auch alles.. aber sobald ich mehr als 3 Servos (Sprich abfragen) im Interupt verarbeite geschehen mit meinem Signal die merkwürdigtsen Dinge. Ich habe in meinem Programm die restlichen Abfragen einfach ausgeklammert.
Mir scheint als sei der Interupt damit überfordert. Kann das sein?

Der Interupt läuft auf 100kHz, also alle 0.01s einmal. Naja nicht genau, aber in etwa.

Ursprünglich wollte ich ja alle abfragen im ISR machen aber das klappt niemals.

Danke fürs lesen und allfällige Inputs
Ich kann auch gerne mehr Code posten aber ich denke, der Rest ist nicht nötig resp. in Ordnung... also alles initialisiert.