Hallo,

Ich hab mir ein Programmm geschrieben welches mir in 20ms abstand ein 1.5ms langes Highsignal ausgiebt. Damit möchte ich meine Servos in die mittelstellung bringen. Das funktioniert auch... irgendwie.

Leider zucken meine Servos unregelmässig und mein Signal verändert sich manchmal von schönen graden Flanken zu schwankenden herabfallenden

Ich glaube am Aufbau liegt es nicht also wollt ich mal sehen ob vieleicht ihr verbesserungsvorschläge zum Code, oder gar eine erklärung habt.

Was vermutlich nicht ideal ist, ist meine Frequenz(des Interupts)
da ich eine Kommazahl in die Konstante Timer schreibe.

Hier ist mein Code:
Code:
#include <avr/io.h> 
#include <avr/interrupt.h> 

#define F_CPU 8000000 
#define timer (256-F_CPU/64/2000) 
int ms; 

ISR(TIMER0_OVF_vect)                                 //Timer Interrupt Vector 
{
	TCNT0 = timer; 									 //Interupt auf 2000Hz einstellen (Alle 0.5ms ein Interupt)
	ms++; 
}

int main(void) 
{
	
	//Ports Init 
	DDRC |= (1<<PORTC3); 

	//Timer Init 
	TIMSK |= (1<<TOIE0); 							//Timerinterrupt freigeben 
	TCCR0 |= (1<<CS00) | (1<<CS01) | (!(1<<CS02));  //Timer Prescaler = 64 

	sei();                                          //Interrupts global aktivieren 

	//main Schleife 
	for (;;) 
	{
		if(ms >=40) 								//Wenn ms grösser gleich 40 (40*0.5=20ms) -->40 ausgelöste Interupts
		{
		PORTC |= (1<<PORTC3);						//Port auf HIGH.
		}
		
		{
			if(ms >= 43)						 	//Wenn ms grösser gleich 43 (43-40=3*0.5=1.5ms)
			{
			PORTC &= ~(1<<PORTC3); ms = 0;			//Port auf LOW und ms löschen
			}
			
		}
		
	}
	

}
Achja, ich habe den ATmega8 über die Fusebits intern auf 8Mhz gestellt.
und zwar auf 8 Mhz, 6CK, 64ms.
6CK = 6 Cyklen??, 64ms?? kann mir jemand erklären was das bedeutet?