(Loading...)

dimanche 18 juillet 2010

PIC16F876A 74HC595

Expérimentation d'une démultiplication de port de PIC via circuit 74HC595.

L'adjonction de circuit externe type registre à décalage 74HC595 , convertisseur série/parallèle, permet d'économiser les ports utilisés par le PIC, libérant ainsi ces derniers pour d'autres fonctions.
Seulement 3 ports du µcontrôleur sont utilisés pour gérer 8 sorties, et plus encore en chainant en cascade d'autres 74HC595.




Dans l'expérience qui suit, 3 circuits de registres à décalages seront utilisés, ce qui nous donne 24 sorties gérées par seulement 3 ports.

Le schéma présenté tel quel, permet de réaliser un chenillard 24 LEDs.









Explication sur cette portion:

HC595_0=sequence[i*3]; 
HC595_1=sequence[(i*3)+1]; 
HC595_2=sequence[(i*3)+2];

Pourquoi multiplier i par 3.


Pour comprendre, il suffit de regarder l'illustration ci-contre. Les octets du tableau se lisent de gauche à droite en partant du haut.
3 octets par ligne correspondants, chacun, à un circuit 595.
La première valeur d'un tableau a pour index, O (zéro).


La premier colonne correspond aux octets envoyés au premier circuit, la seconde au second etc...
Les index de la première colonne sont "0,3,6,9,12...." , la seconde "1,4,7,10,..." et ainsi de suite.
Dans le code la variable de comptage "i" commence à zéro et compte jusqu'au dernier octet du tableau. 
Si le tableau comprend 200 octets, "i" sera modifié en conséquence.

Maintenant on peut comprendre qu'en reprenant les variables énoncées plus haut, à savoir par exemple:
HC595_0=sequence[i*3]; on appelle dans le tableau sequence l'index 
(pour i=0) 0*3=0 
(pour i=1) 1*3=3
(pour i=2) 2*3=6 

Voilà, quant aux autres variables il suffira d'ajouter respectivement, +1 et +2 pour avoir les valeurs d'index adaptées. 
CQFD. 


Cette expérience me permet de préparer deux futures applications:

- La gestion de matrice de LED 8x8 en économisant le nombre de port utilisés.
- Un afficheur à persistance rétinienne.

Edit 2013:

Fichier ISIS et code source MikroC Pro ainsi que le fichier compilé.

L'archive de ce projet est mise à jour sous MikroC Pro 4.15 avec la nouvelle syntaxe de déclaration des fonctions SPI.
Vous constaterez donc une petite différence entre le source publié sur l'article et le source fourni dans l'archive.



16 commentaires :

Anonyme a dit…

Bonjour HeartyGFX,
Je comprend pas comment la fonction Spi_Write accepte HC595_0 HC595_1 HC595_2 comme paramètre sachant qu'ils sont déclarés comme char et comment on peut remplir un tableau de char avec des nombres binaires? et pourquoi ne pas déclarer un tableau de chort ??!! merci pour votre aide :)
*******************
char HC595_0,HC595_1,HC595_2;

void send_data(char HC595_0, char HC595_1, char HC595_2)
{
Spi_Write(HC595_0); // données premier circuit
Spi_Write(HC595_1); // données deuxième circuit
Spi_Write(HC595_2); // données troisième circuit
PORTC.F6=1; // impulsion de validation sur LATCH
PORTC.F6=0;
}

HeartyGFX a dit…

Bonjour,

L'utilisation de type short aurait été plus judicieuse en effet, consommant moins de place.

Cependant mon choix de déclarer en char est simple.

La doc de MikroC indique l'utilisation de char,
avec la fonction SPI, je suis donc resté sur des char.
J'avoue ne pas avoir cherché plus loin
en utilisant des variables d'un autre type.

Essayez donc pour voir ce que cela donne, et tenez moi au courant.

Merci de votre intérêt.

A bientôt,

;)


farido a dit…

Bonjour HeartyGFX
tu peut m'aider a construire ma propre matrice (64 colonnes , 7 lignes )qui contient un texte fixe et mercie d'avance mais le texte écrit sur la matrice doit tapeé par un clavier de PC

HeartyGFX a dit…

Bonsoir,

Navré, je manque déjà de temps pour mes propres projets.
Il y a sur le blog suffisamment d'informations accompagnées de codes source pour pouvoir réaliser le projet demandé.
95% du travail est déjà fait.

Merci de la visite.

A bientôt,

;)


