Dans cet exercice vous devez implémenter une matrice de 4x4 LEDs. Pour cela vous créerez une mémoire vidéo et une boucle d'affichage.
Les 16 LEDSs utilisent un circuit de multiplexage, ce qui permet de les contrôler à l'aide de 8 entrées. Ces 8 entrées sont reliées à un registre à décalage. Pour choisir la ou les LEDS à allumer il suffit donc d'envoyer un octet à l'aide d'un bus SPI.
L'ensemble des documentations est disponible ici.
Un binaire montrant le comportement attendu est disponible à ici. Il faut appuyer sur le bouton bleu de la carte pour déclencher une animation.
Commencez par allumer une LED, celle de la 2e ligne, 3e colonne. identifiez quels bits représentent quelles lignes et quels bits représentent quelle colonne. Vous aurez aussi besoin de hardware/include/ssp.h. Vous pouvez utiliser SPI1, qui utilise les pins suivants : PA5 (CLK), PA7 (MOSI, ou DATA). STR correspond au choix de l'esclave au cas où plusieurs esclaves sont connectés au bus. Il peut être relié à 3V. OE permet d'activer ou désactiver la sortie. Vous pouvez aussi la brancher à 3V.
Maintenant que vous savez afficher une LED, vous voulez sans doute afficher une image, c'est à dire plusieurs LEDs en même temps. En réalité on va afficher chaque LED à la suite. En le faisant rapidement le changement ne sera pas perceptible. Par contre les LEDs seront moins lumineuses. Étant donné qu'une image est composée de 16 LEDs sans « niveau de gris », il faut 16 bits pour représenter la mémoire. Un simple uint16_t suffira.
Les LEDs doivent être allumées un certain temps. Si vous les changez trop vite avec une simple boucle, elles risquent de ne pas être allumées assez longtemps pour briller. Créez un callback sur un timer afin d'afficher une LED à la fois à intervalle régulier. Utiliez les opérations sur les bits pour savoir si la LED courante doit être allumée ou éteinte. Faites varier la fréquence du timer pour voir l'ipact sur la luminosité. Regardez dans hardware/include/timer.h :
L'affichage LED par LED divise l'affichage en 16 étapes. Ça divise d'autant le temps d'allumage de chaque LED et donc sa luminosité. Le circuit de multiplexage permet de gérer ligne par ligne, ce qui ferait que 4 étapes. Modifiez votre code pour afficher ligne par ligne
Vous pouvez maintenant utiliser un autre timer pour gérer une animation. Une animation sera un tableau d'uint16_t.
La carte possède un bouton relié au pin PA0. Vous pouvez créer un callback déclenché lorsque ce bouton est pressé, qui va déclencher une animation. Regardez dans hardware/include/gpio.h :