Hallo

Es wäre hilfreich wenn du näher beschreiben würdest was nicht richtig funktioniert. Nicht jeder hat gleich einen passenden Testaufbau bereit stehen.

Auf den ersten Blick:

volatile unsigned char timer1=0;
volatile unsigned char timer2=8;

volatile immer wenn eine Variable in einer ISR geändert wird. Ich glaube, das hat irgendwas mit der Art der Speicherung der Variablen zu tun (Register/Ram).

Genauer betrachtet könnte die Ausführungszeit der ISR zu lange sein (muss ich erst nachrechen) was zu einem Überlauf mit Abstutz führen würde. Erste Massnahme wäre den 10µs-Interrupt zu verlängern. Dann würde sich zwar die Auflöung deiner Servopositionen verkleinern, aber bei 4% Grundfehler dürfte das auch noch zu verschmerzen sein. Gewinnen würdest du dadurch aber generell mehr Leerlaufzeit weil die Kontroller nicht mehr so häufig mit der ISR beschäftigt wäre.

Die -160 beim Timersetup bei 16MHz ohne Vorteilung sind richtig weil der Timer ja nach oben zählt bis er wieder 0/256 ist, vorsichthalber würde ich aber die übrigen Bits im TCCR0-Register nicht einfach so übernehmen. Da du den normalen Mode verwendest kannst du die restlichen Bits mit TCCR0 = (1 << CS00); einfach mitlöschen.

btw: Ein nettes Krabbeltierchen hast du dir da zusammengezaubert. Gefällt mir gut :)

Gruß

mic