Main

Référence : Langage Arduino : [ Mini | Standard | Etendue | Maxi ] Librairies : [ Vue d'ensemble | Synthèse ] Infos : [ Comparaison | Changements ]

La manipulation des ports à l'aide des registres de port


Description

Les registres de port permettent une manipulation de bas-niveau (çàd au niveau du matériel lui-même) et plus rapide des broches d'entrée/sortie du microcontrôleur de la carte Arduino. Les microcontrôleurs utilisés pour les cartes Arduino (l'ATmega8 et l'ATmega 168, 328) ont trois ports :

  • Port B (broches numériques de 8 to 13)
  • Port C (broches analogiques/numériques)
  • Port D (broches numériques 0 to 7)

Chaque port est contrôlé par 3 registres, qui sont également défini en tant que variable dans le langage Arduino :

  • Le registre (un octet) DDR détermine le sens d'utilisation des broches numériques en tant qu'ENTREE ou SORTIE.
  • le registre PORT contrôle le niveau HAUT ou BAS des broches numériques en SORTIE (et l'activation du PULLUP pour les broches en ENTREE).
  • le registre PIN reflète l'état des broches configurée en ENTREE avec l'instruction pinMode().

Le brochage de l'ATmega 8 (voir la fiche technique) et de l'ATmega 168 (voir la fiche technique) montre les ports. Le brochage de l'ATmega 328 (voir la fiche technique) se superpose exactement à celui de l'ATmega168.

Les registres DDR et PORT sont accessibles en écriture et en lecture. Le registre PIN n'est accessible qu'en lecture.

Le PORTD correspond aux broches numériques 0 à 7 de la carte Arduino et est contrôlé par les 3 registres suivants :

  • DDRD - Le registre de direction du port D - écriture/lecture
  • PORTD - Le registre de données du port D - écriture/lecture
  • PIND - Le registre des broches numériques en entrée du port D - lecture seulement

Le PORTB correspond aux broches numériques 8 à 13 de la carte Arduino. Les 2 broches 6 et 7 du port sont connectées au quartz et ne sont pas utilisables. Le PORTB est contrôlé par les registres suivants :

  • DDRB - Le registre de direction du port B - écriture/lecture
  • PORTB - Le registre de données du port B - écriture/lecture
  • PINB - Le registre des broches numériques en entrée du port B - lecture seulement

Le PORTC correspond aux broches analogiques 0 à 5 (= broches numériques 14 à 19) de la carte Arduino. Les broches 6 et 7 sont accessibles uniquement sur la carte Arduino Mini?. Le PORTC est contrôlé par les 3 registres suivants :

  • DDRC - Le registre de direction du port C - écriture/lecture
  • PORTC - Le registre de données du port C - écriture/lecture
  • PINC - Le registre des broches numériques en entrée du port C - lecture seulement

Chaque bit de ces registres correspond à une broche du port; par exemple, le bit de poids faible (bit 0) des registres DDRB, PORTB et PINB se réfèrent à la broche 0 du port B (broche numérique 8 de la carta Arduino). Pour une description complète du brochage des broches Arduino avec les ports et bits, voir le schéma de votre microcontrôleur : l'ATmega 8 (voir la fiche technique), l'ATmega 168 (voir la fiche technique), l'ATmega 328 (voir la fiche technique). ( Noter que certains bits de ports peuvent être utilisés pour d'autres choses que des entrées/sorties; faites attention à ne pas changer les valeurs des bits correspondants dans les registres .)

Voir également : le brochage de l'ATmega 168/328

Exemples

Comme indiqué dans le brochage ci-dessus, les registres du Port D contrôlent les broches 0 à 7 de la carte Arduino.

Vous noterez cependant que les broches 0 et 1 sont utilisées pour les communications série nécessaires pour la programmation et la mise ou point de l'Arduino, et donc, modifer ces broches sera généralement à éviter à moins d'une nécessité pour les fonctions d'entrée et de sortie série. Bien être conscient que ceci peut interférer avec les transferts de programme et l'affichage de messages.

Le regitre DDRD est le registre de direction du port D (broches numériques 0 à 7 de la carte Arduino). Les bits dans ces registres contrôle la façon dont les broches du port D sont configurées en ENTREE ou en SORTIE. Par exemple :


DDRD = B11111110;  // met les broches n° 1 à 7 de l'Arduino en sortie, la 0 en entrée
DDRD = DDRD | B11111100;  //c'est plu sûr de configurer les broches 2 à 7 en sortie
	                  // sans modifier la valeurs des broches 0 et 1, qui sont les broches RX etTX 

Voir les pages de la référence sur les opérateurs bit à bit pour plus de détails :

Le registre PORTD est le registre d'état des sorties du port. Par exemple :

PORTD = B10101000; // met les broches 7,5 et 3 au niveau HAUT

Vous aurez 5 volts sur ces broches toutefois seulement si les broches ont été configurées en sortie en utilisant le registre DDRD ou l'instruction pinMode(). Notez que si on met ces bits à 1 alors que les broches sont en ENTREE, cela active les résistances internes de rappel au plus associées aux broches correspondantes. Pour plus de détails, voir : Les broches numériques d'entrée/sortie

PIND est le registre d'entrée. Il permet de lire l'état de toutes les broches en entrée du port en une seule fois.

Pourquoi utiliser la manipulation de port ?

D'après le Tutoriel sur les math binaires (en anglais)

D'une manière générale, procéder de la façon décrite ici n'est pas une bonne idée. Pourquoi ? Voici quelques raisons :

  • Le code sera plus difficile pour vous à déboguer et à maintenir, et il sera plus compliqué à comprendre pour les autres personnes. Cela prend quelques microsecondes au microprocesseur pour exécuter ce code, mais cela pourra vous prendre des heures pour comprendre ce qui ne fonctionne pas correctement et pour le corriger ! Votre temps a de la valeur, n'est-ce pas ? Mais le temps du microcontrôleur est bon marché, mesuré au coût de l'électricité utilisée pour l'alimenter (c'est à dire presque rien). D'une manière générale, vous avez intérêt à écrire le code de la façon la plus évidente.
  • Le code est moins portable. Si vous utilisez les instructions digitalRead() et digitalWrite, il est beaucoup plus facile d'écrire le code qui fonctionnera sur tous les différents microcontrôleurs Atmel utilisés sur les cartes Arduino, alors que les registres de contrôle et de port peuvent être différent pour chaque sorte de microcontrôleur.
  • Il est plus facile de créer des dysfonctionnements inattendus avec l'accès direct aux port. Noter comment la ligne DDRD=B11111110; indique qu'il faut laisser la broche 0 en entrée. La broche 0 est la ligne de réception sur le port série (RX). Il pourrait être vraiment facile de stopper le fonctionnement du port série en mettant la broche 0 en sortie ! Et il serait très déroutant d'être soudainement incapable de recevoir des données sur le port série, n'est-ce pas ?

