Voilelec     Retour page précédente
     0 connectés       Une missive s'envolera dans l'éther...
 

Utilisation d'un port

(Note)

 

Maj : 13/08/04

 

Définition du port

Par port d'entrée sortie d'un microcontrôleur, il faut comprendre une série de 8 pattes qui peuvent être programmées en entrées ou en sorties.

Par facilité de langage, il sera aussi question de port en parlant du registre d'entrées/sorties concerné.

Le port B du Pic est un registre interne fondamental. Il est très particulier car il communique directement avec le monde extérieur. Si vous le programmez en sortie, tout ce que vous écrirez dans ce registre sera directement transféré sur les pattes de sortie. Il s'agit donc de huit interrupteurs élémentaires programmables à 0 ou 5 volts. C'est la base même du fonctionnement des microcontrôleurs. Ce port B peut être aussi programmé en entrée, les tensions (niveaux logiques) appliquées sur les pattes seront alors lues dans le registre. Comble de raffinement les pattes d'un port peuvent être programmées indépendamment en entrée ou sortie. Sur le Pic 18f84, nous disposons d'un port"A"avec 4 bits et du port"B"de 8 bits. Voir cet exemple pédagogique d'utilisation d'un port

 

 

Palpation d'un clavier matricé à 16 touches.

Quatre fils constitueront les lignes, quatre autres les colonnes. Une touche appuyée fera un court-circuit entre la ligne et la colonne correspondante. Il sera donc possible de lire 16 touches. Les 8 fils seront tirés au positif (niveau +1) par des résistances de 10 kohms. Le programme de se décomposera ainsi :

Mettre les 4 lignes en sortie et les 4 colonnes en entrée (nous verrons plus tard l'instruction simple pour initialiser un registre)

Écrire des zéros dans ces 4 lignes.
Si les lignes sont les bits 3 à 0, il suffit d'écrire"11110000b"(le b pour binaire), soit"F0h"(le h pour hexadécimal), soit"128d"(le d pour décimal). Remarque : 128+64+32+16=240. Ces trois notations sont équivalentes. Ne vous préoccupez pas pour le moment des quatre"1", ils ne sont pas significatifs, mais servent à remplir la valeur. Il aurait été possible d'écrire les 4 bits un par un, mais il est plus rapide de passer les huit en une seule fois, même si l'on, n'en utilise que quatre.

Lire les colonnes en faisant un ou exclusif avec $FF, ainsi le bit correspondant à la touche appuyée sera à 1, les autres à 0.

Sauver provisoirement ces 4 bits colonnes les 1 (+5 volts)

Inverser, mettre maintenant les 4 lignes en entrée et les 4 colonnes en sortie.

Écrire des zéros dans ces 4 colonnes.
Si les colonnes sont les bits 7 à 4, il suffit d'écrire"00001111b"soit"0Fh", soit"15d". Remarque 8+4+2+1 =15.

Lire les lignes (avec XOR $FF). Le bit correspondant à la touche appuyée sera à 1, les autres à 0.

 

Nous disposons maintenant de quatre bits dont un indique la colonne et de quatre autres dont l'un indique la ligne active. Il y a plusieurs astuces pour traduire cela en numéro de touche appuyée.
Tout d'abord si tous les bits sont à zéro, cela signifie qu'aucune touche n'est appuyée, et le sous-programme sort en l'indiquant.
Si plus de 2 bits sont à un, cela signifie que plusieurs touches sont appuyées en même temps, cela peut être une sortie en erreur si les combinaisons de touches sont interdites.
Si deux et seulement deux bits sont actifs, une bonne touche est identifiée, après quelques boucles d'anti rebond pour s'assurer que la touche reste bien appuyée un plus d'un dixième de seconde.
Cela peut se faire par un tableau pointé par le mot de 8 bits (lignes +colonnes). C'est simple (une seule instruction), et autorise les multiples combinaisons de plusieurs touches mais cela occupe 256 octets mais. Il suffit d'écrire dans le programme (en dur, c'est çà dire avec une valeur fixe et définitive) dans chaque case du tableau la valeur que l'on veut affecter à la touche ou à la combinaison de touches. Les combinaisons interdites seront codées par exemple"FFh".
Voir dans le glossaire "Tableau".
Pour économiser la mémoire, si l'on interdit l'appui multiple, il est plus rationnel d'écrire un petit programme qui renverra un octet entre 0 et 15d qui sera le numéro de la touche parmi 16. Cela se fait simplement en donnant un"poids"à chaque touche et en faisant la somme. Les colonnes pèseront 0,1,2 ou 3. Les lignes pèseront 0,4,8,12. La somme des deux donnera le numéro de la touche de 0 à 15.
Il ne faut évidement pas confondre la touche"0" avec pas de touche, la sortie de la routine de palpation sera différente, il est pratique d'utiliser un flag pour tester simplement l'appui valide.
Je ne détaille pas ce petit calcul pour le moment, nous en reparlerons plus tard. Cela n'a rien de très compliqué mais est un peu raide pour un débutant complet.

Le but de ce chapitre n'était que d'illustrer une utilisation très classique d'un port, il y a beaucoup de variantes astucieuses.

 

© Christian Couderc 1999-2007     Toute reproduction interdite sans mon autorisation

Merci aux journalistes qui pillent sans vergogne mon site,
d’avoir au moins la courtoisie de citer leurs sources…

6744

 Haut de page         Dernière retouche le 14 Août 2004 à 06 h           Retour page précédente

    Voilelec