Libreia TimerOne.h e tempi interrupt

Ciao a tutti, sto utilizzando la libreria Arduino Playground - Timer1 per gestire un interrupt ogni 200 millisecondi sul mio Arduino Duemilanove.
Il codice è quasi banale:

void setup()
{
  Timer1.initialize(200000);         // in microsecondi
  Timer1.attachInterrupt(change_frame);  // attaches callback() as a timer overflow interrupt
}

Il problema è che il ritardo non è di 200 ma molto meno....
All'inizio della pagina del playground perla del prescaler, ma non dice come si imposta.
Potete darmi qualche indizio?
Usate la stessa libreria per gestire gli interrupt sul timer1?
Ci sono altre librerie simili per gestire tutti i timer presenti?

dacci tutto lo sketch.
Ciao Uwe

Ecco il codice:

#include "TimerOne.h"
int FRAME_DELAY=200; //in millisecondi
int x=0;

void setup()
{
  pinMode(13, OUTPUT);
  Timer1.initialize(FRAME_DELAY*1000);         // in microsecondi
  Timer1.attachInterrupt(change_frame);  // attaches callback() as a timer overflow interrupt
}

void change_frame()
{
  if (x==0){
      digitalWrite(13, HIGH);
      x=1;
     }
  else {
      digitalWrite(13, LOW);
      x=0;
     }
}
void loop()
{ 
}

è un codice di esempio non credo che il resto possa servire a qualcosa....

Il problema è che il ritardo non è di 200 ma molto meno....

Quant'è "molto meno"?

COmunque considera che sull'Arduino UNO c'è un risuonatore ceramico, che ha una certa tolleranza. Su tempi lunghi non puoi avere delle precisioni elevate.
Avrai scarti di diversi ms al secondo

Bhe, sembra che il led sia pilotato da un pwm al 50% quando, se realizzo lo piloto con i delay lo vedo lampeggiare....

Cè una bella differenza! E larduino è il Duemilanove! XD

se realizzo lo piloto con i delay lo vedo lampeggiare

?????? :astonished: :astonished:

Dannato tablet!

Se realizzo lo sketch con i delay per pilotare il led, alla stessa frequenza (200ms acceso e 200ms spento) lo vedo lampeggiare!

Non saprei che dirti, non conosco la libreria. Per fare quel che vuoi fare tu, puoi provare anche il mio scheduler leOS: puoi scegliere tempi fino a 1 ms, e son sicuro che funzioni come si deve.

C'è tra gli esempi un Blink, cambi i millisecondi da 1000 a 200 e prova.

Carino lo scheduler, lo scarico e lo uso di sicuro (mi intriga sapere come si scrive una funzione a cui passare una funzione come argomento ;))

Tornando al problema, e forse anche tu puoi aiutarmi, come si settano i prescaler?? Nel tuo leOS come hai gestito i tempi?

ter2:
Tornando al problema, e forse anche tu puoi aiutarmi, come si settano i prescaler?? Nel tuo leOS come hai gestito i tempi?

Ma hai dato un occhiata al sorgente della libreria “Timer1” ??? :astonished: :astonished: :astonished:

Perché se te lo studi ci sono tutte le risposte alle tue domande …
… visto che i prescaler li sistema la libreria e non devi farlo tu !!!

void TimerOne::setPeriod(long microseconds)		// AR modified for atomic access
{
  long cycles = (F_CPU / 2000000) * microseconds;                                // the counter runs backwards after TOP, interrupt is at BOTTOM so divide microseconds by 2
  if(cycles < RESOLUTION)              clockSelectBits = _BV(CS10);              // no prescale, full xtal
  else if((cycles >>= 3) < RESOLUTION) clockSelectBits = _BV(CS11);              // prescale by /8
  else if((cycles >>= 3) < RESOLUTION) clockSelectBits = _BV(CS11) | _BV(CS10);  // prescale by /64
  else if((cycles >>= 2) < RESOLUTION) clockSelectBits = _BV(CS12);              // prescale by /256
  else if((cycles >>= 2) < RESOLUTION) clockSelectBits = _BV(CS12) | _BV(CS10);  // prescale by /1024
  else        cycles = RESOLUTION - 1, clockSelectBits = _BV(CS12) | _BV(CS10);  // request was out of bounds, set as maximum
  ...
  ...

Guglielmo

gpb01:
Tornando al problema, e forse anche tu puoi aiutarmi, come si settano i prescaler??

Come ti ha detto Guglielmo, non è un problema di cui ti devi interessare perché è la lib, a seconda della frequenza che deve calcolare, che aggiusta il timer affinché funzioni come desiderato.

Nel tuo leOS come hai gestito i tempi?

Sistemando il timer in base al tempo che desidero avere come intervallo per il check dei task in sospeso. nel mio caso ho aggiustato il tutto affinché il timer generi un interrupt esattamente ogni 1 ms.

ter2 ... magari QUESTO programmino può aiutarti a fare i calcoli ... :grin:

Guglielmo

Potrebbe interessarti anche --> Arduino Playground - ShowInfo