Logiciels > Programmation PIC > Bases > MP > Configuration minimale

Dernière mise à jour : 29/07/2009

Présentation

Avant de pouvoir utiliser les fonctions et les entrées / sorties d'un PIC, il faut avant tout "configurer" le composant, c'est à dire spécifier la valeur de certains paramètres qui conditionneront son fonctionnement général.

Des pattes à tout faire

Les PICs existent dans des boitiers de diverses tailles, on en trouve à 8 pattes (12F675 par exemple) ou à 40 pattes (16F877A par exemple). Certaines pattes peuvent être utilisées pour accomplir des fonctions différentes, et il faut choisir pour chacune d'elle la fonction que l'on désire parmi celles disponibles. L'exemple le plus évident est le simple port d'entrée / sortie : une même patte du circuit intégré peut servire d'entrée ou de sortie, elle ne peut pas remplir les deux rôles en même temps (dans un circuit logique traditionnel TTL ou CMOS, une patte est une entrée ou une sortie, mais on ne peut pas choisir, c'est figé par construction). Sur la majorité des schémas électroniques mettant en oeuvre un PIC, le libellé donné à chaque patte du PIC renseigne sur ses "capacités". On peut ainsi voir sur l'exemple qui suit (PIC 16F628A) que certaines pattes n'ont qu'un seul nom (par exemple RB4 et RB5), et que d'autres pattes ont plusieurs noms (par exemple RA5/MCLR, RA4/T0CKI/CMP2 et RA7/OSC1/CLKIN).

pic_tuto_base_config_minimale_001b

Les noms donnés à chaque patte du PIC ne sont pas forcement toujours parlants car il s'agit d'abbréviations ou de termes spécifiques à certaines fonctions, et tant qu'on y a pas encore goûté, on ne devine pas forcement tout de suite. C'est quand on voit toutes ces appellations que l'on se pose la question : "Mais comment donc utiliser telle ou telle patte ? Si elle est mal configurée, y a-t-il un risque de griller quelque chose ?". C'est le moment de plonger dans le datasheet du fabricant. Un datasheet est un document technique qui décrit comment est constitué un circuit, comment le mettre en oeuvre et précise les limites électriques et physiques à ne pas dépasser pour ne pas l'endomager (tensions et température maximales, entre autres). Dans la grande majorité des cas, ce type de document est rédigé en langue anglaise, ce qui peut constituer un frein sérieux quand on ne maîtrise pas cette langue. Supposons pour la suite des évenements que l'on comprend ce qu'indique ce fameux datasheet, et reprenons l'exemple des broches citées précédement : le datasheet nous apprend ceci :

RB4 (même chose pour RB5)
est une patte qui peut être configurée en entrée logique ou en sortie logique. Elle n'a pas d'autre fonction et ne peut pas être utilisée pour autre chose.

RA5/MCLR
est une patte qui peut servir à plusieurs choses, selon la façon dont elle est configurée via les paramètres de configuration (qui seront vus plus loin).
- RA5 : configuration en entrée logique (cette patte ne peut pas être utilisée comme sortie logique)
- MCLR : configuration en entrée de RAZ (remise à zéro / reset général)

RA4/T0CKI/CMP2
est une patte qui peut servir à plusieurs choses, selon la façon dont elle est configurée via les paramètres de configuration.
- RA4 : configuration en entrée logique ou en sortie logique
- T0CKI : configuration en tant qu'entrée d'horloge pour le timer interne (qui n'est qu'un simple compteur)
- CMP2 : configuration en tant que sortie du comparateur interne.

RA7/OSC1/CLKIN
est une patte qui peut servir à plusieurs choses, selon la façon dont elle est configurée via les paramètres de configuration.
- RA7 : configuration en entrée logique ou en sortie logique
- OSC1 : configuration pour usage de composants externes avec le circuit d'horloge interne (résistance, condensateur, quartz ou résonnateur céramique)
- CLKIN : configuration pour utilisation d'un signal d'horloge externe (horloge interne désactivée)

