Problema nel settare Timer1+Timer2

Ciao, sto provando a settare due timer insieme ma ho uno strano problema.
con questa inizializzazione:

void Init_Timers() {
  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;

  OCR1A = 2000;
  OCR1B = 200;
  
  TCCR1B = B00001010; // CTC mode e prescaler 8.
  TIMSK1 = B00000110; // abilito comparazione su A e B 

  TCCR2B = B00000010; // prescaler 8.
  TIMSK2 = B00000001; // abilito overflow.

  interrupts(); 
}

questa ISR non va:

ISR(TIMER2_OVF_vect) {
  cnt++;
  if (cnt >= 156) {
  digitalWrite(ledPin, prv=prv^1);  
  cnt = 0;
  }
}

mentre se cambio:

TIMSK1 = B00000110;

in:

TIMSK1 = B00000000;

la ISR del Timer 2 va...
dov'è l'inghippo?

Allora, forse ho trovato una soluzione, anche se in realtà non dovrebbe essere così, secondo me, o perlomeno non capisco perchè.

al posto di:
TCCR1B = B00001010; // CTC mode e prescaler 8.
tolgo il CTC e diventa:

TCCR1B = B00000010; // prescaler 8.

però in realtà non dovrebbe interferire con l'interrupt del timer 2, no?

Ma tu hai anche le relative ISR per le comparazioni di A e B sul timer 1? Oppure no?

Ciao, si ci sono, non le ho postate in quanto il problema non le interessava.
Mi sono accorto solo oggi che non ho inizializzato 'cnt' come volatile... forse già questo ha creato un pò di disordine...
per un paio di giorni, purtroppo non posso riprovare, ma se ho altri problemi "strani" mi rifaccio vivo..

Comunque, giusto per essere sicuri, si possono mischiare tranquillamente tipo il timer 0 come OverFlow, il timer 1 come Compare Match ecc...?

e, perdonatemi, un'altra cosa di cui non sono completamente sicuro:
impostando il Timer, per esempio l'1, in Compare Match con A tipo a 1000 e B a 3000, passato il match a 1000, il contatore si dovrebbe riazzerare? se no, si riazzera dopo il match B o cosa?

Grazie.

dab77:
Mi sono accorto solo oggi che non ho inizializzato 'cnt' come volatile... forse già questo ha creato un pò di disordine...

Al 90% il problema è quello, tutte le variabili che sono usate sia dentro che fuori una ISR devono essere dichiarate "volatile".

Comunque, giusto per essere sicuri, si possono mischiare tranquillamente tipo il timer 0 come OverFlow, il timer 1 come Compare Match ecc...?

Certo, ogni ISR ha un indirizzo differente.

e, perdonatemi, un'altra cosa di cui non sono completamente sicuro:
impostando il Timer, per esempio l'1, in Compare Match con A tipo a 1000 e B a 3000, passato il match a 1000, il contatore si dovrebbe riazzerare? se no, si riazzera dopo il match B o cosa?

Grazie.

Dipende da come lo hai impostato, la tabella Waveform Generation Mode (i bit WGM).