[Risolto] Problema con millis()


salve, sto facendo un tachimetro con arduino. il codice tecnicamente funziona, solo che vorrei visualizzare tramite serial.print km/h con un refresh di un secondo. se metto il serial.print "libero" nel loop tutto ok, visualizzo il dato in maniara corretta, mentre se lo inserisco in un if con millis() mi da dei valori  moooolto distanti da quelli reali...
boh io non più come fare... chi mi da un aiuto?
uso un sensore ad effetto hall collegato al pin 2 in interrupt e calcolo il tempo trascorso tra un impulso e l'altro con il timer2.

code: [select]

// tachimetro

uint_fast8_t conteggio;
unsigned long intervallo;
unsigned long rangetot;
unsigned long timer01;
double kmh;
int crfruota = 605;     //circonferenza ruota in millimetri
bool calcola = false;




void setup()
{
 serial.begin(9600);
 attachinterrupt(0, conta, falling);
 timer2();                            // inizializzo il timer2
 intervallo = millis() + 1000;
}

void loop()
{
 //serial.println(kmh);  
  if (calcola == true) {
 kmh = ((double)crfruota / rangetot * 3.6);
 calcola = false;
  }

  if ((long)(millis() - intervallo) >= 0) {
         intervallo += 1000;
 serial.println(kmh);            // non funge, valori strani
  }
}

void conta()
{
 conteggio ++;  
  if (conteggio == 1) {
 conteggio = 2;
 tcnt2 = 239;         // sincronizzo il timer2 con l'interrupt del sensore
 timer01 = 0;         // resetto il timer
  }
  if (conteggio == 3) {
 rangetot = timer01;
 tcnt2 = 239;         // sincronizzo il timer2 con l'interrupt del sensore
 timer01 = 0;         // resetto il timer
 calcola = true;
 conteggio = 2;
  }
}

void timer2()
{
 //imposto timer2 per un overflow ogni 1ms
 //periodo [sec] = (1 / f_clock [sec]) * prescale * (255 - count)
 //                (1/16000000) * 1024 * (255 - 239) = 0.001 sec

 tccr2b = 0x00;      // disabilita timer2 per effettuare le impostazioni

 tcnt2  = 239;       // resetta il timer (255 - 239) = 1ms
 tifr2  = 0x00;      // timer2 int flag reg: cancello il timer overflow flag
 timsk2 = 0x01;      // timer2 int reg: timer2 overflow interrupt attivato
 tccr2a = 0x00;      // timer2 control reg a: modalità generatore d'onda normale
 tccr2b = 0x07;      // timer2 control reg b: timer prescaler settato 1024
}


isr(timer2_ovf_vect)
{
 
  tcnt2 = 239;          // resetto il timer (255 - 239) = 1ms
  tifr2 = 0x00;         // timer2 int flag reg: cancello il timer overflow flag  
  timer01 ++;
  if (timer01 >= 2000) {
 conteggio = 0;
 kmh = 0;           // azzero km/h se passano più di due secondi da un impulso
  }
}

non sò se centri qualcosa, ma potrebbe questo aiutare?
dichiarare la variabile kmh come volatile, essendoci un interrupt di mezzo?
http://arduino.cc/en/reference/volatile


Arduino Forum > International > Italiano > Software (Moderator: leo72) > [Risolto] Problema con millis()


arduino

Comments

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

Rasperry Wifi LAN Controller - Raspberry Pi Forums

Unlock car with bluetooth and car key