Calcolare il tempo tra due eventi

e' talmente banale che quasi me ne vergogno

#define A 12
#define B 13
byte alza = 1;
byte abbassa = 0;

void setup()
{
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
    Serial.begin(9600);
    Serial.println("programma per simulare encoder");
}

void loop(void)
{
  for (byte i=0; i<20;i++){
    ciclo();
  }
  // passi avanti
  for (byte i=0; i<20;i++){
    retro();
  }
  // passi indietro
  alza=!alza;
  abbassa=!alza;
  Serial.println("inverto logica");
}
void ciclo(void)
{
    su(A);
    delay(100);
    su(B);
    delay(100);
    giu(A);
    delay(100);
    giu(B);
    delay(700);
    Serial.println("ciclo");
}
void retro(void)
{
    su(B);
    delay(100);
    su(A);
    delay(100);
    giu(B);
    delay(100);
    giu(A);
    delay(700);
    Serial.println("retro");
}

void su(byte pin)
{
    for (byte i = 0; i < 10; i++)
    {
        digitalWrite(pin, !digitalRead(pin));
        delay(3);
    }

    digitalWrite(pin, alza);
}

void giu(byte pin)
{
    for (byte i = 0; i < 10; i++)
    {
        digitalWrite(pin, !digitalRead(pin));
        delay(3);
    }

    digitalWrite(pin, abbassa);
}

vent giri in un senso
venti giri nell'altro
ad ogni cambio di stato delle uscite una mitragliata di write alternate
dopo 20+20 giri inverte alto con basso per simulare "negato"
tempi "storti" per simualre anche encoder "costruiti" con proximity su ruote
usa l ucite 13 e 12 (la 13 per "vedere" il led)
volevo trasferirlo su uno degli attiny45 che ho preso per la "stagione del riscaldamento"
ma non lo ho ancora fatto