Pages: [1]   Go Down
Author Topic: Problema nel settare Timer1+Timer2  (Read 186 times)
0 Members and 1 Guest are viewing this topic.
Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 636
La mia prima bromografata!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

in:

TIMSK1 = B00000000;

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

Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 636
La mia prima bromografata!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged


Rome
Offline Offline
God Member
*****
Karma: 1
Posts: 636
La mia prima bromografata!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Pages: [1]   Go Up
Jump to: