20 avr. 2016

MAX 7219 pour piloter 64 Leds

Après le pilotage des afficheurs 7 segment, aujourd'hui nous regardons la gestion de 64 Leds avec un seul circuit.

Le Max7219 

MAX7219 et Matrice LED


Il est possible avec ce circuit de piloter des leds de façon indépendante, nous l'utiliserons pour piloter une matrice de 8 x 8 leds.

matrice led 8x8

Nous utiliserons pour cela un module comportant la matrice de leds et le circuit de commande Max 7219 (voir sur Ebay, Amazon ou autres).

max7219 et matrice led


Pour permettre l'utilisation de plusieurs modules ils seront disposés suivant le schéma ci dessous :
max7219 matrice représentation
C'est important car nous allons utiliser les mêmes fonctions, que pour l'utilisation des afficheurs 7 segments, vues dans un précédent billet.

Donc la led en "haut à gauche" correspond à l'adresse "1" et à la data "1" et la led située en bas à droite correspond à l'adresse "8" et à la data "128".

De même pour tracer une ligne verticale à gauche il faut transmettre : adresse = 1 et data = 255.

J'ai évité de parler de lignes et de colonnes car cela risque de prêter à confusion.

Pour définir ces propres symboles j'utilise le logiciel "PixelFontEdit", ne pas oublier de faire une rotation pour obtenir les bonnes valeurs.


pixelfontedit

Il est bien sûr possible d'utiliser un autre logiciel.

Pour utiliser plusieurs modules le câblage est le suivant :

max7219 cablage

A répéter suivant le nombre de modules.

Il existe maintenant des modules qui utilisent un circuit cms plus simples à utiliser dans le cas de l'utilisation de plusieurs circuits.

MPLAB X et XC8 : fonctions


Au niveau software nous utilisons les mêmes fonctions que pour les afficheurs 7 segments soit :

  • ecr_7219 (adresse, data)
  • ecr_char_table (data)
  • efface_aff ()

La première fonction utilise une quatrième fonction, qui permet de transmettre sous forme série les 8 bits d'une donnée :


void ecr_7219_byte(unsigned char data)
{
    unsigned char cmp;
    SPI_dout = 0;
    for (cmp=8;cmp>=1;cmp--)
    {
        if (data & 0x80)
            SPI_dout = 1;
        else
            SPI_dout = 0;
        data = data<<1;
        __delay_us(1);
        SPI_clk = 1;
        __delay_us(1);
        SPI_clk =0;
    }
}


L'organigramme de cette fonction :

max7219 ecriture


La première fonction permet d'écrire dans les registres du MAX7219, pour configurer le circuit, ou d'allumer une ou plusieurs leds.
Elle est utilisée par les deux autres.

void ecr_7219(unsigned char adresse,unsigned char data)
{
    SPI_CS=0;
    ecr_7219_byte(adresse);
    ecr_7219_byte(data);
    SPI_CS=1;
}

Nous écrivons en premier l'adresse puis la donnée.

La fonction suivante permet d'afficher un symbole contenu dans une table.

void ecr_char_table(unsigned char data)
{
   for (int i=1;i<9;i++)
    {
         ecr_7219(i,table[(i-1)+(data*8)]);
    }   
}


Petite explication sur la ligne ecr_7219(i,table[(i-1)+(data*8)]);

L'adresse varie de 1 à 8 ce qui est normal, pour la donnée à écrire c'est un peu plus complexe, l'adresse de la table de caractères commence à 0 ce qui explique i - 1 et chaque caractère est composé de huit données ce qui donne pour le premier caractère une plage de 0 à 7, le deuxième de 8 à 15 et ainsi de suite ce qui donne le + (data * 8).

et la dernière fonction efface la matrice de leds.

void efface_aff()
{
   for (int i=1;i<9;i++)
        {
            ecr_7219(i,0);      // efface afficheur
        }    
}


Il suffit d'écrire des "0" pour chaque adresse.

Le logiciel qui accompagne ce billet permet de voir un certain nombre de possibilités, mais il est possible de rajouter ses propres réalisations.

Seule la solution qui utilise fonction software pour la transmission SPI est utilisée, il est bien sûr possible d'utiliser le module SPI du pic avec la librairie fournie avec le compilateur ou en écrivant directement dans les registres du pic.

Pour cela voir le billet précedant concernant le MAX7219. Le logiciel se compose d'une partie d'initialisation du MAX7219 et d'une partie des différents affichages proposés.

Logiciel test_max7219.zip

Modif en cours.

/*----------------------------------------------------------------------------------------------------------*/
Le coin de Patou "sait" "C"
/*----------------------------------------------------------------------------------------------------------*/


L'instruction "IF - ELSE"



Cette instruction est souvent utilisée pour décider ,suivant un test, la suite du programme.

La syntaxe est :
                              if (expression1)
                              {
                                  instructions 1;
                              }
                              else
                              {
                                  instructions 2;
                              }

La partie "else" n'est pas obligatoire ainsi que les accolades sauf en cas de plusieurs instructions.

Le test est effectué sur expression 1, si sa valeur est non nulle ou vraie "instructions 1" est exécutée sinon si la valeur est nulle "instructions 2" est exécutée.

Dans le cas de l'utilisation de plusieurs "IF" il faut bien retenir :

  - la séquence "ELSE" est associée au dernier "IF" sans "ELSE", par exemple :


if (cmpt < 100)
if (i = 0)
 a = b;

else
 a = c;

Le "else" est donc associé à if (i = 0).

Les accolades permettent de choisir la structure que l'on désire.


Aucun commentaire:

Enregistrer un commentaire