Utilizzare timers arduino UNO

Salve a tutti,
sto progettando un sistemino per auto/kart che mostri al pilota (su lcd 20x4) tempo sul gro, velocità ,giri motore ecc.. e ho un problema:
per la misurazione del tempo sul giro ho trovato un codice su internet, e l'ho modificato che andasse bene x me:

#include <LiquidCrystal.h>
LiquidCrystal lcd (13,12,11,10,9,8);

uint16_t microseconds = 0, milliseconds = 0, Rmicroseconds =0, Rmilliseconds = 0;
uint8_t seconds = 0, minutes = 0, Rseconds = 0, Rminutes = 0;




ISR(TIMER1_COMPA_vect) 
{
  milliseconds += 100;
  if (milliseconds == 1000)
  {
    milliseconds = 0;
    seconds++;
  }
  if (seconds == 60)
  {
    seconds = 0;
    minutes++;
  }
  if (minutes == 60)
  {
    minutes = 0;

  }
}



void reset_chrono(void)
{
  unsigned char sreg;
  sreg = SREG;    
  cli();  
  TCNT1 = 0;
  SREG = sreg;
  milliseconds = 0;
  seconds = 0;
  minutes = 0;
 
}



uint32_t read_microseconds(void)
{
  uint32_t microseconds;
  unsigned char sreg;
  sreg = SREG;
  cli();  
  microseconds = TCNT1*4;  
  SREG = sreg;  
  return microseconds;
}

void resetmemory(){
  Rminutes=0;
  Rseconds=0;
  Rmilliseconds=0;
}

void setup(void)
{
  
  lcd.begin(20,4);
  TCCR1A = 1<<WGM10 | 1<<WGM11; 
  TCCR1B = 1<<CS10 | 1<<CS11 | 1<<WGM12 | 1<<WGM13;  
  OCR1A = 24999;  
  TIMSK1 = 1<<OCIE1A;  
  sei();  
}


void chrono(void)
{
  uint32_t microseconds_count = 0;
  uint16_t milliseconds_display = 0, microseconds_display = 0, milliseconds_rest = 0;
  microseconds_count = read_microseconds();
  milliseconds_rest = (uint16_t)(microseconds_count/1000);  
  milliseconds_display = milliseconds + milliseconds_rest;  
  microseconds_display = (uint16_t)(microseconds_count-(uint32_t)(milliseconds_rest*1000)); 
  lcd.setCursor(8,2);
  lcd.print(minutes, DEC);
  lcd.print("'");
  lcd.setCursor(12,2);
  lcd.print(".");
  lcd.setCursor(13,2);
  lcd.print(milliseconds_display, DEC);
   if(seconds<10){
    lcd.setCursor(10,2);
    lcd.print("0");
    lcd.setCursor(11,2);  
    lcd.print(seconds, DEC);
  }else{
    lcd.setCursor(10,2);
    lcd.print(seconds, DEC);
  }
    
  if (digitalRead(5)==LOW)  
  {
    delay(100);
    resetmemory();
    Rminutes=minutes;
    Rseconds=seconds;
    Rmilliseconds=milliseconds_display;
    reset_chrono();
  }
  lcd.setCursor(8,3);
  lcd.print(Rminutes, DEC);
  lcd.print("'");
  lcd.setCursor(12,3);
  lcd.print(".");
  lcd.setCursor(13,3);
  lcd.print(Rmilliseconds, DEC);
  if(Rseconds<10){
    lcd.setCursor(10,3);
    lcd.print("0");
    lcd.setCursor(11,3);  
    lcd.print(Rseconds, DEC);
  }else{
    lcd.setCursor(10,3);
    lcd.print(Rseconds, DEC);
  }
  if(Rmilliseconds==0){
    lcd.setCursor(14,3);
    lcd.print("00");
  }
  
}

questo codice memorizza anche il tempo sul giro precedente e lo visualizza nella riga di sotto.
quando però son dovuto andare a leggere anche gli rpm ho voluto usare la libreria freqmeasure (il metodo per me piu facile), che utilizza lo stesso timer del cronometro. questo ovviamente non permette al tutto di funzionare a dovere, come posso fare??
grazie in anticipo per le vostre risposte, spero rispondiate in tanti perchè non so più dove battere la testa!

Usa il timer 2 per l'orologio. Ha una precisione ad 8 bit ma puoi ottenere lo stesso un contatore al millesimo di secondo per poter gestire l'orologio.

eh, appunto..essendo abbastanza scarso nella programmazione non so come si faccia..

I timer non si imparano in 1 giorno. Io ci ho messo un mesetto buono per capire come gestirli.
Nel frattempo puoi usare la libreria MsTimer2
http://www.arduino.cc/playground/Main/MsTimer2

che esegue guarda caso proprio ogni millisecondo una funzione dell'utente.
Tu in quella funzione mettici quella che ora hai nell'interrupt generato sul timer 1 per incrementare l'orologio ed hai risolto.

Grazie mille! anzi visto che siete cosi veloci a rispondere ne approfitto :slight_smile: dopo i giri motore dovrei gestire anche la velocità, con una routine simile agli rpm. Cosa mi conviene fare? usare la funzione millis? o pulseIn?