(Loading...)

mardi 25 mai 2010

1 - Matrice à LED

J'avance dans l'apprentissage des microcontroleurs et leurs nombreuses applications.
Je m'attaque à la programmation d'un système d'affichage à matrice de LED,
permettant le défilement d'un message.
Le projet est réalisé sur un PIC 16F876a programmé en MikroC.






Simulation simplifiée



Le code écrit sous MikroC

48 commentaires :

Anonyme a dit…

ca fait longtemps que je cherche ce proge
vous pouvez expliquer cette partie du code
//Interruption
void interrupt() {
rafraichir++;
vitesse++;
tic++;

TMR0 = 0;
vois ce mon email rouiche12@gmail
merci

HeartyGFX a dit…

Bonsoir,

C'est assez délicat d'expliquer si l'on ne connait pas
le principe du fonctionnement du TIMER dans un PIC.

Il faut régler la temporisation du timer,
pour cela se référer au datasheet du PIC
que l'on utilise (le principe est le même
pour tous les PICs)

dans le Main()
ce sont les lignes

INTCON
et
OPTION_REG

Qui déterminent combien de fois par seconde
ce qui se trouve dans void interrupt() sera activé.

schématisons en prenant des chiffres simples,
imaginons, que j'ai calculé mon timer pour qu'il
se déclenche 20 fois par secondes.

La variable rafraichir située dans la fonction interrupt(),
en une seconde aura donc compté jusqu'à 20.

Je sais donc que pour avoir 1 seconde,
je dois vérifier que Rafraichir=20.

voilà comment je détermine le temps dans mon programme.

avec un if(rafraichir==40)

je test si j'ai bien 2 secondes qui sont passée.

j'espère que cela apportera plus de lumière

;)


rouiche a dit…

merci :)

HeartyGFX a dit…

Bonjour.

De rien,

à bientôt.

;)


Anonyme a dit…

bonsoir
j'ai une petite remarque
si la PORTA n'est pas utiliser pour
PORTA.F5=1<<i;

HeartyGFX a dit…

Bonjour,

Je n'avais pas bien compris la remarque,
en fait le pour = pourquoi.

En effet il s'agit simplement d'un bout de code
qui est là inutilement,
un reste d'expérimentation que j'ai omis
de nettoyer.

Cela ne dérange en rien le fonctionnement
du montage, mais ne sert à rien non plus...
On peut effacer cette ligne.

Merci pour la remarque.

à bientôt

;)


Anonyme a dit…

Bonjour,

je veux que le programme ce répété plusieurs fois d'affiche le message,

HeartyGFX a dit…

Bonjour,

Le message se répète tout seul,
automatiquement.

A bientôt,

;)


Anonyme a dit…

Bonjour,

je veux faire le boucle répété pour ce exemple et
si je peut mette une autre matrice !!!

merci :)))

HeartyGFX a dit…

Bonjour,

Comme vous pouvez le constater sur la vidéo,
le message tourne en boucle infinie.

Quant à ajouter une autre matrice il faut alors
aller sur le sujet, "journal lumineux à matrice de LED".

Vous pourrez alors ajouter autant de matrice que vous le désirerez.

A bientôt,

;)


HAFBAR a dit…

bonjour à tous ,
S'il vous plait HeartyGFX peut tu m'expliquer ce bout de code comment il fonctionne (les 3 test "if" qui se succèdent)je comprend leurs rôle mais je mes suis pas arrivé à saisir comment ça tourne ,merci pour votre aide :)

void arriere(){
if(rafraichir==40)
{
if(vitesse==600)
{
vitesse=0;
scroll1++;
}
if(i>=8)
{
i=0;
}
//PORTB = 0;
PORTB =~ASCII[i+scroll1];// inverser la sortie pour la simulation
PORTC=1<=753)
{
scroll1=0;
}
}
}

HeartyGFX a dit…

Bonjour,

pour comprendre le code,
il te faut décomposer posément comment les LEDs doivent agir.
Voici donc le raisonnement que je tiens.

Les LEDs doivent afficher un caractère.
prenons zéro par exemple:

0x00, 0x04, 0x02, 0x01, 0xFF, 0x00, 0x00, 0x00,


On envoi sur le port la séquence 0x00, 0x04 puis 0x02 et ainsi de suite...

C'est le if(i>8)
qui est là pour indiquer que la condition doit se faire sur 8 octets du tableau, puisque chaque caractère tient sur 8 octets.

Pour que l’œil puisse distinguer un caractère
nous devons répéter l'opération un certain nombre de fois par lettre.
et ceci à une certaine fréquence de rafraichissement (rafraichir).
Une fois que l'on distingue le caractère, celui-ci doit se déplacer au bout d'un certain temps (vitesse).

Voilà le principe.

Pour que tu puisses saisir cet algorithme,
isole chaque partie et teste la.

Déjà commence par afficher simplement un caractère.
Sans le faire se déplacer.

J'espère que cela t'aidera à comprendre cette partie majeure du code.

A bientôt,

;)


oualid a dit…

aucune idée common je peux ajouter le modèle UART a se projet?, je veux pas utiliser le tableax ASCII mais je veux transferet les caractere que je veux qu'il s'affiche via pc

s'il ya une solution ou un lien ou je peux telecharger le code source et le schéma

merci

HeartyGFX a dit…

Bonjour,

Oualid, les projets que je publie sont accompagnés des codes sources.
Cela permet à chacun de partir d'une base sur laquelle j'ai travaillé, ensuite à chacun de se prendre en main.
Vous comprendrez que je ne peux faire le travail pour les autres.
Utilisez les moteurs de recherche, lisez les documentations, et faites des essais.
C'est le seul conseil que je puisse donner.

Merci en tout cas de l’intérêt porté.

A bientôt,

;)


Anonyme a dit…

Bonjour ,
merci bien pour le grand travail que vous fait mais est-ce que c'est possible de télécharger le schéma de montage ISIS ?

HeartyGFX a dit…


Bonjour,

Pour si peu de composants je ne pense pas que vous ayez besoin de mon aide pour le dessiner sous ISIS.

Autrement prenez le schéma que j'ai mis dans la version du journal lumineux à 3 matrices.

A bientôt,

;)


Anonyme a dit…

bonjour,

merci pour le travail partagé.
j'ai un petit soucis, j'ai soudé les led en anodes communes pour les lignes et cathodes communes pour les colonnes, compilé et transféré le programme le texte défile de bas en haut, comment faire pour "pivoter" l'ensemble de 90° et que le texte défile droite à gauche ? j'ai interverti port B et C en soft et en hard et rien n'y fait. merci ;)

Anonyme a dit…

Re,

En fait plutôt que d'avoir souder les anodes sur le port b elles sont sur le port c, par contre je n'ai rien changé au programme et ça marche mais défilement de bas en haut sur ma matrice. est il possible en changeant quelque chose de la programme de remettre tout ça dans le bon sens ? merci

HeartyGFX a dit…


Bonsoir,

étant complètement sur autre chose actuellement, je n'ai plus vraiment l'algorithme en tête pour répondre précisément, mais il y a évidemment possibilité de modifier le code pour défiler horizontalement, quelque soit l'orientation choisie physiquement pour la matrice.

Il faut juste respecter les ports mais également la polarité de sortie.

Le tilde " ~ " pour inverser le bit de sortie.

Je suis désolé de ne pouvoir en dire plus, ce code date d'il y a 3 ans maintenant et pour répondre avec précision, il me faudrait replonger dans le mécanisme que j'avais mis au point, ce qui n'est pas évident lorsqu'on est sur autre chose.

J'espère que cela pourra aider.

;)


Anonyme a dit…

Bonjour,

Je ne suis malheureusement pas parvenu à changer l'affectation ligne/colonnes.
même en inversant avec ~, je pense qu'il faut inverser quelque chose au niveau de PORTC=1<<i
que fait cette ligne ?

merci

HeartyGFX a dit…


Cette ligne décale vers la gauche les bits de l'octet.

00000001 devient 00000010

;)


Anonyme a dit…

ah ok, je pensais que ça faisais un *2 de l'octet, donc un décalage à gauche, j'étais pas sûr. merci.
mon problème est tout bête alors il faudrait que je puisse inverser la logique avoir
11111110 puis 11111101 je pense que c'est tout simplement ça le problème parce que lorsque j'interverti les port c et d la matrice s'allume totalement : 64 leds !!

je ne sais pas ou mettre le ~ dans la ligne portc=1<<i

merci

Anonyme a dit…

Bonjour ,
je me demande au niveau d'horloge on met une horloge (quartz) ou il a son horloge interne qui est définie ???
merciiiiii

HeartyGFX a dit…


Bonsoir,

en effet lors de la simulation sur ISIS je n'ai pas placé de quartz, ce n'est pas nécessaire pour faire de rapide essais de code.

Mais en test réel en général avec le 16F876 j'utilise un quartz de 20MHz.

Ceci dit, dans la simulation, le processeur est cadencé dans les options à 20MHz.

A bientôt,

;)


ridha noommane a dit…

Bonsoir ;
j'ai fait le montage et le circuit il a marché correctement mais quand il affiche le dollar le circuit éteint et quand je coupe le source de tension et le mettre la même problème ..... merci de m'aider.
:)

HeartyGFX a dit…

Bonsoir,

Je n'ai aucune idée de votre problème.

Si votre câblage est correct cela ne devait pas se produire, comme en témoigne la vidéo le défilement se fait en boucle.

Essayez de mettre un condensateur de 100nF aux +5V et Gnd le plus près possible des broches d'alimentation du PIC, pour éliminer d'éventuelles parasites qui perturberaient le µcontroleur.

;)


Anonyme a dit…

Bonjour, cher Mr, à quoi sa sert la variable tic?????
merci bcp

HeartyGFX a dit…


Bonsoir,

Elle ne sert à rien, c'est un élément qui a échappé au nettoyage du code final.
C'était une variable qui me servait lors de mes essais.

A bientôt,

;)


Anonyme a dit…

ya3tik essa7a :D

obh oma a dit…

est ce que il y a une differance entre la matrix 8*8 vert et la rouge

HeartyGFX a dit…


Bonjour,

et bonne année 2014.

Il faudra juste vérifier le (Vf) de la LED, qui changera (de peu) la valeur de la résistance de limitation.
Cette valeur vous sera fourni dans les specs constructeur de l'afficheur.

Autrement, non, aucune différence.

;)


Marc P. a dit…

Bonjour HeartyGFX!
Est-ce que les colonnes sont des anodes ou des cathodes?

A+!
marC:)

HeartyGFX a dit…


Bonjour,

A vrai dire, je ne sais plus quel type de matrice j'ai utilisé, anodes ou cathodes communes, ces expérimentations commençant à dater quelque peu.

Il suffit de tester, soit en simulation soit en circuit réel, l'affichage se fera dans un sens ou dans l'autre, sans craindre pour le circuit.

;)


naceur zied a dit…

BONSOIR
svp est que on peut implanter le module bluetooth a une enseigne lumineuses et comment peut on reagir avec le programme avec cette modification

HeartyGFX a dit…


Bonsoir,

Le module Bluetooth se contrôle comme un port série.
Utilisez la chaine de caractère reçue via le RS232 qui sera indexée par rapport au tableau des caractère ASCII et utiliser la routine d'affichage comme montré plus haut.

Un exemple sur le blog traite sur le sujet du port série il suffit de s'en inspirer.

;)


Anonyme a dit…

bonsoir Hearty. j' apprecie ta conception. stp j'aimerais savoir avec quel version de proteus a tu dessiner et simuler ce montage.

Marc P. a dit…

Ça marche bien! mais la fonction avant n'est pas fonctionnelle?

Merci!
A+!
marC:)

HeartyGFX a dit…


Bonjour,

La fonction avant est mise en commentaire.
Pour activer la fonction avant, il faut mettre en commentaire arrière et dé-commenter avant.

Cet exercice est avant tout démonstratif, pas une version finalisée où l'on devra appeler avant ou arrière selon un cycle ou appel particulier que l'on aura codé en fonction de ses besoins.

;)


Marc P. a dit…

Salut :)
Le scrooling arrière est parfait, mais celui de l'avant, ne fonctionne pas :(

pouvez-vous m'aider?

merci bien!
A+!
marC:)

Marc P. a dit…

Salut! :)
Il y a des lettres à l'envers, comme le R, le K, le L.
c'est dû à quoi?

Merci beaucoup!!! :)
A+!
MarC :)

HeartyGFX a dit…


Bonjour,

Toutes les lettres doivent être inversées ou aucune.
Il ne peut y en avoir juste quelques unes.
Quoiqu'il en soit, le code étant bon, ce doit être votre câblage
qui est inversé ports 76543210 au lieu de 01234567.

;)


HeartyGFX a dit…


Il faut être plus précis concernant le problème du scrolling.
Le code fonctionne, c'est donc que vous avez mal tapé quelque chose, je ne peux le deviner sans voir ce que vous avez fait.

Il faut simplement mettre en commentaire la fonction Arriere
et enlever le commentaire de la fonction avant.

------------------------------
arriere(); // Appel de la fonction Arrière
// avant(); // Appel de la fonction Avant
------------------------------

devient

-----------------------------
//arriere(); // Appel de la fonction Arrière
avant(); // Appel de la fonction Avant
---------------------------

;)


Marc P. a dit…

Re-bonjour :)
Si je veux ecrire Marc, combiens d'octets comporte le tableau?
32?
Comment faites-vous pour le calculer?
Merci infiniment.
A+!
Marc.

Marc P. a dit…

J'ai mis colonne 1 rb0, col 2 rb1, col 3 rb2, col 4 rb3, col 5 rb4, col 6, rb5, col 7 rb6, col 8 rb7.
Est-ce correct?
Merci encore.
Marc.

HeartyGFX a dit…


Bonjour,

8 octets par caractère.
Donc effectivement 4 lettres = 32 octets.

Concernant les lettres inversées, encore une fois le code fonctionne, donc votre câblage est inversé.
Ce qui pour vous est colonne 1 doit être la 8.

Inversez et vérifiez c'est la seule façon de répondre à votre question.

;)





Marc P. a dit…

Merci beaucoup de prendre le temps de répondre à mes questions :-)

Bonne fin de soirée! :)
A+!
marC:)

Anonyme a dit…

tout d'abord merci pour vos publications extraordinaires qui m'aident beaucoup à entamer l'électronique numérique. Pour ce programme édité, est-ce que vous pouvez m'expliquer le choix des valeurs affectés à "vitesse" et "rafraichir" et selon quelles données puis-je agir pour fixer des nouvelles valeurs à ces paramètres.
Merci encore.

HeartyGFX a dit…


Bonsoir,

Navré pour le retard de la réponse.

J'ai tenté d'apporter une réponse dans les commentaires précédents.

Pour bien comprendre l'explication donnée, il vous faut procéder par étape.
En premier lieu tentez d'afficher un caractère statique.

Vous comprendrez alors le code source, ainsi que le complément d'information dans les commentaires.

Lorsque vous saurez afficher un caractère, il vous sera facile de comprendre l’algorithme utilisé, ainsi que les temporisations.

Merci pour votre commentaire.

;)