Zitat Zitat von markusj Beitrag anzeigen
... Timer schaltet man ab in dem man ihren Takt deaktiviert, nur den Interrupt stummzuschalten reicht nicht ...
Hmmmm, reicht wirklich nicht? Ich habe eine ähnliche Routine auf einem mega328/20MHz laufen für zehn Servos auf Timer1. ISRCompA macht mir die 2 ms-Schritte, startet den zuständigen Portpin und lädt OCR1B und setzt OCIE1B. ISRCompA gibt bei zehn Durchläufen 20 ms. Die ISRCompB schaltet den Interrupt ab und löscht den zuständigen Portpin - und es läuft und läuft und ....

Code:
// ============================================================================== =
// ===  Nicht unterbrechbare ISR für TIMER1_COMPB_vect     ====================== =
  ISR (TIMER1_COMPB_vect)       // VECTOR 19                                   S 65
  {                             //
    TIMSK1 &= ~(1<<OCIE1B);     // Tmr/Cntr1 CompB Match interrupt disabled
// - - - - - - - - - - - - - - -
    if (Svpt ==  1) PORTB &= ~(1<<1); //
    if (Svpt ==  2) PORTB &= ~(1<<2); //
    if (Svpt ==  3) PORTD &= ~(1<<3); //
    if (Svpt ==  4) PORTD &= ~(1<<4); //
    if (Svpt ==  5) PORTD &= ~(1<<5); //
    if (Svpt ==  6) PORTD &= ~(1<<6); //
    if (Svpt ==  7) PORTD &= ~(1<<7); //
    if (Svpt ==  8) PORTB &= ~(1<<0); //
    if (Svpt ==  9) PORTC &= ~(1<<0); //
    if (Svpt == 10) PORTC &= ~(1<<1); //
// - - - - - - - - - - - - - - -
  }                             //
// ============================================================================== =
Vorteile: genaue Periodenlänge und für den Puls habe ich - natürlich je nach Servo - reichlich Schritte. Aktuell kann ich OCR1B von 120 bis 780 fahren - dann gehts wirklich Anschlag bis Anschlag, rund 180°. Brauch ich aber nicht, für mich (neee, für die Servos) sind 300 Ticks für ziemlich genaue 90 Grad mehr als genug.