Le mot clef volatile aurait bien été nécessaire à mes yeux pour rendre le code "correct".
Pour info, un code Arduino contient une fonction "main" cachée (ie la première fonction appellée), qu'on peut résumer en :
Setup(); while(true) { loop(); }
Donc sans volatile, le compilateur serait en droit de remplacer (équivalent du loop)
while(true) { if(distToRun <= 0) { analogWrite(PinEN,0); digitalWrite(PinIN1,LOW); digitalWrite(PinIN2,LOW); } }
par
if(distToRun <= 0) { while(true) { analogWrite(PinEN,0); digitalWrite(PinIN1,LOW); digitalWrite(PinIN2,LOW); } }
vue que si distToRun n'est pas volatile, le compilateur a le droit de faire l'hypothèse que distToRun ne change pas (vu qu'aucune instruction du flot d'instructions normales ne modifie distToRun).
En pratique, je ne penses pas que le compilateur fasse cette optimisation (sinon, le robot s'arrêterait jamais), mais il en aurait le droit.
Donc il aurait fallu mettre distToRun en volatile (comme toutes les variables qui apparaissent à la fois dans une interruption et en dehors). Mais je ne penses pas que ça aurait changé quoi que ce soit à ton problème.
Par contre, je n'ai pas d'explication à première lecture de pourquoi distToRun a diminué plus que prévu (et je n'aurais malheureusement pas le temps ces prochains jours de creuser plus dans le détail, désolé)