Anonyme a dit…

BONJOUR
je veut savoir comment réaliser des opérations multitâches avec un pic?
par exemple j'ai un ascenseur pédagogique de 3 étages
la commande et par pic 16f877, et chaque étage a son bouton d'appel. je veut mémoriser l'état de l'appui sur les boutons pour la gestion des priorités des appels, tout ça au moment où la cabine et entrain de monter ou descendre
merci d'anavce

HeartyGFX a dit…

Bonjour,

Le seul moyen à ma connaissance d'avoir un semblant de multitâche
sur un µcontroleur de cette gamme est d'utiliser les interruptions.
Il suffit de lire la DataSheet (sur le site MicroChip) du 877 pour connaitre les registres concernés et configurer la temporisation adéquate de la boucle d'interruption.
Et dans cette boucle, exécuter les fonctions prioritaires.

Si vous utilisez Mikroc en compilateur, la doc est bien fournie en exemples concernant l'usage des boucles d'interruption.


A bientôt,

;)


Unknown a dit…

salut!
pouvez vous m'aider s'il vous plait?
je veux cette commande en PicC au lieu de MikroC:

//Paramètre de configuration des ports pour la gestion du 74HC595
Spi_Init_Advanced(MASTER_OSC_DIV16,DATA_SAMPLE_MIDDLE,CLK_IDLE_LOW,LOW_2_HIGH);

//******************************************************************************

Merci :)

HeartyGFX a dit…


Bonsoir,

Wael, je ne connais pas les spécificités de PICC, il faut regarder dans la doc si ce compilateur intègre une librairie de gestion SPI.

Autrement, il faut lire la DOC du PIC pour paramétrer correctement le timing du SPI.


Voici des liens qui te permettront de comprendre le fonctionnement et de mettre en place ta routine.

http://microchippiclessons.blogspot.fr/2009/06/spi-tutorial.html

http://www.mikroe.com/esupport/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=150#spi1_init_advanced

http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf

Je ne pourrais t'en dire plus, j'ai justement choisis MikroC pour ses bibliothèques qui simplifient la programmation.

J'espère que cela t'aidera un peu.

A bientôt,

;)


Unknown a dit…

men en español tu tutorial

Unknown a dit…

man mas proyectos con pic panel de led de 16x16 o matrix

HeartyGFX a dit…


Hola,

Tiene un botón de traducir a la izquierda de la página.
No tiene una pantalla de 16x16, pero el principio es el mismo que 8x8.

Saludos,

;)


Unknown a dit…

Salut HeartyGFX

S'il vous plait pouvez vous m'aider en me donnant un exemple pour l'interruption externe par la pin RB0 avec le MikroC???

HeartyGFX a dit…


Bonjour,

Le code source de l'article "Capteur à effet hall" est un parfait exemple d'une interruption externe sur RB0.

;)


MPElectronique a dit…

Salut HeartyGFX! Toujours intéressant vos tutoriels, j'apprends toujours quelque chose. Comment avez-vous faire pour faire tourner votre POV? comment montez-vous le moteur et tout? avez-vous des photos?

merci beaucoup!
A+!
marC:)

HeartyGFX a dit…


Bonsoir,

Le montage POV en vidéo, que vous avez certainement vu dans l'article consacré est une réalisation de deux visiteurs de ce blog.
Ils sont simplement utilisé le code que je fournis.

Généralement ce type de montage lorsque l'on veut faire simple,
est de réaliser un circuit imprimé avec les composants, la pile, et les LEDs (à plat ou à angle droit), puis ce circuit est fixé sur l'axe moteur, comme une pale d'hélice.

comme suit, (la photo n'est pas de moi juste un exemple pris sur Google)

http://letsmakerobots.com/files/field_primary_image/100_0116.JPG

Une petite recherche sur Google vous montrera de nombreux exemples de réalisations qui pourront vous inspirer.

De mon coté je voulais juste développer un code simple afin de valider quelques algorithme que j'avais en tête.
Je n'ai toujours pas réalisé de montage finalisé, mais si je le faisais un jour, ce serait sur des roues de vélo.
Faites une recherche, Wheel pov display, ou Bike pov display, vous verrez de nombreux exemple de montage que vous pouvez réaliser avec ce code.

A bientôt,

;)



MPElectronique a dit…

Merci pour tes postes! :)
Pourriez-vous me donner une piste pour drivers des 7 segments avec des 74HC595 ?

Merci beaucoup!
A+!
marC:)