Crea sito

Sfruttiamo al massimo i Timer di Arduino – parte 2

Configurazione del timer1 di Arduino in modalità normale

Modalità normale

Nella modalità normale il contatore conta sempre nella direzione crescente e quando raggiunge il suo massimo ritorna a zero. Nella modalità normale il flag Timer/Counter Overflow Flag viene posto ad uno nello stesso periodo di clock in cui il contatore vale zero. Si noti che il flag non viene automaticamente resettato dopo che è avvenuto l’overflow a meno che non si utilizzi la ISR.

Descrizione del codice

Il codice seguente imposta i valori di dei registri di controllo in modo da ottenere una modalità normale e generare una interruzioni ogni volta che il contatore va in overflow. Non si utilizzano i pin all’uscita del comparatore, e la sorgente di clock interna viene scalata di 1024.

In questa particolare configurazione del timer 1 il registro TCCR1A deve essere posto a zero(vedi manuale pag 134) mentre il gli ultimi tre bit del registro TCCR1B devono essere settati ad 101 secondo la seguente tabella

Inoltre si deve settare il bit zero (TOIE1) del registro TIMSK1 per attivare l’interruzione quando c’è l’overflow

Il codice incrementa un contatore interno ogni volta che viene generata l’interruzione e periodicamente viene stampato il valore sulla seriale.

Siccome il clock viene diviso per 1024 e il contatore è a 16 bit e va in overflow ogni volta che raggiunge il suo massimo cioè 65535 allora il contatore globale viene incrementato ogni

\displaystyle T = \frac{65535+1}{f_{clok}/1024} \approx 4 sec

Codice

unsigned long int global_counter;

void setup() {
  Serial.begin(9600);  
  global_counter = 0;
  // initialize Timer1
  cli();             // disable global interrupts
  TCCR1A = 0;        // set entire TCCR1A register to 0
  TCCR1B = 0;
  // Set CS10 and CS12 bits so timer runs at clock speed /1024:
  TCCR1B |= (1 << CS12)|(1 << CS10);
 
  // enable Timer1 overflow interrupt:
  TIMSK1 = (1 << TOIE1);
  // enable global interrupts:
  sei();

}

void loop() {
  delay(1000); // delay uses timer0 
  Serial.print("counter: ");
  Serial.println(global_counter);
}

ISR(TIMER1_OVF_vect)
{
  global_counter++;
}

Conclusioni

Per questa puntata abbiamo concluso. Potete lasciare un commento o contattarmi  via mail all’indirizzo di posta [email protected], sarò lieto di rispondervi.