Dem problem ist nicht beizukommen. Der ISR schlckt einfach 50 takte und wenn alle 18 verschiedenen signale inerhalb eines bereiches mit einem maximalen abstand von 50 takten liegen, dann pflanzt sich da eine unschärfe fort, die beim letzten servo gute 5 grad beträgt, also unannehmbar.
mal sehen, vlt kann ich dem 16Bit timer ja beibringen zwei signale gleichzeitig zu generieren, eines mit dem compare match interrupt und das zweite mit dem überlauf, dann muss man die nur so sortieren, dass immer ein kleiner wert und ein größerer wert gleichzeitig generiert wird.

mfg WarChild
Code:
SIGNAL (SIG_OVERFLOW2)								// 1ms Interrrupt
{
	TCNT2 = 256 - 250;								//Timer2 mit 6 neu vorladen
	timer2++;
	timer3++;
	if(timer2 == 20)								//alle Impulse starten
	{
		timer2 = 0;									//timer2 endet bei 20ms und startet ALLE 18 Signale
		signal= 0;
			servo1on;
			servo2on;
			servo3on;
			servo4on;
			servo5on;
			servo6on;
			servo7on;
			servo8on;
			servo9on;
			servo10on;
			servo11on;
			servo12on;
			servo13on;
			servo14on;
			servo15on;
			servo16on;
			servo17on;
			servo18on;
		cli();
		TCNT1 = 65536-dtime[signal];			//Timer1 neu vorladen
		sei();
		TIFR |= (1 << TOV1);						//alten Overflow löschen
		TIMSK |= (1 << TOIE1);						//Timer1 Overflow Interrupt freigegeben
	}
}



//**************************************************//
//Wird von Timer1 freigegeben und beendet die durch Timer2 gestarteten Pulse

SIGNAL (SIG_OVERFLOW1)								//
{	
	stoppulse(sortindex[signal]);					//letzten Impuls beenden
	delay=ISRdelay;
	missing=0;
	signal++;										//nächstes Signal
	while(dtime[signal]<delay && signal<18)		//für kleine Zeitintervalle direkt den nächsten beenden
	{
		stoppulse(sortindex[signal]);
		delay+=88;									//neue korrekturzeit bestimmen
		missing+=dtime[signal];						//ubersprungene Zeit merken
		signal++;
	}
	if(signal<18)									//solange noch Impulse zu beenden sind
	{
		cli();
		TCNT1 = 65536-dtime[signal]-missing+delay;	//Timer1 neu vorladen
		sei();
	}
	else											//sonst Timer1 beenden
	TIMSK &= ~(1 << TOIE1);
}
//**************************************************//