Contrôle de base
Initialisation des broches
❎ Dans un fichier matrix.c
, écrivez une fonction void matrix_init()
qui :
- met en marche les horloges des ports A, B et C
- configure toutes les broches reliées au driver en mode GPIO Output avec la vitesse maximale (très haute vitesse)
- positionne ces sorties à une valeur initiale acceptable :
RST
:0
(reset le DM163)LAT
:1
SB
:1
SCK
etSDA
:0
C0
àC7
:0
(éteint toutes les lignes)
- 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
etpulse_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.