Skyduino:~#
Articles
projet

[Erratum article précédent] 1 + 1 = 10

Bonjour tout le monde !

Dans cet article je vais passer pour un sacré boulet, mais j’ai l’habitude 😉

Dans mon précédent article je vous avais donné un tableau précisant le nombre de couleurs maximum en fonction du nombre de matrices.

Oubliez ce tableau, j’avais complètement foiré mes calculs de temps processeur, mais alors complètement de chez complètement.
C’est en rédigeant mon article d’explication sur l’optimisation du code que je me suis rendu compte que j’avais pris en compte les résultats en terme de performance du code … non optimisé.
Entre temps comme j’avais optimisé le code d’un facteur de presque 10 les résultats étaient forcément bien différents.

Après test il est possible d’avoir (avec un ATmega1284p à 16MHz) :
– 28 matrices en mode 8 couleurs (limitation par manque de RAM)
– 14 matrices en mode 64 couleurs (pareil, limitation par manque de RAM)
– 9 matrices en mode 512 couleurs (toujours pareil, limitation par manque de RAM)
– 4 matrices en mode 4096 couleurs (limitation par manque de temps processeur cette fois)
– 1 matrice en mode 32768 couleurs (pareil, limitation par manque de temps processeur)

Avec un ATmega1284p à 20MHz on peut (théoriquement, pas testé pour le moment) :
– 6 matrices en mode 4096 couleurs (limitation processeur)
– 2 matrices en mode 32768 couleurs (limitation processeur)

On est donc très loin de mes résultats précédents, mais c’est pas plus mal aux vues des nouveaux résultats.

Détails des calculs pour les curieux

Soit un ATmega1284p à 16MHz avec 16Ko de RAM.
2Ko de RAM sont alloués pour l’utilisateur, laissant donc 14Ko de RAM pour le code d’affichage.

Chaque buffer d’affichage (= 1 bit de résolution pour 1 matrice 32×32) fait 512 octets.
14Ko / 512o = 28 buffers au maximum.

Pour réaliser l’affichage d’une matrice, il faut 160 tics de l’horloge processeur.
En plus de ces 160 tics, il faut environ 350 tics pour « l’enrobage » (fonction d’interruption, gestion des adresses, etc.).
On obtient donc une fonction du style : NB_TICKS(NB_MATRICES) = 160 * NB_MATRICES + 350.

La fréquence de rafraîchissement pour l’affichage est de 60Hz, la scanline est de 1/16.
On obtient donc un nombre de tics processeur par interruption (à la fréquence la plus basse possible) de :
F_CPU / 60 / 16 = 16 000 000 / 60 / 16 = 16 666 tics.

Ce nombre de tics correspond à une résolution de 1 bit (8 couleurs).
On peut donc d’ores et déjà faire le calcul du nombre de matrices maximum pour 1 bit de résolution.
NB_MAX_MATRICES = (16 666 – 350) / 160 = 101.975
Pas de bol, la RAM ne peut contenir que 28 buffers, donc : nombre maximum de matrices à 1 bit de résolution = 28.

Pour 2 bits de résolution :
NB_MAX_MATRICES = ((16 666 / 3) – 350) / 160 = (5 555 – 350) / 160 = 32
(rappel : en modulation BCM pour encoder 4 valeurs (2^2) il faut 3 périodes de temps, d’où la division par 3)
Encore pas de bol, la RAM ne peut contenir que 28 buffers, soit 14 buffers x 2 bits, donc : nombre maximum de matrices à 2 bits de résolution = 14.

Pour 3 bits de résolution :
NB_MAX_MATRICES = ((16 666 / 7) – 350) / 160 = (2 380 – 350) / 160 = 12.69
Mais 28 buffers / 3 bits = 9 matrices max.

Pour 4 bits de résolution :
NB_MAX_MATRICES = ((16 666 / 15) – 350) / 160 = (1 111 – 350) / 160 = 4.75 = 4 matrices max

Pour 5 bits de résolution :
NB_MAX_MATRICES = ((16 666 / 31) – 350) / 160 = (537 – 350) / 160 = 1.16 = 1 matrice max

Autre information concernant les matrices, dans mes codes « démo 3 » et « m1284 » une erreur de copier-coller s’est glissée au niveau du memcpy().

L’erreur est très simple à corriger :
https://github.com/skywodd/RGB_Matrix_Arduino_AVR/commit/2991c6d1828b3e4302477068c83cb52a46268e84
https://github.com/skywodd/RGB_Matrix_Arduino_AVR/commit/607f15f68073541a534f70c860996d5d3a78e188

Edit : La dernière version du code est disponible sur mon github :
https://github.com/skywodd/RGB_Matrix_Arduino_AVR/tree/master/M1284_Software

Maintenant que ce petit problème mathématique est corrigé, je vais pouvoir reprendre l’écriture de mon article 😉

Au passage, voilà de quoi vous mettre l’eau à la bouche pour le week-end :

DSCF2842

Advertisements

Discussion

Une réflexion sur “[Erratum article précédent] 1 + 1 = 10

  1. Hi,
    Tu vas quand même pas te prendre pour Calimero ou Droopy 🙂
    L’erreur est humaine et le pardon est divin 😉

    Publié par Icare Petibles | 12 avril 2014, 17 h 10 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.