Conclusion qui saute aux yeux
Il y a beaucoup à apprendre pour chaque pattes du PIC ! Comprendre toutes les fonctions offertes par chacune des pattes au travers d'exemples de codes trouvés à gauche ou à droite est certes possible, mais il est évident que la lecture du datasheet dans son intégralité permet d'avoir toutes les infos sous la main et en un seul volume ! La non compréhension de telle ou telle fonction peut tout simplement conduire à la réalisation d'un montage qui ne fonctionne pas. Un piège bête auquel je me suis laissé prendre, faute d'avoir lu le datasheet dans ses recoins : la patte RA4 du PIC 16F628A peut être utilisée en tant qu'entrée logique ou en tant que sortie logique, comme quasiment toutes les autres pattes du composant. Mais la structure interne de sortie de cette patte diffère de la structure des autres sorties, elle est de type collecteur ouvert. Ce qui signifie que pour pouvoir bénéficier d'un état logique haut, il faut y raccorder une résistance de rappel vers le +Valim (ce qui n'est pas nécessaire sur les autres sorties). Sans cette résistance, la sortie ne peut qu'être à l'état logique bas (transistor interne saturé) ou à l'état logique indéterminé (transistor interne bloqué). De même, la plupart des pattes d'un port donné (PORTA ou PORTB par exemple) peuvent être configurées en entrée logique ou en sortie logique, mais certaines peuvent ne fonctionner que dans un sens, comme c'est le cas de la patte RA5 du PIC 16F628A qui ne peut pas fonctionner en tant que sortie. Ce genre de détail n'apparait pas sur le croquis du composant, là aussi il faut consulter le datasheet pour le savoir.

Paramètres de configuration

Il existe un certain nombre de paramètres (ou mots) de configuration, que l'on peut trouver de manière commune à plusieurs espèces de PICs. Mais évidement, on en trouve aussi qui sont spécifiques à certains PICs, que d'autres ne reconnaissent absolument pas. Encore une fois, il faut faire preuve de patience et de lecture attentive pour savoir lesquels utiliser.

La base de la base
Il existe un paramètre que l'on va retrouver sur l'ensemble des PICs, c'est celui qui permet de spécifier la direction dans laquelle on souhaite utiliser tel ou tel port d'entrée / sortie. En d'autres termes, qui permet de spécifier si telle ou telle patte doit être utilisée en entrée logique ou en sortie logique. Ce paramètre s'appelle TRIS et on doit lui ajouter la lettre qui correspond au port sur lequel on veut travailler. Par exemple, les pattes RA0, RA1, ... à RA7 appartiennent toutes au même port, qui est le port A (PORTA). De même, les pattes RB0, RB1, ... à RB7 appartiennent toutes au même port, qui est le port B (PORTB). Le PIC 16F628A ne possède que deux ports (PORTA et PORTB), mais d'autres PICs en possèdent plus (le PIC 16F877 possède ainsi cinq port, PORTA à PORTE). Il est à noter que chaque port ne comporte pas forcement toujours 8 pattes (8 bits), mais parfois moins. Pour chaque port, il est possible de spécifier la direction de chaque ligne (bit), grâce au paramètre TRIS, comme cela a été dit précédement. Pour le port A, il faut utiliser le mot TRISA, pour le port B il faut utiliser le mot TRISB, pour le port E il faut utiliser le mot TRISE, etc. TRIS en lui-même est le nom du paramètre (nom du mot de configuration), il faut aussi lui donner une valeur, comprise entre 0 et 255. Pourquoi entre 0 et 255 ? Tout simplement parce que cette fourchette de valeurs correspond à un mot de 8 bits, chacun des bits représentant, de façon individuelle, une ligne donnée du port concerné. La valeur donnée au mot TRIS peut être écrite de différente façons : en décimal, en hexadécimal ou au format binaire. Ainsi, les trois lignes incluses dans la procédure Init qui suit expriment exactement la même chose une seule de ces lignes est nécessaire et suffisante).

procedure Init
begin
TRISA := 240; // écriture en décimal
TRISA := $F0; // écriture en hexadécimal
TRISA := %11110000; // écriture en binaire
end;


Personnellement, j'use et j'abuse de la troisième façon d'écrire, c'est à dire en binaire, et ce pour deux raisons :
- les 8 bits du port sont visualisés de façon claire, le chiffre le plus à droite (bit de poids faible) représente la première ligne du port (RA0 si port A), et le chiffre le plus à gauche (bit de poids fort) représente la dernière ligne du port (RA7 si port A).
- chaque chiffre "1" représente une configuration en entrée logique, et chaque chiffre "0" représente une configuration en sortie logique. Chiffre "1" comme la lettre "I" de Input (entrée, en anglais) et chiffre "0" comme la lettre "O" de Output (sortie, en anglais). Vraiment facile à retenir !

Finalement, tout cela est fort simple. Si on veut que toutes les lignes du port B se comportent en tant qu'entrées logiques, il suffit de mettre un "1" pour chaque bit qui leur correspond. Et si au contraire on veut que toutes les lignes du port B se comportent en tant que sorties logiques, il suffit de mettre un "0" pour chaque bit qui leur correspond. Entre ces deux extrêmes, toutes les combinaisons sont possibles, chaque ligne peut être individuellement configurée en entrée ou en sortie (si bien sûr le PIC permet toutes ces combinaisons) !

procedure Init
begin
TRISB := %11111111; // toutes lignes du port B (RB0 à RB7) configurées en entrées logiques
TRISB := %00000000; // toutes lignes du port B (RB0 à RB7) configurées en sorties logiques
TRISB := %11000110; // RB0, RB3, RB4 et RB5 configurées en sorties, RB1, RB2, RB6 et RB7 configurées en entrées
end;


Et bien voilà. Avec le simple code source qui suit, vous diposez déjà d'un code logiciel qui peut être compilé et utilisé, même si bien sûr au niveau utilisation cela est plutôt restreint...

program Test_16F628A;

procedure Init
begin
TRISB := %11111111; // toutes lignes du port B (RB0 à RB7) configurées en entrées logiques
end;

// Main program
begin
Init;
end.


Pour que les choses deviennent interressantes, il convient d'aller un peu plus loin, par exemple en lisant l'état logique d'une ligne configurée en entrée, ou en modifiant l'état logique d'une ligne configurée en sortie.