prof. Jacques Lepot
LES PORTS PARALLELES
Microcontrôleurs
Les ports parallèles sont la méthode la plus simple et la plus directe de communication entre le programme et le monde extérieur. Un port regroupe plusieurs pattes du microcontrôleur, chaque patte d'un port peut être configurée pour agir comme sortie ou comme entrée.
SORTIE (output), elle permet au programme, par la modification de la tension électrique sur une patte, de commander d'autres composants, par exemple allumer une LED.
ENTREE (input) , elle permet au programme, en testant l'état électrique d'une patte, de recevoir des informations depuis l'extérieur, par exemple un bouton enfoncé ou non.
Remarque: Il s'agit d'entrées/sorties LOGIQUES est elle ne peuvent être que dans 2 états BINAIRES 1 = Vcc ou 0 = GND.

Quel que soit le microcontrôleur ou le langage utilisé, le programme doit toujours configurer les ports avant de les utiliser. Il faut définir le sens E ou S de chaque patte et d'éventuelles options comme l'activation de résistances internes de "pull-up"

C'est configuration se réalisent en écrivant des valeurs prédéfines dans des registre particuliers du microcontrôleur. Toutes les possibilités, les adresses et les noms des registres se trouvent dans la documentation complète du microcontrôleur. Les compilateurs proposent souvent des librairies pour réaliser ces fonctions de configuration. Pour configurer un port parallèle, 1 ou 2 instructions suffisent et de telles librairies ne sont pas indispensables. Mais pour configurer un port USB par exemple, le travail est beaucoup plus complexe et une librairie est indispensable.

Les ports de l'ATMEGA
atmega

Les ATMEGA 8-88-48 et 168 disposent de 3 ports parallèles. PORTB, PORTC et PORTD

PORTB dispose de 8 E/S PB0 ,PB1,,PB7
Attention, si l'on utilise un quartz pour contrôler la vitesse du processeur, les pattes PB6 et PB7 ne sont plus disponibles

PORTC dispose de 6 E/S PC0 à PC5. PC6 n'est pas disponible, c'est le RESET.

PORTD dispose de 8 E/S PD0 à PD7

Cela donne en tout 22 pattes disponibles pour des entrées/sorties, sans quartz.

Caractéristiques électriques:

Elles sont données en détail dans la documentation complète du chip.
Sortie : maximum 20 mA, Si la sortie est à "1", alors la tension sur la patte est Vcc-0.3V, si elle est à 0, la tension est 0V.
Entrée: l'impédance est de +/- 40KOhm, donc, avec VCC = 5V, une entrée consomme +/- 0.1 mA

Les entrées sont "protégées", la tension présente sur une entrée peut légèrement dépasser Vcc (+0.7v)
Si on branche une sortie directement à Vcc ou à la masse, et que l'on y applique le niveau opposé, ON DETRUIT LE PORT

Programmation

Pour le programme, les ports se présentent sous forme de registres de 1 BYTE, chaque bit représente une patte, le bit le plus faible (à droite) correspond à la patte PX0 du port et le bit le plus fort à la patte PX7. Les bit 6 et 7 du port C ne correspondent à rien.

Exemple pour le PORTB

PORTB, PINB ou DDRB
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
Pattes
10 (PB7)
9 (PB6)
19 (PB5)
18 (PB4)
17 (PB3)
16 (PB2)
15 (PB1)
14 (PB0)


Il y à 3 registres pour chaque port, PORTX,PINX et DDRX (X = B,C ou D)

Le registre PORTX permet de modifier une ou plusieurs SORTIES, écrire une valeur dans ce registre modifie directement l'état des sorties associées. Il faut bien sur que les pattes que l'on désire modifier soient configurées en mode sortie. le registre PORTX sert aussi à activer les Rpull-up.

On peut modifier les 8 bits en une seule instruction ex: PORTB=129 ( = binaire 10000001 ) PB7 et PB0 passent à 1, les autres à 0. Mais on peut aussi ne modifier qu'un seul bit avec une instruction spéciale ( ex PORTB.0 = 1 en bascom ).

Normalement il ne faut pas écrire dans le registre PORTX sur les bits qui correspondent à des entrées. C'est en fait une astuce pour activer les résistance de pull-up.Si on écrit "1" dans un bit de PORTX qui est configuré en entrée, alors, on active la résistance sur l'entrée correspondante et écrire 0 la désactive.

Le registre PINX permet de lire l'état d'une ou plusieurs ENTREES, la valeur contenu dans le registre reflète l'état des pattes qui sont configurées en mode entrée.
On ne peut pas écrire dans PINX mais uniquement lire.

A=PINB, copie le contenu de PINB dans la variable A

if PIND=0, sera vrai si toutes les pattes du portD sont à la masse

DO
LOOP UNTIL PINB.1=0
est une boucle qui s'arrêtera quand la patte 15 sera mise à la masse.

Le registre DDRX permet de choisir la direction entrée ou sortie pour chaque bit du port concerné, les bits à 1 dans le registre donnent une SORTIE sur la patte correspondante, les bits à 0 donnent une ENTREE

DDRD=255, toutes les pattes PDn en sortie
DDRD=0, toutes les pattes PDn en entrée
DDRB=2, la patte PB1 en sortie, les autres PBn en entrée.


Remarques

  • ce qui est écrit dans un registre y reste indéfiniment jusqu'à ce que l'on y mette autre chose ou coupe le courant. Pour les registres PINX, c'est différent, sa valeur change "toute seule" en fonction des tensions appliquées sur les pattes d'entrée.
  • il est impossible de modifier SIMULTANEMENT les 22 sorties disponibles, il faudra 3 instructions successives, une pour chaque port. Mais une instruction de ce type ne dure que 250ns à 8Mhz
  • Attention, pour les pattes inutilisées, il est plus prudent de les configurer en entrées ( pourquoi ?)

En C Arduino

Configuration entrée ou sortie, chaque patte est indépendante

pinMode(Pin, OUTPUT);
pinMode(Pin, INPUT);

Modification de l'état d'une sortie

digitalWrite(Pin,HIGH);
digitalWrite(Pin,LOW);

Lecture de l'état d'une entrée, retourne une valeur de type int

digitalRead(pin) ;