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 ![]()