Mesure de la durée d'un pulse

En dépendance de ce que le reste de ton programme doit encore gérer, tu as les option de faire ceci par polling ou par des interruptions. La version avec le polling est plus simple et peut être plus efficace, mais elle nécessite que ta boucle central boucle suffisamment rapide et n'aie pas de parties qui prennent trop de temps. La version avec interruptions est plus compliquée à programmer et la précision de mesure est toujours dépendant des autres interruptions possibles simultanées. Pour les premiers essais la version avec le polling est préférable à mon avis.

Assumons que ta boucle centrale ne prend pas plus que 30 µs, soit quelques 400 instructions, tu devrais avoir assez de temps pour différencier entre la voiture avec le signal à 64µs et celle à 128µs. Cela devrait suffire comme précision.

Pour lire les entrées, je doute que tu puisses utiliser digitalRead. Une bonne idée est de brancher tous les signaux d'entrée sur broches du même port (par exemple port L, les broches 42 à 49). Cela te permets de lire tous les signaux simultanément en utilisant le registre PINL dans ce cas.

Le fragment de code pour tas boucle sera quelque chose comme:

unsigned long startTime[8];
...
void loop () {
...
  unsigned long isNow = micros();

  static uint8_t lastPinL = 0;
  uint8_t currPinL = PINL;  // Lire toutes les entrées
  unit8_t changed = currPinL ^ lastPinL;
  uint8_t newHigh = changedPinL & currPinL;
  uint8_t newLow = changedPinL & lastPinL;

  // Traiter les signaux qui viennent de commencer
  if (newHigh) {
    for (int8_t i = 0; i < 8; i++) {
      if (newHigh & (1 << i)) {
        startTime[i] = isNow;
      }   
    }
  }

  // Traiter les signaux qui viennent de finir
  if (newLow) {
    for (int8_t i = 0; i < 8; i++) {
      if (newLow & (1 << i)) {
        unsined long duree = isNow - startTime[i];
        // Identifier la voiture à base de la durée etc.
        ...
      }   
    }
  }
  lastPinL = currPinL;  // Sauver valeur pour prochain tour
  ...
}

Ce code n'est, comme toujours, pas testé de tout et peut être optimisé.

Peut-être ça t'aide un peu.

Korman