Hallo
Eine aussagekräftigere Überschrift für deinen Tread wäre sinnvoll 
Die Idee die Servos in der Hauptschleife zu steuern und nicht direkt in der ISR scheint auf den ersten Blick recht pfiffig. So könnte man vielleicht den Überlauf der ISR verhindern. Allerdings könnte es vorkommen, dass die ISR die while-Schleife "überholt" und sich dadurch count während der einzelnen Servoabfragen ändert. Dann würden die Servos möglicherweise zittern. Ähnliche Effekte könnte auch der Empfang von Zeichen verursachen. Ich bin mir aber nicht sicher, ob das bei 16MHz-Takt auch auftreten kann. Zum Testen könnte man vielleicht diesen Ansatz verwenden:
Code:
In der Hauptschleife:
while (1) {
test='1';
//------------------------------------------------------------------------------------------------------------------------------
if(count>servopos[0])Low_Servo0;//SERVOPORT&=~(1<<SERVOPIN);
//------------------------------------------------------------------------------------------------------------------------------
TCCR2 |= (1<<WGM21) | (1<<CS20); // warum wird hier am TCCR2 gefummelt?
USART_Transmit(test); // eine '0' gesendet wird gab es einen Überlauf!
// UDR = test; // Variante gegen Seiteneffekte von USART_Transmit()?
}
In der ISR:
ISR(TIMER2_COMP_vect)
{
test='0';
Wobei sowas eigentlich ja immer auftreten kann, weil die while-Schleife ja nicht syncron mit der ISR läuft. Vielleicht könnte man das so lösen:
Code:
while (1) {
while(count==count_old);
count_old=count;
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
if(count!=count_old) UDR = '*'; // Überlauf aufgetreten!
TCCR2 |= (1<<WGM21) | (1<<CS20); // warum wird hier am TCCR2 gefummelt?
}
Zeitsparen könnte man mit einzelnen Variablen für die Servopositionen (pos1, pos2,..) ohne Positionen-Array. Es ist ungünstig, wenn alle Servossignale gleichzeitig starten. Das verursacht hohe Einschaltströme.
Ich hoffe, das ist nicht allzuviel Unsinn. Ich habe das nicht selbst getestet!.
Gruß
mic
[Edit]
Ich habe das "TCCR2 = 0x00;" am Ende der ISR erst jetzt beachtet. Das stoppt doch das Timeing komplett und es wird erst wieder gestartet, wenn die Hauptschleife fertig ist. Das sollte eigentlich gar nicht funktionieren. Spannend, das muss ich wohl doch selbst mal testen...
Lesezeichen