Welcher Timer für was?

Hallo,

habe jetzt die Timerbeschreibung laut Datenblatt fast auswendig drin. :confused:
Ich verstehe das auch so. Eigentlich kann jeder OCnx Pin mit seinem OCRnx unabhängig voneinander geschalten werden. Der Zähler im TCNTn läuft weiter.

Im CTC Modus allerdings, wird der Zähler im TCNTn mit dem OCRnA automatisch gelöscht. Was hat sich Atmel dabei nur gedacht. Es sind tausende Register vorhanden, da hätte eines mehr für die Config das Kraut auch nicht fetter gemacht.

Jetzt lasse ich das im Normal Mode laufen. Habe die OCR1x Werte immer verdoppelt.
Dadurch sehe ich 3 plausible Toggles an den OC1x Pins.
Allerdings gibts dazwischen noch ungeklärte Schalteffekte. Siehe Screenshot.
Hab mal reingemalt was ich denke und was ich nicht weis.

Jetzt war mein Plan, den TCNT1 selbst auf 0 zu setzen, wenn der langsamste Takt, in dem Fall Timer1.C, sein Interrupt Request/Flag bekommen hat.

Ich habe aber das Problem, sobald ich den ISR Code für C aktiviere, taktet alles nur noch im 32ms Takt.
ISR(TIMER1_COMPC_vect) { // Timer 1.C Interrupt
}

/*
01.07.2015

Arduino Mega2560

*/

// globale Variablen
boolean _toggle_T1 = LOW;
const byte _LED = 8;

// Funktionen deklarieren
void set_Timer1_CMR();

void setup() {
  Serial.begin(38400);
  pinMode(_LED, OUTPUT);  // max. 36 bzw. 170kHz
  pinMode(11, OUTPUT);    // Pin von OC1A > Pin 11 Mega2560 (max. 8MHz)
  pinMode(12, OUTPUT);    // Pin vom OC1B > Pin 12 Mega2560 (max. 8MHz)
                          // beim Uno sind das Pin 9 und 10
  pinMode(13, OUTPUT);    // Pin vom OC1C > Pin 13 Mega2560 (max. 8MHz)
                                       
  set_Timer1_CMR();  // gewünschte Taktfrequenz in Hz - bei Bedarf mit einer Kommastelle
                     // 0.2 bis 36kHz bzw. 170kHz bzw. 8MHz)

}  // Ende Setup

 
void loop() {
  // do other things here
    
}


// *** Funktionen *** ----------------------------------------------

void set_Timer1_CMR()  // Normal Mode, kein CTC
{   
  cli();  //stop interrupts

  // set Timer-1 Register
  TCCR1A = 0;      // Reset TCCR1A Register 
  TCCR1B = 0;      // Reset TCCR1B Register
  TIMSK1 = 0;      // Reset TIMSK1 Register (disable Timer Compare Interrupts)
  TCNT1  = 0;      // initialize counter value to 0
  
  TCCR1A  |= (1 << COM1A0);  // set Toggle OCnA Pin on compare match > Pin 11 Mega2560
  TCCR1A  |= (1 << COM1B0);  // set Toggle OCnB Pin on compare match > Pin 12 Mega2560
  TCCR1A  |= (1 << COM1C0);  // set Toggle OCnC Pin on compare match > Pin 13 Mega2560
  
  OCR1A =   99;    // Compare Match Register A >> 10kHz (Precaler 8)
  OCR1B =  199;    // Compare Match Register B
  OCR1C =  399;    // Compare Match Register C
  //TCCR1B |= (1 << WGM12);  // turn on CTC mode
  
  TCCR1B |= (1 << CS11);    // set Prescaler 8
  TIMSK1 |= (1 << OCIE1A);  // enable Timer Compare Interrupt  A
  TIMSK1 |= (1 << OCIE1B);  // enable Timer Compare Interrupt  B
  TIMSK1 |= (1 << OCIE1C);  // enable Timer Compare Interrupt  C
      
  sei();  //allow interrupts
  
}  // end Funktion


ISR(TIMER1_COMPA_vect) {  // Timer 1.A Interrupt 
  
}


ISR(TIMER1_COMPB_vect) {  // Timer 1.B Interrupt 
  
}

/*
ISR(TIMER1_COMPC_vect) {  // Timer 1.C Interrupt 
  
}
*/