Calcul de vitesse d'un objet par interruption

Yes, ils sont définis par unsigned int.

Je ne vais pas donner la solution juste souligner que la datasheet indique dans le chapitre des timers qu’une “procédure” existe sur la puce (registres tampon ?) pour lire une variable 16 bits contenue dans deux registres 8 bits et que la lecture ne se fait pas en un seul coup d’horloge.

Je laisse la place aux spécialistes.

68tjs:
Je ne vais pas donner la solution juste souligner que la datasheet indique dans le chapitre des timers qu'une "procédure" existe sur la puce (registres tampon ?) pour lire une variable 16 bits contenue dans deux registres 8 bits et que la lecture ne se fait pas en un seul coup d'horloge.

le compilateur le fait pour vous quand vous faites uint16_t t0 = TCNT1; il fait deux lectures consécutives dans le bon ordre de TCTN1L puis TCNT1H.

En pratique lorsque vous lisez l'octet de poids faible (TCNT1L), l'AVR enregistre automatiquement l'octet de poids fort (TCNT1H) dans un octet temporaire interne et la seconde lecture se fait à partir de cette copie.C'est ainsi que vous pouvez obtenir la valeur correcte du timer avec deux lectures 8 bits.

Cependant, comme il n'y a qu'un seul octet tampon, si cette lecture ne se fait pas dans une interruption avec les autres interruptions bloquées, il faut forcer une lecture "atomique".

Dans le cas présent on est dans une interruption lors de la lecture donc déjà en mode quasi atomique et je ne crois pas qu'il y ait un autre timer 16 bits (MEGA ?) en jeu qui pourrait créer cette contention sur l'octet tampon

mariuso31:
Yes, ils sont définis par unsigned int.

pas volatile ?

Dans le cas présent on est dans une interruption lors de la lecture donc déjà en mode quasi atomique et je ne crois pas qu'il y ait un autre timer 16 bits (MEGA ?) en jeu qui pourrait créer cette contention sur l'octet tampon

Sauf moi, je ne connais personne qui réactive les interruption dans une routine d'interruption. Il y a donc peu de risques que ce soit cela. Si tel était le cas, on pourrait avoir des valeurs fausses, mais pas systématiquement inférieures à 255.

pas volatile ?

C'est possible que ce soit cela si le programme est court effectivement.


Dans le programme, y a-t-il utilisation du PWM sur une broche 10 à 13? Si c'est le cas le timer 1 est utilisé. Le mode PWM utilise le mode 8 bits avec une pré-division par 64. Vérifier aussi que les deux instruction d'initialisation soient bien effectives parce qu'au démarrage, le timer 1 est mis dans ce mode.

vileroi:
Sauf moi, je ne connais personne qui réactive les interruption dans une routine d'interruption.

on est bien d'accord !

Dans le programme, y a-t-il utilisation du PWM sur une broche 10 à 13?

très bon point

Bonjour,
J’ai fini par utiliser le timer3 et, d’un coup, tout c’est mis à marcher. J’ai pu teste ma partie programmation en simulant mon banc avec une autre Arduino et tout va. Il me reste plus qu’à gérer des problèmes matériels venant de la partie d’origine.
Merci à vous pour votre aide :wink: