Go Down

Topic: Problema nel settare Timer1+Timer2 (Read 306 times) previous topic - next topic

dab77

Ciao, sto provando a settare due timer insieme ma ho uno strano problema.
con questa inizializzazione:
Code: [Select]
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:
Code: [Select]
ISR(TIMER2_OVF_vect) {
  cnt++;
  if (cnt >= 156) {
  digitalWrite(ledPin, prv=prv^1); 
  cnt = 0;
  }
}

mentre se cambio:
Code: [Select]

TIMSK1 = B00000110;

in:

TIMSK1 = B00000000;


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

dab77

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?

leo72

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


dab77

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.

leo72


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".

Quote

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.

Quote

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).

Go Up