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).
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.