Hallo

Mein asuro (mit 8MHz-Mega kann es mit deinem minimal veränderten Code:

Code:
#include <avr/io.h>
//#include <avr/delay.h>
#include <avr/interrupt.h>

#define SERVOPIN 4 // Pin6
#define SERVOPORT PORTD
#define DDRSERVO DDRD

uint8_t servopos=150;
volatile uint16_t p=0;

void pause(uint16_t p_dauer)
{
	p=p_dauer;
	while(p);
}

int main(void)
{
   TIMSK|=(1<<OCIE2);
   TCCR2 = (1<<WGM21) | (1<<CS20);
   OCR2 = 80; // Für 8MHz-Takt, 37 für 3686400Hz
	DDRSERVO|=(1<<SERVOPIN);
	sei();

   while(1)
   {
      pause(100);
      servopos=100;
      pause(50);
      servopos=200;
      pause(50);
      servopos=150;
	}
   return(0);
}

ISR(TIMER2_COMP_vect)
{
	static uint16_t count=1;
	if(count>servopos) SERVOPORT&=~(1<<SERVOPIN); else SERVOPORT|=(1<<SERVOPIN);
	if(count<2000)count++; else { count=1; if(p) p--; }
}
Das hat bei mir erst funktioniert nachdem ich das TCCR2-Register direkt gesetzt hatte (ohne |) (Es kann aber auch sein, das bei meinen ersten Tests die asuro-Lib störte)

Die Positionen stimmen nicht wirklich, aber immerhin bewegt sich was:

Bild hier  
http://www.youtube.com/watch?v=VNbpkGiD-YI

Hinweis für asuro-Besitzer: Der verwendete Pin6 (PORTD4) ist beim orginalen asuro belegt, also nicht ohne Anpassung verwenden!

Gruß

mic