Servo et les timers 16 bits

Bonjour,

J’étais en train de voir si je comprenais la bibliothèque Servo. D’après ce que je vois, Servo utiliserait pour tous les timers 16 bits disponibles l’interruption lié au vecteur TIMERX_COMPA_vect, même si on n’utilise qu’un seul servomoteur. Quelqu’un peut le confirmer?
Ce qui veut dire qu’avec une Mega qui dispose de 4 timers 16 bits, Servo est incompatible avec toutes les bibliothèque ont besoin d’un seul timer 16 bites en utilisant TIMERX_COMPA_vect
Je crois comprendre que Servo pour la Mega utilise d’abord le timer 5, puis le 1, puis le 3 et en dernier lieu le 4. Si je tente de faire un programme utilisant 0 servomoteurs ISR (TIMER3_COMPA_vect) n’est plus disponible:

#include <Servo.h>

void setup(){}

ISR(TIMER3_COMPA_vect){}

void loop(){}

donne une erreur

(.text+0x0): multiple definition of `__vector_32’

Question suivante:
J’ai écrit le programme suivant:

#include <Servo.h>

Servo myservo2; // servo sur la broche 2
Servo myservo3; // sur la 3

void setup()
{
  myservo2.attach(2,1000,1500); // mini à 1ms
  myservo3.attach(3,1000,1500); // maxi à 1,5ms
  myservo2.write(0); // J'attends 1ms
  myservo3.write(180); // J'attends 1,5ms
}

void loop()
{
}

Sur la broche 2, j’ai demandé un angle de 0°, il me met le minimum cad 1ms
Sur la broche 3, j’ai demandé 180°, il devrait me mettre 1,5ms, mais il me met 2,5ms
C’est normal?

si je mets:

  myservo3.attach(3,500,1000);

j’ai une impulsion de 2024µs

si je mets:

  myservo3.attach(3,500,800);

j’ai une impulsion de 2848µs

vileroi:
D'après ce que je vois, Servo utiliserait pour tous les timers 16 bits disponibles l'interruption lié au vecteur TIMERX_COMPA_vect, même si on n'utilise qu'un seul servomoteur.

Pour être précis, apparemment ce que fait la bibliothèque, c'est lister tous les timers 16 bits, puis pour chaque nouveau servo qui est créé, le dispatcher sur le timer suivant, en boucle. Donc sur une Arduino Mega, on aura en effet le premier servo sur le timer 5, le deuxième sur le timer 1, puis le 3, puis le 4, puis retour au 5, etc.

En effet, il y aura une incompatibilité avec une autre bibliothèque qui utilise non seulement COMPA, mais le timer concerné, tout simplement. A noter : la bibliothèque ne paramètre les timers nécessaires que lorsque la méthode attach est appelée. On peut donc imaginer, sur une mega, n'avoir qu'un seul servo (rattaché au timer 5, et utiliser une autre bibliothèque qui utiliserait le timer 1.

Pour la question de la disponibilté, c'est vicieux : en effet la fonction d'ISR est déjà définie. Donc ça vient infirmer ce que je dis juste au-dessus : même si ça reste disponible puisque non utilisé, on ne peut pas redéfinir la fonction d'ISR.

Pour être précis, apparemment ce que fait la bibliothèque, c'est lister tous les timers 16 bits, puis pour chaque nouveau servo qui est créé, le dispatcher sur le timer suivant, en boucle. Donc sur une Arduino Mega, on aura en effet le premier servo sur le timer 5, le deuxième sur le timer 1, puis le 3, puis le 4, puis retour au 5, etc.

Ce que dit la référence officielle:

The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.

Cela veut dire que comme à part sur la Mega est utilisé le timer 1, et on ne peut plus utiliser le PWM sur les broches qui utilisent le timer 1. Pour la Méga, ils doivent d'abord remplir les 12 servos associés au timer 5 avant de passer au timer 1 (PWM sur 11 et 12).
Mais se pose la question du PWM sur les broches 44 à 46 qui vont avec le timer 5 (On the Mega, up to 12 servos can be used without interfering with PWM functionality qu'ils disent)

En effet, il y aura une incompatibilité avec une autre bibliothèque qui utilise non seulement COMPA, mais le timer concerné, tout simplement. A noter : la bibliothèque ne paramètre les timers nécessaires que lorsque la méthode attach est appelée. On peut donc imaginer, sur une mega, n'avoir qu'un seul servo (rattaché au timer 5, et utiliser une autre bibliothèque qui utiliserait le timer 1.

Effectivement, cela m'avait échappé. le paramétrage n'est pas fait si on n'a pas les servos associés. Donc on peut utiliser les autres timers... à condition de ne pas utiliser COMPA.

Pour la question de la disponibilté, c'est vicieux : en effet la fonction d'ISR est déjà définie. Donc ça vient infirmer ce que je dis juste au-dessus : même si ça reste disponible puisque non utilisé, on ne peut pas redéfinir la fonction d'ISR.

Finalement, il reste la possibilité de modifier ServoTimers.h pour lui dire qu'un timer n'est pas disponible. Avec les problèmes de mise à jour de servo...