Accueil Remonter Schémas Logiciels Liens Mes livres Contactez-moi Librairie  

Con. Audio/Vidéo
Con. Informatiques
Prog. PIC
Interface Série
Interface Parallèle
Bus I2C
UVPROM/ EEPROM
Calcul des Selfs

 

 

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.


 

Site déclaré à la CNIL sous le n° 1112858
© 2017 - C.Tavernier - Reproduction interdite sans autorisation