Contrôle de base

Initialisation des broches

❎ Dans un fichier matrix.c, écrivez une fonction void matrix_init() qui :

  1. met en marche les horloges des ports A, B et C
  2. configure toutes les broches reliées au driver en mode GPIO Output avec la vitesse maximale (très haute vitesse)
  3. positionne ces sorties à une valeur initiale acceptable :
  • RST : 0 (reset le DM163)
  • LAT : 1
  • SB : 1
  • SCK et SDA : 0
  • C0 à C7 : 0 (éteint toutes les lignes)
  1. attend au moins 100ms que le DM163 soit initialisé, puis passe RST à l'état haut.

Contrôle des broches

❎ Écrivez les fonctions ou macros suivantes permettant de piloter indépendamment chaque broche :

  • RST(x)
  • SB(x)
  • LAT(x)
  • SCK(x)
  • SDA(x)
  • ROW0(x) à ROW7(x)

Par exemple RST(0)̀ mettra la broche RST à 0, LAT(1) mettra la broche LAT à 1, ROW6(1) mettra C6 à 1, etc.

Utilisez-les dans la fonction d'initialisation de la matrice.

Génération de pulses

❎ Écrivez, à l'aide de la macro SCK, une macro (ou fonction) pulse_SCK qui effectue un pulse positif (état bas, attente, état haut, attente, état bas, attente) sur SCK respectant les timings attendus par le DM163.

❎ Écrivez, à l'aide de la macro LAT, une macro (ou fonction) pulse_LAT qui effectue un pulse négatif (état haut, attente, état bas, attente, état haut, attente) sur LAT respectant les timings attendus par le DM163.

Si vous devez faire des pauses, faites pour l'instant des boucles d'attente active à l'aide de asm volatile ("nop").

Contrôle des lignes

❎ Écrivez, à l'aide des macros ROW0 à ROW7, une fonction void deactivate_rows() qui éteint toutes les lignes.

❎ Écrivez, à l'aide des macros ROW0 à ROW7, une fonction void activate_row(int row) qui active la ligne dont le numéro est passé en argument.

Contrôle du DM163

❎ Écrivez une fonction void send_byte(uint8_t val) qui, à l'aide des macros pulse_SCK et SDA, envoie 8 bits consécutifs au bank actif du DM163 (dans l'ordre attendu par celui-ci).

❎ Définissez le type rgb_color comme une structure représentant la couleur d'une case de la matrice :

typedef struct {
  uint8_t r;
  uint8_t g;
  uint8_t b;
} rgb_color;

❎ Écrivez, à l'aide de send_byte et activate_row, une fonction void mat_set_row(int row, const rgb_color *val) qui :

  • prend en argument un tableau val de 8 pixels
  • à l'aide de send_byte envoie ces 8 pixels au bank actif du DM163 (B7, G7, R7, B6, G6, R6, ..., B0, G0, R0)
  • puis à l'aide de activate_row et pulse_LAT active la rangée passée en paramètre et les sorties du DM163.

Initialisation du BANK0

❎ Écrivez une fonction void init_bank0() qui à l'aide de SB, SDA, pulse_SCK et pulse_LAT met tous les bits du BANK0 à 1.

❎ Faites en sorte que cette fonction soit appelée par matrix_init.

❎ Toujours dans matrix_init, positionnez le bank par défaut à BANK1 en utilisant SB pour que toutes les opérations suivantes n'utilisent que ce bank.