Aller au contenu


Information tutoriel

  • Ajouté le: mars 03 2010 03:35
  • Date Updated: sept. 15 2014 11:55
  • Lectures: 28515
 


* * * * *
1 Notes

Programmation d'un microcontroleur 16F84

Posté par CactO_o's on mars 03 2010 03:35
Présentation


Voilà un méga tuto sur la programmation de microcontrôleur [PIC]. Ce composant est essentiel pour la robotique.
Il permet d'insérer un programme en C (assez spécial) afin de gérer le robot.
Ce tuto vous permettra de traiter tous les points pour commencer dans la programmation de microcontrôleurs.

Image IPBLe tuto est actuellement en attente car je manque énormement de temps.
J'espère pouvoir reprendre au plus vite.


  Introduction


Pourquoi la programmation

Programmation ? Ici ?

Vous êtes sûrement pour les plus débutants d'entre vous en train de vous dire : "Mais je croyais que la programmation c'était sur un ordinateur, c'était pour faire des logiciels, pourquoi il vient nous faire un tuto de programmation ici alors que je suis sur un site de robotique."

C'est peut-être tout nouveau pour vous mais vous venez d'apprendre qu'on peut compléter un circuit électrique avec un (ou plusieurs) programme(s).

Pourquoi un programme dans un circuit électrique

Bien, maintenant tout le monde sait qu'il est possible de faire un programme dans un circuit électrique. C'est bien mais ça sert à quoi ?

A beaucoup de choses ! Grâce à un programme vous pourrez gérer une intelligence à votre robot. Celui-ci sera doté d'une capacité à réagir en fonction d'évènements, il pourra gérer le temps, etc...

Je ne suis pas en train de vous dire que vous révolutionnerez l'IA à la fin de ce tuto. Mais croyez-moi vous trouverez ça très interessant après avoir vu les possibilités .

Grace à ce petit microcontroleur vous serez capable d'envoyer des information sous forme binaire (0 ou 1) en fonction des informations (binaire aussi) que vous recevez.


Comment faire ?

Avec un microcontrôleur

Un microcontrôleur est une petite puce qui contiendra le programme. Il en existe vraiment de toutes sortes. On peux le voir ici sur les photos :

Image IPB

Nous allons plutôt nous intéresser à la famille des PIC de Microchip. Voilà deux-trois composants répondant à ce nom :

Image IPB

Quelles sont les caractéristiques des différents PIC ?


10Fxx/12Fxx

Ceux-ci sont récents. Ils ont la particularité d'être petits et très simples.

16Cxx/16Fxx

Ce sont les plus fournis, ils forment le milieu de gamme de la lignée.

17Cxx

PIC faisant la liaison entre les 16xxx et 18xxx, il sont très peu répandus.

18Cxx/18Fxx

Cette famille est la plus complète de la série. Elle peut comporter jusqu'à 75 instructions et peut être compilée en C de façon largement plus efficace que les versions précédentes.

24Fxx

La petite nouveauté de Microchip sortie en 2004, ils sont les plus puissants des PICs.

Nous allons étudier ici le PIC16F84. Car c'est le plus répandu et donc le plus simple à apprendre. Je tiens à préciser que le PIC16F84 et le PIC16F84A sont identiques, vous pourrez donc utiliser les deux après avoir suivi ce tuto.

Image IPB

Essayons déjà de comprendre pourquoi 16F84 :

16xxx

Cette première partie nous informe sur la famille du PIC, le 16 nous donne pour information que le PIC travaille sur des mots de 14 bits.

xxFxx

Cette lettre nous indique le type de mémoire utilisée: ici, la lettre F indique l'utilisation du Flash. Ce type de mémoire peut être écrit et effacé 1000fois.
Vous pourrez aussi trouver des xxCxx pour la mémoire Eprom ou des xxCRxx pour une mémoire Rom.

xxx84

Ce nombre nous permet d'identifier précisement le PIC.

xxxxx-04

Ce nombre, pas toujours présent, vous informe sur la fréquence d'horloge du microcontrôleur. Vous trouverez surtout des Pic 16F84-04 qui fonctionnent donc en 4Mhz. Il existe aussi des 16F84-10 qui fonctionnent eux à 10Mhz, mais aussi à n'importe quelle fréquence inférieure.

Autres matos


Comme vous l'avez sûrement deviné, il ne vous faudra pas QUE votre microcontrôleur pour le faire fonctionner. Et oui, vous n'allez quand même pas taper sur les pattes du composant pour le programmer ^^

L'ordi

Bon je pense que j'ai besoin de vous expliquer davantage ce que c'est, j'espère au moins que tout le monde ici sait ce que c'est qu'un ordinateur.

Le programmateur

Celui-ci prend la forme d'une petite carte que vous pouvez acheter ou faire vous-même (je vais essayer de vous trouver des plans que je rendrai disponibles dans le chapitre consacré à l'électronique).

Pour ceux qui préfèrent en acheter un pour moins de problèmes vous pouvez prendre un programmateur Universel de Microchip comme le Programmateur PIC-01.
Vous pourrez le trouver pour 60€ sur conrad [ ref : 064246-62 ](penser à rajouter quelques euros pour un adaptateur secteur si vous n'en avez pas [ ref : 518318-62 ]).
En ce qui concerne ce programmateur, il s'agit de lui :

Image IPB

Les circuits annexes

Afin de faire fonctionner votre microcontrôleur, il vous faudra rajouter à côté 2-3 petits montages électriques.
Je vais vous les décrir rapidement ici puis nous les verront plus amplement plus tard.

Voici les montages :

  • un régulateur de tension : Permet au PIC de recevoir une alimentation très stable afin de ne pas le faire griller.
  • une horloge : Afin d'utiliser le temps dans vos programmes (des arrêts par exemple).
  • un reset : Remet à Zéro le PIC à chaque mise en tension.

Voilà, ce chapitre prend fin ici. Nous allons maintenant nous intéresser à la partie électrique des microcontrôleurs.


  Le microcontrôleur


Les broches du PIC 16F84

Afin de commencer notre étude sur la partie électrique du tuto, nous allons nous pencher sur le microcontrôleur lui-même pour ensuite étudier les circuits annexes.

Le PIC 16F84 possède 18 brôches. Nous allons voir leurs utilités :

Image IPB

Voilà la schématisation du PIC, on remarque plusieurs sortes de bornes :

  • VDD et VSS: Borne d'alimentation +5V et 0V. C'est ici que seront branchés le régulateur de tension et la masse. Certaines personnes mettent entre 3.5 et 5.5V; personnellement, je préfère mettre 5.0V exactement pour ne jamais avoir de souci.
  • MCLR : "Reset" du circuit.
  • OSC1 et OSC2 : Brôches reçevant le montage horloge.
  • RA0 à RA4 : Port d'E/S A.
  • RB0 à RB7 : Port d'E/S B.

Insistons sur les 2 ports d'E/S. Le port A comporte 5 brôches et le port B 8 brôches.
Ce qui nous fait en totalité pour le PIC16F84 13 E/S.

C'est bien beau tous ces E/S mais c'est quoi ?

Ils forment les entrées/sorties du PIC, c'est grâce à eux que vous communiquerez des informations de l'extérieur au PIC (entrée) et que le PIC donnera des infomations (sortie).

Pour donner une information au pic, il faudra envoyer à une entrée soit du 0V, que le PIC comprendra comme un 0 logique, soit du +5V, qu'il comprendra comme un 1 logique.

En ce qui concerne des sorties c'est la même utilisation, si vous dites à votre PIC d'envoyer un 1 logique, il sortira +5V et et si vous demandez un 0 logique, il vous sortira bien evidemment ... 0V.

Bon maintenant, vous savez théoriquement comment marchent les ports E/S.
Pour ce qui concerne la définition des entrées et des sorties, c'est comme vous le sentez, tout le PIC peut être en entrée (ce qui ne sert à rien) ou alors en sortie (ici il se gère tout seul). Mais on verra cela lors de la programmation du microcontrôleur.

Il nous reste un dernier point à étudier sur l'électronique du microcontrôleur: l'ampérage et le voltage des bornes du PIC.

Pour ce qui concerne le VDD et le VSS, on en a déjà parlé plus haut, pas la peine de revenir dessus.
Pour les broches MCLR, OSC1 et OSC2, le montage dans la partie suivante fera tout le boulot à votre place.

En fait, comme vous pouvez le voir je veux essentiellement vous parler de l'ampérage et du voltage dans les ports E/S. Car c'est eux que vous allez utiliser le plus fréquemment.

(V) et (A) dans les entrées

Il faut savoir que les microcontrôleurs sont compatibles TTL et CMOS, mais ne sont pas idéals.

Image IPBPour tous ceux qui ne connaissent pas la technologie TTL et CMOS, je vous conseil d'aller voir le tuto d'4Aklisme : [Technologie] TTL et CMOS

Je m'explique sur ce schéma :

Image IPB

On voit sur le diagramme le plus à gauche le niveau logique idéal d'un microcontrôleur : un passage à 50%.
En gros, pour envoyer un niveau logique 0 il faut envoyer entre 0V et +50%VDD, et pour envoyer un niveau logique 1, il faut envoyer entre +50%VDD et VDD.
Dans notre cas, l'intervalle 0V à +2.5V formerait un niveau logique 0 et l'intervalle +2.5V et +5V formerait un niveau logique 1.

Dans la réalité les niveaux logiques suivent plutôt cette loi :

Image IPB

Nous le voyons ici, les niveaux logiques ne sont pas parfaits. Ce qui arrive à provoquer quelques erreurs. Regardez à nouveau le schéma avec les diagrammes, vous pouvez remarquer une partie blanche entre l'état logique 0 et l'état logique 1.

Cette zone est non définie, c'est à dire que vous ne saurez jamais si vous tombez sur l'état logique 0 ou 1...

Nous allons prendre un exemple pour comprendre le problème.
Voici le but de l'exercice : Envoyer un signal au microcontrôleur sur la broche RA0 (définie dans le programme comme une entrée) lorsque l'utilisateur active un interrupteur mécanique.

Voici un schéma de réalisation possible :

Image IPB

Ici, on voit que si l'utilisateur active le bouton, les 5V vont jusqu'à la borne RA0 et l'information est envoyée au PIC. Maintenant, regardons le cas où l'utilisateur n'active pas le bouton: il y a ce qu'on appelle une "pâte en l'air". Et si vous approchez le doigt par exemple, un faible court-circuit peut se créer et le PIC peut le comprendre comme une information ! L'utilisateur n'aura jamais appuyé sur le bouton, mais le PIC aura quand même reçu cette information.
Je vous assure que c'est une très bonne manière de galérer des heures en cherchant l'erreur dans le programme ou dans le circuit alors que ce n'est que ça.

La bonne solution est de brancher la borne à la masse de cette manière :

Image IPB

Ici lorsque l'utilisateur active le bouton, les 5V vont directement dans le microcontrôleur, mais la masse évite d'avoir une "pâte en l'air" provoquant des disfonctionnements.

Voilà, vous savez tout pour ce qui concerne les Entrées des broches E/S du microcontrôleur. Sachez avant d'attaquer que les sorties d'un port en entrée absorbent une intensité inférieure ou égale à 20mA.

(V) et (A) dans les sorties

Vous aurez à utiliser les sorties comme de simples sources de tension 5V.
C'est en fonction de votre programme que la sortie sera en état logique 1 (source de tension à +5V), ou en état logique 0 (source de tension à 0V).

Le problème se pose ici plutôt sur l'ampérage :

Image IPB

Nous voyons sur ce tableau les limites de courant que le microcontrôleur peut débiter.

Pour comprendre nous allons décortiquer le portA. Si je ne regarde qu'une seul broche du port qui est en sortie je ne peux pas envoyer plus de 20mA. Simplement si j'utilise toutes les broches du PortA en sortie et qu'elle sont toutes en état logique 1 en même temps (chacune devrait envoyer un signal de +5V pour 20mA) simplement :

5x 20mA = 100mA

On remarque ici un problème : le portA entier ne peut débiter que 50mA à la fois... Il y aura donc des baisses d'intensité sur certaines brôches du port.

Afin de comprendre le problème essayons d'allumer 8 DELs grâce au port B (qui possède 8 broches d'E/S).
En y réfléchissant, le plus intelligent serait de mettre une DEL/broche en les configurants tous en sortie.
De plus, on sait que les DELs consomment 2.1V pour 20mA.

Il faudrait donc protéger chaque DEL par une résistance à calculer :

VDD=5V
U^DEL=2.1V
I=20mA

Image IPB

on voit donc clairement ici que :

U^RES = VDD-U^DEL
U^RES = 5-2.1


Sachant aussi que :

U = R.I

Donc :

R=U^RES/I
R=2.9/0.020
R=145

Image IPBPour toutes les personnes qui ne comprennent pas, je vous renvoi sur le tuto de culte : Calculer la résistance d'une LED (DEL)

On a donc notre résistance, que l'on met pour chaque DEL, et on trouve bien le circuit ci-dessous :

Image IPB

Et au moment de tout allumer, ça marche pas.. Et oui :

8x 20mA : 160mA

Or le port B ne peut débiter que 100mA dans sa totalité...
Comment faire ? Une solution serait de mettre 2 DELs par broches et de n'utiliser que 4 broches.

Image IPB

Cette solution est possible car :

2.1 + 2.1 = 4.2, ce qui est inférieur à la source de 5V.

Il faudrait par contre prendre une nouvelle résistance :

U^RES = VDD - U^DEL1 - U^DEL2
U^RES = 5 - 2.1 - 2.1
U^RES = 0.8

Sachant aussi que :

U = R.I

Donc :

R = U^RES/I
R = 0.8/0.020
R = 40

Ce qui donnerait le schéma électrique :

Image IPB

Il faudra ici n'activer que RB0, RB1, RB2 et RB3, ce qui n'en donne que 4 sorties :

4 x 20mA = 80mA

Le port B est donc capable d'allumer les 8 DELs de cette manière.

Cette étude prend fin ici.
À suivre : Les montages associés.

  Les montages associés


Nous allons voir dans ce chapitre les 3 montages nécessaires pour le fonctionnement du microcontrôleur :
Régulateur de tension

Image IPBJ'ai créé en annexe un tuto sur les régulateurs de tension, si vous ne les connaissez pas je vous conseil de vous rendre sur le tuto : [Composant] Les régulateurs de tension.

Je rappelle le schéma du régulateur ici :

Image IPB

Le +5V doit être brancher au VDD du microcontrôleur (broche 14).

Pensez bien que Vin doit être supérieur à 7V mais inférieur à 25V.

L'horloge

L'horloge externe fonctionne grâce à 2 Condensateurs 27pF et un Quartz 4Mhz (16F84-04).

Image IPB

Pour finir : Le reset

Il existe ici plusieurs sortes de reset à utiliser comme bon vous semble. La première technique consiste à brancher simplement la broche /MCLR au VDD. Comme ça à l'alimentation, le courant sera envoyer à la borne formant un reset.
On rencontre par contre plusieurs problèmes en utilisant ce reset :
 
  • il faut une alimentation à exécution rapide (les +5V doivent être atteint rapidement)
  • si vous voulez remettre le microcontroleur à zéro il vous faudra couper l'alimentation.

Une autre solution de reset peut être utilisé :

Image IPB

Cette solution peut être utiliser n'importe quand et résoud les problèmes vu précédemment.

La partie en bleu permet de pouvoir faire un reset manuel (appuis sur le bouton). Cette partie peut être supprimer si vous n'en avez pas l'utilité.

Conclusion

Pour conclure, je vous ai fait un schéma regroupant tout le chapitre :

Image IPB


Image IPBTutoriel terminer à seulement 15% !


Image IPBLe tuto est actuellement en attente car je manque enormement de temps.
J'espere pouvoir reprendre au plus vite.