Frequenzimetro

il llimite della digitalRead è di 145KHz. Se usi direttamente i registri, sali a 4MHz

more info:
http://www.billporter.info/ready-set-oscillate-the-fastest-way-to-change-arduino-pins/

piccola chicca per il tempo:

#define byte MAX 10 //una define non ha bisogno di essere volatile!
volatile byte contatore = 0;
volatile unsigned long lastDuration[MAX];

void quicfunc() {
  lastDuration[contatore<MAX-1?contatore+1:0;] = millis(); //inizializza il tempo di inizio impulso del PROSSIMO segnale
  lastDuration[contatore] = millis()-lastDuration[contatore]; //calcola la durata del segnale attuale
  contatore=contatore<MAX-1?contatore+1:0;

  if (digitalRead(2)==HIGH){
    hticks++;
  }else{
    lticks++;
  }
}

NON È TESTATO! ma in pratica riempo un array delle ultime 10 durate di impulso (però non c'è modo per sapere se il primo impulso è alto o basso, potresti usare un boolenao di quelli che avanzano per indicare se la lettura in posizione 0 è high o low e da li ricavare il resto)
al posto di un int e dei vari if, potresti usare una union, quindi crei una variabile di X bit (e quindi che con l'overflow va a 0 da sola) e sfruttare uno dei bit che ti avanza al posto della booleana.
ottimizzazione spinta, senza andare troppo nel basso livello :slight_smile: