|
|
Bien programmer les PIC
Vous êtes nombreux à me contacter à propos de la
programmation des PIC, plus particulièrement en ce qui concerne les bits ou
« fusibles » de configuration dont l’état est rarement précisé
dans les descriptions mettant en œuvre ces microcontrôleurs. Voici donc ce qu’il
faut savoir à leur sujet pour bien programmer vos PIC.
Contenu du fichier de programme
Lorsque l’auteur d’un programme vous fournit le fichier
à programmer dans votre PIC ; ce dernier est toujours au format .hex,
reconnu par tous les programmateurs de PIC mais, selon la façon dont le
programme initial a été écrit par l’auteur, ou selon l’outil utilisé
pour le compiler ou l’assembler, ce fichier ne contient pas nécessairement
les informations relatives aux fusibles ou bits de configuration.
Si ce fichier contient les informations relatives à ces
fusibles de configuration, aucun problème ne va se poser car lors du chargement
du fichier dans votre programme de pilotage du programmateur, ces informations
seront automatiquement prises en compte et le programmateur se configurera
correctement.
Lorsque ces informations sont absentes du fichier .hex ;
il faut alors définir « à la main » l’état de ces fusibles au
niveau de votre logiciel de pilotage du programmateur.
Le cas des 16C84 et 16F84
Les 16F84 ne contiennent que cinq fusibles de configuration,
qui n’apparaissent généralement que sous forme de quatre fusibles distincts
dans la majorité des logiciels de programmation. Ils ont les appellations et
fonctions suivantes.
-
FOSC1 et FOSC0, généralement regroupés sous
le vocable unique de « Oscillator » ou « Osc »,
pouvant prendre les valeurs : RC, LP, XT ou HS. « Ce »
fusible doit être positionné sur le type d’oscillateur d’horloge
utilisé par le 16F84 dans le montage considéré. Il faut donc choisir RC
pour un oscillateur à cellule résistance – condensateur, XT pour un
oscillateur à quartz jusqu’à une fréquence de 4 MHz incluse, HS pour un
oscillateur à quartz de fréquence supérieure à 4 MHz (10 et 20 MHz en
particulier). La valeur LP est réservée à un usage avec un oscillateur à
quartz à très basse fréquence tel celui utilisant un quartz horloger à
32,768 kHz. Un mauvais choix au niveau de « ce » fusible conduit
à un fonctionnement erratique de l’oscillateur qui peut refuser de
démarrer ou dont la fréquence peut être instable.
-
WDT ou WDTE est le fusible de validation du
timer chien de garde (Watch Dog Timer Enable). Il ne doit être laissé non
programmé que si cette fonction est explicitement prévue et gérée par le
programme utilisé, ce que doit donc vous indiquer l’auteur du logiciel.
Si vous laissez ce fusible non programmé à tort, votre programme ne
fonctionnera pas car, dès la première interruption générée par le timer
chien de garde, il se « plantera » puisque cette fonction ne
sera pas supportée.
-
PWRT ou PWRTE est le fusible de validation du
timer de reset à la mise sous tension (PoWer up Reset Timer Enable). Sauf
mention contraire explicitement exprimée par l’auteur du logiciel ;
ce fusible doit toujours être programmé. Il permet de bénéficier d’un
délai d’attente après la stabilisation de la tension d’alimentation
avant que le programme ne démarre son exécution ce qui est une attitude
prudente.
-
CP ou CP0 est le fusible de protection de la
mémoire de programme contre une lecture non autorisée. Si vous programmez
un PIC pour votre propre usage, ce fusible n’a pas besoin d’être
programmé. Votre mémoire de programme reste ainsi accessible en lecture et
vous permet de vérifier, si nécessaire, son contenu. Par contre, si vous
avez développé un programme que vous voulez protéger des copies
illicites, vous programmerez ce fusible avant d’envoyer le circuit dans la
nature. Sa mémoire de programme ne pourra plus être lue par quiconque et
son contenu sera donc protégé.
Le tableau ci-dessous résume de façon synthétique la
signification de ces fusibles et devrait vous suffire une fois que vous avez lu
les quelques explications qui précèdent.
| Fusible |
Etat |
Etat par défaut |
Fonction |
| FOSC1 et FOSC0 |
00 |
|
Oscillateur LP |
| 01 |
|
Oscillateur XT |
| 10 |
|
Oscillateur HS |
| 11 |
X |
Oscillateur RC |
| WDT(E) |
0 |
|
Timer chien de garde inactif |
| 1 |
X |
Timer chien de garde actif |
| PWRT(E) |
0 |
|
Timer de reset à la mise sous tension actif |
| 1 |
X |
Timer de reset à la mise sous tension inactif |
| CP(0) |
0 |
|
Mémoire de programme protégée |
| 1 |
X |
Mémoire de programme non protégée |
Je vous rappelle que ces fusibles de configuration, malgré
leur appellation de fusible héritée du passé, peuvent être effacés au même
titre que la mémoire de programme. Il vous est donc toujours possible de
corriger une erreur faite à leur niveau, ce qui est bien utile dans le cas où
vous avez un doute quant à l’état du fusible WDT par exemple.
Lorsque le circuit vous est livré vierge ou, ce qui revient
au même, après un effacement de celui-ci, et donc des fusibles de
configuration ; ceux-ci sont non programmés ce qui, dans la terminologie
officielle de Microchip, donne la configuration suivante :
-
Oscillateur en mode RC.
-
WDT ou timer chien de garde validé.
-
PWRT ou timer de reset à la mise sous tension
non validé.
-
CP ou protection du code non activée.
Munis de ces informations, vous ne devriez donc plus avoir
aucun mal à configurer correctement les fusibles de vos 16F84 avant
programmation.
Le cas des 16F87x
Ces circuits disposent de fusibles de configuration nettement
plus nombreux que les 16F84. Voyons ce qu’il en est, étant entendu que cet
exposé est valable à ce jour pour les 16F873, 874, 876 et 877.
-
FOSC1 et FOSC0 sont généralement regroupés
sous le vocable unique de « Oscillator » ou « Osc »
comme pour le 16F84. Ils peuvent prendre les mêmes valeurs et ont les
mêmes fonctions que pour ce dernier. Je vous renvoie donc à ce que j’ai
écrit ci-dessus.
-
WDT ou WDTE est le fusible de validation du
timer chien de garde (Watch Dog Timer). Ici aussi tout ce que j’ai écrit
ci-dessus pour le 16F84 reste valable.
-
PWRT ou PWRTE est le fusible de validation du
timer de reset à la mise sous tension (PoWer up Reset Timer Enable). Comme
pour le 16F84, et sauf mention contraire explicitement exprimée par l’auteur
du logiciel, ce fusible doit toujours être programmé.
-
CP1 et CP0 sont les fusibles de protection de
la mémoire de programme contre une lecture non autorisée. Ils fonctionnent
comme le seul fusible CP du 16F84 mais permettent de protéger diverses
zones de la mémoire de programme si nécessaire. Le tableau ci-dessous
indique les différentes combinaisons possibles selon les versions de
circuits 16F87x. Comme pour le 16F84, la mémoire est non protégée si ces
fusibles ne sont pas programmés.
-
DEBUG est le fusible de validation du mode de
« debug » en circuit. Si ce mode n’est pas utilisé, ce
fusible ne doit pas être programmé.
-
WRT est le fusible d’interdiction d’écriture
dans la mémoire EEPROM de programme à partir du registre EECON. Il doit
être programmé uniquement si cette fonction est requise par le programme
exécuté par le circuit. C’est donc à l’auteur de ce dernier de vous
fournir cette indication.
-
CPD est le fusible de protection du contenu de
la mémoire EEPROM de données. Si ce fusible est programmé, le contenu de
la mémoire EEPROM de données est protégé. En règle générale, ce
fusible est laissé non programmé.
-
LVP est le fusible de sélection du mode de
programmation basse tension des PIC 16F87x. Il faut savoir en effet que ces
circuits peuvent se programmer avec une « haute » tension de 12
volts comme les 16F84 ou avec une seule et unique tension de 5 volts. Pour
cela, ils doivent être mis en mode LVP en ne programmant pas ce fusible.
Cela signifie donc que, par défaut, les circuits vierges sont toujours en
mode LVP. Heureusement, même lorsqu’ils sont dans ce mode, ils peuvent
toujours être programmés en mode « haute » tension par les
programmateurs conventionnels.
-
BODEN est le bit de validation du « brown
out reset » ou reset automatique en cas de baisse anormale de la
tension d’alimentation. Pour plus de précisions à ce sujet je vous
recommande la lecture de mon livre Les
microcontrôleurs PIC – Description et mise en œuvre dans sa
dernière édition (celle accompagnée des deux CD ROM de Microchip). En
général, il est vivement conseillé de ne pas programmer ce bit afin de
valider cette fonction.
| CP1 |
CP0 |
Zone protégée des 16F873 et 16F874 |
Zone protégée des 16F876 et 16F877 |
| 0 |
0 |
0000 à 0FFF |
0000 à 1FFF |
| 0 |
1 |
0800 à 0FFF |
1000 à 1FFF |
| 1 |
0 |
0F00 à 0FFF |
1F00 à 1FFF |
| 1 |
1 |
Aucune |
Aucune |
Le tableau ci-dessous résume la signification des fusibles
des 16F87x conformément aux explications que je viens de vous donner.
| Fusible |
Etat |
Etat par défaut |
Fonction |
| FOSC1 et FOSC0 |
00 |
|
Oscillateur LP |
| 01 |
|
Oscillateur XT |
| 10 |
|
Oscillateur HS |
| 11 |
X |
Oscillateur RC |
| WDT(E) |
0 |
|
Timer chien de garde inactif |
| 1 |
X |
Timer chien de garde actif |
| PWRT(E) |
0 |
|
Timer de reset à la mise sous tension actif |
| 1 |
X |
Timer de reset à la mise sous tension inactif |
| BODEN |
0 |
|
"Brown out reset" inactif |
| 1 |
X |
"Brown out reset" actif |
| LVP |
0 |
|
Programmation en mode haute tension |
| 1 |
X |
Programmation en mode basse tension |
| CPD |
0 |
|
Code de la mémoire EEPROM de données protégé |
| 1 |
X |
Code de la mémoire EEPROM de données non protégé |
| WRT |
0 |
|
Ecriture dans la mémoire EEPROM de données impossible |
| 1 |
X |
Ecriture dans la mémoire EEPROM de données possible |
| DEBUG |
0 |
|
Mode debug en circuit validé |
| 1 |
X |
Mode debug en circuit non validé |
| CP0 et CP1 |
-- |
|
Voir tableau c-dessus |
| 11 |
X |
Mémoire de programme non protégée |
Lorsque le circuit vous est livré vierge, ou après
effacement de celui-ci, les fusibles configurent le circuit dans l’état
suivant :
-
Oscillateur en mode RC.
-
WDT ou timer chien de garde validé.
-
PWRT ou timer de reset à la mise sous tension
non validé.
-
CP0 et CP1 ou protections du code non
activées.
-
BODEN ou reset en cas de baisse de la tension d’alimentation
activé.
-
LVP ou mode programmation basse tension
validé.
-
CPD ou protection de code de la mémoire EEPROM
de données non validée.
-
WRT ou interdiction d’écriture dans la
mémoire EEPROM de programme au moyen du registre EECON non validée.
-
DEBUG ou mode « debug » en circuit
non validé.
Comme pour le 16F84, vous pouvez constater à la lecture de
ces informations que la position de ces fusibles par défaut est la plus logique
qui se puisse concevoir dans un cas général mais, munis des informations
ci-dessus, vous êtes cependant à même de les programmer au mieux en fonction
des besoins de votre application.
|