Dernière mise à jour :
02/12/2012
Présentation
L'envie de réaliser un montage électronique qui
comporte un composant programmable est parfois de nature à rebuter le
débutant. Certains de mes montages comportent un
PIC, microcontrôleur qui fait partie des composants programmables
et qui ne
peut rien faire tant qu'il n'est pas programmé (préparé à
accomplir
les tâches qu'on attend de lui). Pour mes montages, je propose un
service
gratuit de programmation de PIC, dont les détails sont donnés à la
page
Service - Programmation microcontrôleurs.
Pour ceux qui veulent programmer eux-même un PIC avec le fichier
binaire compilé *.hex que je mets à disposition sur mon site, il
convient de suivre
les recommandations et conseils que je donne ci-après. En cas de
soucis, il faudra approfondir ses recherches côté matériel,
car le problème n'est pas
forcément logiciel.
J'utilise vos fichiers hex et ça ne marche pas !
Il existe
dans la nature une multitude de programmateurs de PIC, commercialisés
ou faits maison. Certains fonctionnent bien avec certains PIC et
pas (ou mal) avec d'autres. La première chose à faire est de s'assurer
que le PIC que vous voulez programmé est bien dans la liste de ceux qui
sont supporté par votre programmmateur.
Si ce dernier dispose de plusieurs supports de tailles
diverses, il y a de fortes chances qu'il puisse programmer un grand
nombre de références. S'il ne possède qu'un seul support (par exemple
un support à 18 broches) le nombre de composants supportés sera
forcement
plus faible. Je ne peux en aucune manière garantir à 100%
que les fichiers *.hex compilés que je mets à disposition sur mon site
conduiront à un
fonctionnement sûr avec votre programmateur, même si un fichier
*.hex
est censé coller à un standard reconnu et accepté par
le plus grand nombre de programmateurs. J'ai plusieurs types de retours
de la part de ceux qui ont programmé eux-mêmes un PIC avec mes fichiers
compilés :
1 - Ca
fonctionne, merci !
2 -
Impossible de programmer le PIC, merci de m'aider.
3 - La
programmation s'est bien déroulée mais le PIC ne tourne pas (ou il ne tourne pas à la bonne vitesse).
4
- L'oscillateur est capricieux : soit il ne démarre pas du tout, soit il démarre
occasionnellement, soit il démarre et s'arrête sans
raison.
Voici ce que je peux dire en réponse à ces messages :
1 - Ca
fonctionne ? J'en suis ravi, et je vous remercie pour votre retour
positif !
2 -
Impossible de programmer le PIC ? Là je ne peux pas grand chose, il
faut lire le mode d'emploi de votre programmateur.
3 -
Programmation OK mais déroulement programme inattendu ? Il y a 95% de
chances que le problème vienne de la configuration des fusibles,
notamment celui du reset général (MCLR) ou ceux liés aux modes
d'horloge (CLOCK / CLK).
4
- Probablement un problème lié aux composants utilisés ou aux
connexions (pistes CI inadéquates ou fils de câblage trop longs).
Les
lignes qui suivent énumèrent les points à vérifier en premier, causes les plus fréquentes de mauvais fonctionnement.
Remarque
- Les
fichiers .*hex que je mets à disposition comportent des informations de
configuration (MCLR, OSC, etc). Certains programmateurs en tiennent
compte et au final ça doit fonctionner sans que vous ayez besoin de les
spécifier manuellement (à vérifier par précaution). Si votre programmateur ne tient pas compte de ces
informations, vous devrez les spécifier manuellement, c'est pourquoi
vous devez savoir à quoi ils se rapportent, les lignes qui suivent en
parlent pour ça.
- Je ne connais pas d'autres programmateurs que
ceux que j'utilise (EasyPic7, MikroProg, PICkit2 et PICkit3), aussi merci de ne pas me demander comment configurer le votre.
Faites l'effort de chercher un peu dans le manuel utilisateur qui
existe forcement.
Configuration MCLR (Master Clear, remise à zéro)
La
broche MCLR peut avoir deux fonctions qui sont définies par un
"fusible" (FUSE en anglais) appelé à juste titre MCLR et qui peut
prendre deux valeurs, ON ou OFF.
- Si
MCLR = ON, cela signifie que la broche est utilisée en tant que broche
de remise à zéro. Cette broche fonctionne selon une logique "négative",
le reset est actif à l'état logique bas et le microcontrôleur tourne
normalement avec un état logique haut. Tant que cette broche est placée
à l'état logique bas le programme du PIC ne tourne pas, et dès qu'elle
passe à l'état logique haut le programme démarre.
- Si
MCLR = OFF, cela signifie que la broche est utilisée en tant que broche
d'entrée/sortie logique standard (le plus souvent en entrée seulement).
Le programme du PIC commence donc à tourner dès la mise sous tension du
composant, sans tenir compte de l'état logique de cette broche.
On peut se trouver en présence de trois cas de figure possibles, selon l'usage du PIC et de ce qui l'entoure :
- soit
cette broche MCLR sert de broche de remise à zéro, pour permettre à
tout instant une réinitialisation complète du microcontrôleur - en
général avec un bouton poussoir. Dans ce cas vous devez spécifier
qu'elle doit être utilisée en broche
de reset (MCLR=ON).
- soit cette broche sert d'entrée logique standard. Dans ce cas
vous devez spécifier que la broche MCLR est utilisée comme "entrée/sortie" (MCLR=OFF).
- soit cette broche n'est pas du tout utilisée. Dans ce
cas deux solutions possibles :
- spécifier la broche MCLR comme "entrée/sortie" (MCLR=OFF) et ne la relier à rien.
- spécifier la broche MCLR comme broche
de reset (MCLR=ON) et la relier en permanence au
+alim (+3,3 V ou +5 V en général).
Configuration CLK/CLOCK INT/EXT (oscillateur interne / externe)
Pour tout ce qui concerne le mode oscillateur, je vous invite dans un premier temps
à consulter la page
PIC
- Configuration oscillateur.
Une fois cette page lue, vous devriez être plus à même de savoir lire le
schéma et de déterminer si pour tel ou tel montage l'oscillateur est de
type interne ou externe. Voici en résumé ce que je peux dire en ce qui
concerne mes propres montages (globalement vrai aussi pour les autres montages qui ne sont pas de moi).
- Si
les broches d'horloge OSC1/CLKIN/CLKI et OSC2/CLKOUT/CLKO ne sont
raccordées à rien du tout, c'est que le PIC fonctionne obligatoirement
avec une horloge interne et qu'il n'a besoin d'aucun composant
additionnel pour faire tourner son programme. Mode OSCINT.
- Si
les broches d'horloge OSC1/CLKIN/CLKI et
OSC2/CLKOUT/CLKO sont
raccordées à un quartz ou à un résonnateur céramique avec deux
condensateurs, c'est que le PIC
fonctionne avec une horloge interne mais qu'il fait usage d'un
composant externe stable (quartz ou résonateur céramique) pour une
meilleure précision. Mode XT (Crystal) ou HS (High
Speed) par exemple. La différence entre XT et HS réside dans la vitesse
d'horloge et donc la fréquence du quartz ou du résonateur céramique
(voir doc technique du PIC pour les détails).
- Si
la broche d'horloge OSC1/CLKIN/CLKI est raccordée au point
médian d'une cellule RC (résistance et condensateur), cela
signifie que le PIC fonctionne avec une
horloge interne avec réseau RC externe. Mode RC.
- Si la broche
d'horloge OSC1/CLKIN/CLKI est raccordée à la sortie d'un
oscillateur externe, cela signifie que le PIC
fonctionne avec une horloge externe. Mode EXT.
Remarques
- Pour
certains de mes montages, il m'arrive de définir une configuration
d'horloge qui peut au choix être interne sans quartz ou interne avec
quartz externe. Quand c'est le
cas, je dessine les composants requis pour la partie externe de
l'horloge, je précise dans le
texte que ces composants sont optionnels, et je fourni deux fichiers
compilés *.hex, pour les deux versions avec et sans quartz
externe.
- En
mode horloge interne sans quartz externe, il est en général possible de
spécifier si la broche OSC2/CLKOUT/CLKO doit être utilisée en tant que
broche d'entrée/sortie, ou si elle doit faire ressortir le signal
d'horloge qui est généré en interne. Quand ladite broche n'est pas
utilisée, ce choix n'a aucune importance, mais autant la configurer en
tant que broche de sortie d'horloge car cela permet de vérifier
rapidement si la fréquence de fonctionnement est bien celle attendue
(mesure à l'osciloscope ou au fréquencemètre).
Configuration CLOCK (fréquence d'horloge)
Une
mauvaise configuration d'horloge peut conduire à des résultats curieux,
surtout quand le programme du PIC utilise des routines qui ont une
notion avec le temps. Il ne suffit pas de spécifier le mode d'horloge -
qui ne fait que dire au PIC comment il doit travailler pour son
cadencement, il faut aussi lui dire à quelle vitesse il doit
travailler. Supposons par exemple que pour un programme donné on
indique au PIC qu'il doit travailler à une fréquence d'horloge de 1 MHz
avec un quartz externe de 1 MHz. Les opérations qu'il va dérouler au fil
de l'exécution de son programme vont s'effectuer à la bonne
vitesse seulement si le quartz mis en place est effectivement un modèle
1 MHz, et si la valeur spécifiée lors de la programmation du PIC est
elle aussi de 1 MHz. Si la valeur d'horloge du PIC qui est spécifiée
est de 32 kHz (par erreur ou par oubli) et que le quartz est un modèle
1 MHz, le programme va s'exécuter beaucoup plus vite que la normale et
vous verrez parfois qu'il se passe quelques chose mais que ça ne
fonctionne pas bien. A l'inverse, si le PIC est configuré sur 8 MHz
alors que le quartz est un modèle 1 MHz, le programme va s'exécuter
beaucoup plus lentement, et vous aurez l'impression (à juste titre) que
quelque chose cloche. Le plus amusant est quand on est patient, et
qu'on constate que le PIC commence à se manifester au bout de plusieurs
secondes seulement. Le paramètre "Fréquence d'horloge" est, vous l'avez
compris, très important et vous devez toujours vous assurer que la
valeur spécifiée au moment de la programmation du PIC est celle que
l'auteur du montage a désignée.
Oscillateur capricieux, démarrage impossible ou aléatoire
Là,
le problème ne se situe plus au niveau logiciel (la configuration a été
vérifiée et est correcte) mais au niveau matériel. Il existe plusieurs
types de quartz et de résonateurs céramique (pour une même fréquence)
et selon le type employé, le démarrage de l'oscillation peut être plus
ou moins aléatoire. Pourquoi ? A cause de la topologie employée pour la
section oscillateur du microcontrôleur, qui réclame un circuit passif
oscillant doté de caractéristiques techniques particulières. Dans la
mise en oeuvre la plus simple, avec un quartz ou résonnateur céramique
associé à deux condensateurs reliés à la masse (ou au +alim), le
démarrage de l'oscillation est généralement assuré tant qu'on travaille
à une fréquence inférieure ou égale à 4 MHz. Au delà, ça devient
parfois rigolo.
Valeur des condensateurs pour quartz ou résonateur céramique
En
théorie, on devrait donner aux condensateurs de la partie oscillateur
les valeurs préconisées par le fabricant du microcontrôleur : pour cela
Microchip préconise dans ses documents techniques (datasheet) des
valeurs précises en fonction de la fréquence de travail désirée. Par
exemple pour le PIC 18F2520 cadencé avec l'aide d'un résonateur
céramique, un tableau recommande les valeurs suivantes :

Dans le même document, Microchip fait deux recommandations quand la fréquence du résonateur céramique est supérieure à 3,5 MHz.
- utiliser le mode oscillateur HS plutôt que le mode XT;
- ajouter une résistance entre résonateur et borne OSC2 du PIC (valeur proposée comme point de départ : 330 ohms).
Pour
la valeur des condensateurs, le même type de recommandation
s'applique si on utilise un quartz (crystal dans le texte
anglais),
voir tableau suivant.

Ces
valeurs sont proposées comme point de départ, quand on ne connait pas
les caractéristiques internes du quartz utilisé. Elles ne constituent
en aucun cas une garantie de bon fonctionnement. Avec la même
installation et les mêmes valeurs de composants, on peut très bien
avoir une oscillation qui démarre à chaque coup avec un quartz donné,
et qui ne démarre pas ou qui réagit sporadiquement avec un autre type
de quartz de même valeur.
Remarques- Le quartz doit être de type "résonance parallèle" et non "résonance série".
- La valeur 0 pF correspond à l'absence de condensateur et non à un court-circuit (c'est 0 pF et non 0 ohm).
- Une valeur plus élevée des condensateurs permet un fonctionnement plus stable et plus sûr, mais augmente le temps de démarrage.
- La
résistance série entre le quartz et la broche OSC2 (Rs sur le schéma
ci-avant) permet de limiter le courant traversant le quartz. Elle n'est
pas toujours nécessaire (pour savoir si elle l'est, il faut se référer
au document technique fourni par le fabricant du quartz).
Alimentation "variable" et température
Il
est des cas où, tout content, vous constatez que le montage est
opérationnel (l'oscillateur démarre bien) au moment des premiers tests
sur votre table de travail. Et puis sur le terrain, rien ne va plus...
Que peut-il donc se passer ? Eh bien entre le labo et le terrain, on
peut déjà observer une différence de température ambiante. Et puis
l'alimentation n'est peut-être plus la même. Un oscillateur à quartz ou
avec résonateur céramique peut être chatouilleux de ce côté là. S'il
fonctionne bien à +20 °C et avec une alim de +5,1 V, rien ne dit qu'il
fonctionnera à coup sûr sous une tension de +4,9 V et dans une ambiance
de +10 °C ou +30 °C. Les différences peuvent paraître subtiles à
première vue, mais quand un oscillateur est à la limite de
l'oscillation (qu'il démarre mais avec un peu de peine), il lui en faut
peu pour le bloquer. Il est donc important, pour un montage qui joue un
rôle "important", de s'assurer qu'il fonctionne encore dans des
conditions d'utilisations "variables" ou extrêmes. Pour cela, rien de
bien compliqué : lors des tests en labo (je veux dire sur votre table
de cuisine), prévoyez d'alimenter le circuit avec une alimentation
ajustable et réglez-là sur des limites que vous jugez acceptables.
Si par exemple votre circuit est prévu pour fonctionner avec un
régulateur de +5 V (LM7805 par exemple) et que ce dernier délivre en
réalité une tension de +5,1 V, essayez votre montage avec
l'alimentation variable réglée aux valeurs +4,8 V, +5,1 V et +5,3 V.
Pour la question de la température ambiante, utilisez un sèche-cheveux
(ou décapeur thermique mais alors allez-y mollo) pour arroser d'air
chaud la zone concernée (uC, quartz ou résonateur et condensateurs).
Vous constaterez peut-être alors une chose rigolote : un oscillateur
qui fonctionnait bien et qui s'est bloqué suite à "variation ambiance"
(surchauffe ou surtension par exemple) ne redémarre parfois qu'après un
arrêt / marche de l'ensemble. D'où l'intérêt évident d'un chien de
garde...
Autres paramètres coquins
Les
paramètres décrits ci-avant ne sont pas les seuls à regarder de près si
ça ne fonctionne toujours pas. En voici quelques autres qui peuvent
vous donner du fil à retordre dans ces situations que vous savez
rarissimes mais qui tombent forcément sur vous.
Attention, ce que
j'indique ci-après est valable pour les programmes que je propose sur
mon site, ça ne l'est pas forcément pour les programmes d'autres
auteurs !
WDT (WatchDog Timer)
Sauf
indication contraire dans le texte
descriptif du montage, ce paramètre doit être désactivé (DISABLED).
S'il
est activé et si rien n'est fait dans le logiciel pour en tenir compte,
le PIC se réinitialise en permanence et le programme ne fonctionne
pas.
LVP (Low Voltage Programming)
Sauf indication contraire dans le texte
descriptif du montage, ce paramètre doit être désactivé (DISABLED).
BOR/DOD (Brown-Out Reset ou Brown-Out Detect)
Sauf indication contraire, ce paramètre peut rester activé (ENABLED).
Si vous le désactivez, ce n'est pas grave ;-)
Problèmes fréquents
Si vous constatez un problème lors de la programmation ou lors de la vérification après programmation (de type "verification of
xxxx failed at address
0xyyyy"), cela peut avoir plusieurs causes :
- câble entre programmateur et PIC de trop grande longueur (ne pas dépasser 10 cm)
- câble
entre programmateur et PIC de mauvaise qualité ou défectueux (attention
aux câbles "dupond pour Arduino" vendus à bas prix, ils sont constitués
de quelques fils de cuivre qui cassent facilement à l'intérieur et cela
ne se voit pas toujours de l'extérieur)
- mauvais câblage (par exemple inversion des lignes PGD et PGC)
- alimentation
insuffisante du PIC pendant la phase de programmation ou de
vérification (il est conseillé d'alimenter le PIC par une alimentation
dédiée plutôt qu'utiliser l'alimentation fournie par le
programmateur). J'ai plusieurs fois constaté que des PIC pouvaient se
satisfaire de l'alimentation fournie par mon PICkit2 mais pas par celle
de mon PICkit3, tous deux "originaux" (pas des clones).
- présence de condensateurs ou autres composants sur les lignes PGC, PGD ou MCLR
- PIC défectueux ou ayant été programmés au moins une fois avec l'option LVP (Low Voltage Programming)
Malgré tout ce qui précède...
Un
PIC peut très bien donner satisfaction à un endroit (chez moi ou sur
une de vos maquettes) et ne plus fonctionner correctement ailleurs
(autre prototype ou circuit final). Il existe en effet des applications
où on en demande beaucoup au composant et où le routage des pistes du
circuit imprimé revêt une grande importance. Le tracé des pistes doit
répondre à des règles strictes quand on travaille avec des fréquences
élevées, des niveaux de tension très faibles ou des courants
d'intensité élevée (vous comprendrez qu'il m'est impossible d'énumérer
ces règles ici). Si du côté logiciel tout vous semble correctement
établi, pensez à vérifier tout ce qui se rapporte aux paramètres
physiques :
- fil de câblage les plus courts possible (prévoyez des marges de mouvement raisonnables)
- capacité parasite entre bandes de contacts sur votre plaque sans soudure (critique en haute fréquence) ?
- mauvaise soudure ou simplement court-circuits entre pistes ou entre pistes et pastilles;
- etc.
Historique
02/12/2012- Ajout infos sur paramètres coquins.
23/09/2012- Ajouts informations concernant les démarrages parfois capricieux des oscillateurs à quartz ou résonateur céramique.
05/02/2012- Première mise à disposition.