Vous allez probablement vous demandez : "bien, pourquoi voudrais-je alors utiliser ce truc ? " Voici quelques avantages positifs de l'accès direct aux ports :

  • Vour pourriez avoir besoin d'être capable de mettre un niveau HAUT ou BAS sur une broche très rapidement, en une fractions de microsecondes. Si vous regardez le code source dans le fichier lib/targets/arduino/wiring.c, vous verrez que les instructions digitalRead() et digitalWrite prennent chacune environ une douzaine de ligne code, lesquelles seront compilées en quelques instructions machine. Chaque instruction machine demande 1 cycle d'horloge à 16 Mhz, ce qui peut être ajouté dans les applications sensibles au temps. L'accès direct au port permet de réaliser la même chose en quelques cycles d'horloge seulement.
  • Parfois, vous pouvez avoir besoin de mettre au même niveau plusieurs broches en sortie exactement au même moment. En appelant l'instruction digitalWrite(10,HIGH); suivie par une autre instruction digitalWrite(11,HIGH]]; entraînera une mise au niveau HAUT de la broche 10 plusieurs microsecondes avant la broche 11, ce qui pourrait perturber certains circuits externes sensibles au temps que vous auriez connectés. Par contre, vous pouvez mettre au même niveau exactement au même moment les broches en utilisant PORTB |= B1100;
  • Si vous êtes limité en programme mémoire, vous pouvez utiliser cette méthode pour rendre votre code plus petit. Cela requiert un peu moins d'octets de code compilé d'écrire simultanément sur plusieurs broches via le registre de port que d'utiliser une boucle for pour chaque broche séparément. Dans certains cas, ceci fera la différence pour réussir à programmer ou non votre programme dans la mémoire flash du microcontrôleur.

Voir également :

Commentaires utilisateurs

  • Utiliser la modification directe des ports rend le code moins portable, car il dépend du matériel utilisé, à la différence des instructions digitalRead() ou pinMode()

Page d'accueil de la référence Arduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées sur le Forum Arduino ou à l'adresse suivante : support_at_mon-club-elec_point_fr

Le texte original de la référence Arduino est sous licence Creative Commons Attribution-ShareAlike 3.0 . Les exemples de code dans la référence sont dans le domaine public.

La présente traduction française commentée a été réalisée par Xavier HINAULT (2010-2012) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0.

Traduction de la page originale : http://www.arduino.cc/en/Reference/PortManipulation