Contador múltiple

Bueno, he logrado lo que quería y con una versión que lleva la cuenta discriminando hasta 10 useg dos entradas... tu dirás si es o no suficiente.

El esquema usando un 74hc4072 que tiene mejor tiempo de propagación que su versión CMOS 4072 a secas.
Aca expreso todo lo que te había sugerido anteriormente.
Se trata de 4 barreras representdas por los generadores de pulsos que luego describo en detalle.
Las 4 entradas van a un PORT yo use A0..A3 por comodidad pero puedes usar cualquiera.
También van a una compuerta OR que me gustó mas en tu sugerencia que la AND. Todo depende de como vengan los pulsos si Normal ALTO o Normal BAJO como yo los definí.
Bien, la OR se conecta al pin2 que es nuestra INT0.

Cada pulso en HIGH provoca el disparo de la interrupcción.
En la rutina se lee el puerto y se compara con un dato anterior (acá aun le falta algun detalle).
El valor anterior lo guardo cuando el flanco cae.
Según sea el valor leido uso un switch para incrementar cada contador.
El resto no merece explicación.

Este es el código

const byte interruptPin = 2;
volatile byte dato, datoAnt = 0;
volatile bool flag = false;
volatile unsigned int contador[4] = {0,0,0,0};


void setup()  {
 Serial.begin(115200);
 pinMode(interruptPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(interruptPin), contadores, RISING);
    attachInterrupt(digitalPinToInterrupt(interruptPin), contacero, FALLING);
    DDRC = B00001111;
}

void loop() {
 if (flag) {
 char buffer[30];
 sprintf(buffer, "%4d %4d %4d %4d", contador[0], contador[1], contador[2], contador[3]);
 Serial.println(buffer); 
 flag = false;
 }
    
}

void contadores() {
   
   dato = PINC;
   if (dato != datoAnt) {
     switch(dato) {
       case 1: contador[0]++;
         break;
       case 2: contador[1]++;
         break;
       case 4: contador[2]++;
         break;
       case 8: contador[3]++;
         break;
     }
   }
   flag = true;
   
}

void contacero() {
 datoAnt = dato;
}

Los generadores de pulsos estan a 100Hz o sea cada 10 mseg con flancos de subida y bajada de 1useg
5 useg de nivel HIGH en 5V
Tambien cambie los tiempos en los que se muestran
Pulso 1 Start 10useg
Pulse 2 Start 20useg
Pulso 3 Start 4mseg
Pulso 4 Start 5mseg

Los pulsos tienen esta configuración

Barreras_Pulsos.png
Se ve que todo lo que he descripto. Ancho del pulso 5 useg.
Los demás solo se desplazan en su arranque, para poder probar situaciones complicadas.

He capturado algunas situaciones para que veas como todos los contadores se incrementan.
Puedo hacer que Pulso1 y 2 se aproximen mas si quieres?

Aca se ve como funciona todo, a la izquierda el osciloscopio mostrando dos pulsos (1 y 2) proximos entre si, y sin embargo el si código no los pierde. No los puse suficientemente próximos como para solaparse.

Ahora me dirás si esto es lo que querías?

son muy buenos aportes, sin duda voy a probar los dos en mi prototipo.

aun me falta por aprender cuanto a manejo de bits, quisiera hacerle unas preguntas:

esta linea de código que hace ?

byte activos = estado & ~estadoAnterior;

y

dato = PINC;

no se que hace PINC

PINC es la instrucción que lee el puerto C del ATMEGA328 que corresponde en mi caso a los AD que tmb pueden actuar como entradas o salidas digitales.
Yo lo use por comodidad.

byte activos = estado & ~estadoAnterior;

~estadoAnterior es niego el estado anterior. Si es a nivel de bit lo inverte.
la operacion & es AND o sea responde a esta tabla

AB Z
00 0
01 0
10 0
11 1
Donde AB son entradas y Z es salida
lo restrinjo a 2 bits pero eso es una operacion AND

Solo devuelve 1 si todo esta en 1, de lo contrario es 0.

he visto que hay algunas palabras reservadas como PINC y algunas otras, donde puedo consultar alguna información sobre ello ?.

En el datasheet del ATmega328P

Esas "palabras reservadas" que tu dices, son los nombres de los registros que posee el microcontrolador.

Un registro es el tipo de memoria más próximo al microprocesador (CPU); está aparte de la memoria RAM. Se utilizan para configurar el microcontrolador a un nivel más bajo (y sumamente rápido además). El uso de estos en código no es muy amigable para el principiante, por el simple hecho de que es la única forma de configurar el microcontrolador (y que está más orintado para el lenguaje ensamblador); que las funciones que provee la IDE de Arduino hagan fácil esta tarea, es otra cosa.

DDRC = B00001111;

no se si estoy mal interpretando esta linea?, pero según el manual del ATmega328/P, este es el registro de dirección del puerto C, si pongo 1 es para configurar el pin como salida y 0 para configurar el pin como entrada, el ejemplo de surbyte se están utilizando los pines A0...A3 del arduino, que corresponden a los puertos PC0...PC3 del ATmega328 de 32 pines, los cuales los ha configurado como salida ya que escrito el valor de 1 en las 4 primeras posiciones, sin embargo en el esquema mostrado estos pines deben ser de entrada.

Pues tienes razón y como igual funciona queda claro que no tiene sentido esa línea.