Hallo Leute,

ganz großes Dankeschön für Eure Mühen (insbesondere an Dirk, der extra seinen Code nochmals mit Oszi getestet hat).

Habe inzwischen den Servo an mein myAVR MK1 Board angeschlossen.
Das Ergebnis: auch dort gibt's das große Zittern.

Ich glaub' ich kaufe mir einen neuen Servo bevor ich noch mehr Zeit investiere. Irgendwie doof.

Trotzdem ein dickes Dankeschön für Eure Mühen.

Igeligel


PS: hier der PWM-Code des myAVR MK1 Boards für die Nachwelt. (beachte: ATmega32 führt OC1A an PortD5 heraus während ATmega8 OC1A an PortB1 herausführt)

Code:
/*

Description:	ATmega8 uses Timer1 in PWM-Mode to control servo
				Code runs on myAVR MK1 Development Board (SP2) NOT on RP6
				
Usage:			By default you get a 1ms/20ms PWM-signal on Port PB1
				Use pushbutton "Taster1" to enlarge the 1ms-signalshoulder
				Use pushbutton "Taster2" to shrink the 1ms-signalshoulder

Wires:			PD6 -> Taster2
				PD7 -> Taster1
				
				Lo  -> Servo (black)
				Hi	-> Servo (red)
				PB1 -> Servo (orange)
				PC0 -> LED (green)
				PC1 -> LED (yellow)

Date:			01.02.2009
Author:			Igel
Reference:		http://www.mikrocontroller.net/topic/103629

*/


// Takt
#define F_CPU 3686400UL


#include <avr/io.h>
#include <util/delay.h>


void initServo(void) {
	// init timer 1:
	//ICR1   = 7200;            // PWM cycle time in usec
	ICR1   = 9216;              // PWM cycle time in usec
	TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); // OC1A/B clr on match, set on TOP
	//TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS12) | (1<<CS10);    // TOP = ICR1, clk = sysclk/8 (->1us)
	TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS11);    // TOP = ICR1, clk = sysclk/8 (->1us)
	TCNT1  = 0;                                      // reset Timer

	OCR1A  = 461;   	 // set Servo 1 to 1ms-position

}


int main(void) {

    DDRD  &= ~((1 << PD6) | (1 << PD7)); 	/* PIN PD6 + PD7 auf Eingang (Taster)            */
    PORTD |=  (1 << PD6) | (1 << PD7);		/* Pullup-Widerstand aktivieren            */

	DDRC |= (1 << PC0) | (1 << PC1);  		/* PIN PC0 + PC1 als Ausgang (LED) */
	
	DDRB = (1 << PB1) | (1 << PB2);  		// OC1A and OC1B for PWM
	initServo();
	
	while(1) {
		if(PIND & ( 1 << PD6 )) {
			PORTC &= ~(1 << PC0); }
		else {
			PORTC |= (1 << PC0);
			OCR1A -= 10;
			_delay_ms(200);
		}
		if(PIND & ( 1 << PD7 )) {
			PORTC &= ~(1 << PC1); }
		else {
			PORTC |= (1 << PC1);
			OCR1A += 10;
			_delay_ms(200);
		}
	}
	return(0);
}