Hallo Alle zusammen...

Ich denke ich habe hier eine Narrensichere die Lösung:

Code:
// Includes:

#include "RP6ControlLib.h" 		// The RP6 Control Library. 
								// Always needs to be included!
#define		MIN					4		//Servo's pulse length limits 1 = 0,1ms
#define		MAX					22
#define		CLOCKWISE			45		//Rotation angles in Degree (actually the pulse leght = MIN*0.1ms + CLOCKWISE*0.001ms [in my case its one degree]) 
#define		COUNTERCLOCKWISE	135	
#define		SPEED				10		//set impulse increasement/decreasement Speed in ms (0 = fastest)
#define		ADJUSTTIME			1000	//if the servo's movement is very fast then set at least the servo's time needed to rotate the required angle in ms else use it as a break between changing movedirection 
#define		CYCLES				15		//set the individual ammount of Cycles made in 1us (15-16 @16MHz / 7-8 @8MHz) (Use this to adjust on a test angle)

// Main function - The program starts here:

int main(void)
{
	initRP6Control(); // Always call this first! The Processor will not work
					  // correctly otherwise. 

	initLCD(); // Initialize the LC-Display (LCD)
			   // Always call this before using the LCD!

	// Write some text messages to the UART - just like on RP6Base:
	writeString_P("\n\n   _______________________\n");
	writeString_P("   \\| RP6  ROBOT SYSTEM |/\n");
	writeString_P("    \\_-_-_-_-_-_-_-_-_-_/\n\n");

	// Set the four Status LEDs:
	setLEDs(0b1111);
	mSleep(500);
	setLEDs(0b0000);
	
	// Play two sounds with the Piezo Beeper on the RP6Control:
	sound(180,80,25);
	sound(220,80,0);
	
	showScreenLCD("<<RP6  Control>>", "<<LC - DISPLAY>>");
	mSleep(1000); 
	showScreenLCD(" Servo  Control ", "  Test Program  ");
	mSleep(1000);

	
	setStopwatch1(0);
	startStopwatch1();
	setStopwatch2(0);
	startStopwatch2();
	
	DDRA |= (ADC3);
	
	uint8_t pulse = CLOCKWISE;
	uint8_t countup = true;
	
	uint8_t counter = 0;
	
	while(true) 
	{
		if (getStopwatch2() >= 18)							// hier geschiet die eigentliche Pulserzeugung alle 20ms
		{
			PORTA |= ADC3;									// alle anzusteuernden Ports werden auf high gesetzt
			sleep(MIN);
			for (counter=0;counter<(MAX-MIN)*10;counter++)		// jeder schleifendurchlauf bedeutet 1° Winkeländerung
			{
				delayCycles(CYCLES);
				if (pulse == counter)							// sobald der gewünschte Winkel erreicht wird, Wird der entsprechende Port auf low gesetzt
					PORTA &= ~ADC3;
			}
			setStopwatch2(0);
		}
		
		if(getStopwatch1() >= (ADJUSTTIME + SPEED))		// nach Ablauf der Zeit wird die nächste Position angefahren
		{
			setStopwatch1(ADJUSTTIME);
			if (pulse>=COUNTERCLOCKWISE)	// wechsel der drehrichtung
			{
				countup = false;
				setStopwatch1(0);
			}
			else if (pulse<=CLOCKWISE)
			{
				countup = true;
				setStopwatch1(0);
			}

			if (countup == true)			// änderung der Richtung
				pulse++;
			else
				pulse--;
		}
	}
	return 0;
}
Das meiste ist der standard Quellcode
In der Endlosschleife sind zwei If()-Bedingungen, die eine erzeugt das Servo-Signal und die andere erzeugt eine Pendelbewegung. Eigentlich war das nicht Ziel dieses Threads, aber sonst ist das so langweilig... ein still stehender Servo... =D>
Die Pulsvariable könnte man auch durch beliebige eigene Funktionen generieren lassen.
Da mein uC bei 16MHz maximal eine genauigkeit von 0,06us schafft (= 1 Takt), finde ich dass mein bis auf 1us genaues Signal keine schlechte alternative zu den aus meiner Sicht eher komplizierten timern ist.
Der Servo hat eine Auflösung von 180 Stellungen, (360 sind auch leicht möglich, aber da der Servo ehh im 20ms takt ruckelt, fand ich es nicht deutlich flüssiger mit 360er Auflösung).
Ich konnte das prgramm jetzt noch nicht mit mehreren Servos testen, da ich z.Zt nur einen Servo am M32 angeschlossen habe.(Ich muss erst noch die Servokabel auseinanderpulen, um sie anzuschließen)
Prinzipiell, sollte man jedoch beliebig viele Servos gleichzeitig parallel ansteuern können. Vielleicht muss man dann jedoch wegen des steigenden rechenaufwandes die CYCLES der "delayCycles()" reduzeren.

mfg WarChild