J'ai regardé comment ca marche et j'ai utilisé mon analyseur logique pour les détails.
La lib utilise la liaison SPI hardware pour transmettre les octets sous interruption.
Le SPI est configuré avec une horloge à 8MHz ce qui fait 1µs pour transmettre un octet.
A la fin de chaque transmission, le contrôleur SPI génère une interruption et le code de lib lance l'envoi de l'octet suivant.
Voir l'image "transmission_octet" où :
- ISR représente le temps d'éxécution de la routine d'interruption (ISR) : je fais un digitalWrite(, HIGH) sur un pin au début et un digitalWrite( , LOW) à la fin.
- SCK représente les 8 impulsion du signal SCK pour transmettre les 2 bits d'un octet.
Seulement je constate qu'il faut 1,8µs pour que le code retourne dans la routine d'interruption et encore 1.7µs pour que l'octet suivant parte.
Bref, il faut donc au total 4µs pour transmettre un octet. Au total pour 50 LEDs, je constate environ environ 520µs.
Voir l'image "execution_globale"
Le problème de performance ne donc pas de là.
Je vois 2 problèmes possible :
a) C'est ton code de création des effets qui n'est pas assez performant
b) La transmission et les interruptions SPI ne s'arrêtent jamais. Hors on constate sur le diagramme "transmission_octet" que l'on passe presque la moitié du temps dans la routine d'interruption. On gâche donc en permanence 50% du CPU pour transmettre des 0 entre chaque mise à jour utile.
D'après la datasheet, je ne vois aucune raison a cette transmission permanente.
J'ai modifié la lib pour arrêter ces transmissions lorsqu'on en n'a pas besoin et donc récupérer ces 50% de capacité de traitement en plus.
Cela devrait régler le b)
Je te laisse essayer et donner ton retour.
Pour le a), c'est à toi

BLIP_LEDS_SPI_LPD6803.cpp (8.95 KB)
