les sorties digitales

Pour utiliser une broche en sortie on la configure avec pinMode(numero_broche,OUTPUT); On déclare les broches en entrée ou sortie dans la fonction setup.

void setup()   {                 
  pinMode(13, OUTPUT);    //la broche 2 est configurée en sortie
}

pour pour passer une broche à l'état haut ou bas c'est très simple
pour passer la led à l'état haut

digitalWrite(13, HIGH);   //allumer la led broche 13

pour passer la led à l'état bas

digitalWrite(13, LOW);   //éteindre la led broche 13

utiliser des constantes pour assigner les broches

afin de pouvoir se retrouver facilement dans le code et aussi pour pouvoir modifier facilement le brochage sans avoir à modifier tout le code on utilise des constantes pour assigner les broches. c'est une bonne habitude d'utiliser cette méthode systématiquement car elle rend le code plus propre fait gagner beaucoup de temps. très utile aussi lorsque que l'on prend un code existant comme base pour en faire un nouveau…

ex:

const int ledPin =  13;    // LED connectée sur la broche 13

les constantes se déclarent avant la partie setup (cd prog>base structure d'un programme)

du coup lorsque que l'on veut changer l'état de la led c'est plus lisible

digitalWrite(ledPin, LOW);   //éteindre la led

écrire sur tout un port à la fois

pour écrire cet article je me suis pas basé sur un article très bien fait. appronfondir le sujet voici le lien vers l'article l'original: Booster le temps de réponse de votre Arduino

il est souvent utile des pouvoir changer l'état de plusieurs broches à la fois.
par ex pour faire une matrice de led.

pour aborder ce problème mettons nous du côté du microcontroleur. si on prends par ex un arduino uno il va être construit autour d'un avr atmega 328. habituellement cette gamme de microcontroleur se programme en C (par ex avec avr-gcc) et lorsque que l'on veut changer l'état d'une ou de plusieurs broches on va s'adresser au port dont font partie ces broches.
un petit dessin expliquera les choses plus clairement…

on voit bien sur le dessin ci-dessus que chaque broche de l'arduino représente une broche de l'AVR mais sur l'arduino les broches sont renuméroté. par ex la broche 11 de l'arduino représente en fait la broche 3 du portB (PB3).
est-ce vraiment un bonne idée que d'avoir renommé les broches… on ne va pas refaire l'arduino et ça amène aussi une simplicité mais il faut toujours garder à l'esprit les entrées/sortie réels du microcontroleur. en effet en électronique le lien logiciel/matériel est très fort et on se rend vite compte que lorsqu'on démarre un projet,il faut choisir avec attention qu'elle broche utiliser pour ne pas se retrouvé bloqué par la suite.

voyons comment écrire directement sur un port en entier:
si je veux par ex mettre à l'état haut les broches PD0, PD1, PD2,et PD3 et mettre à l'état bas les broches PD4,PD5,PD6,PD7 une ligne suffit.

// sortie 76543210
//        ↓↓↓↓↓↓↓↓
PORTD = 0b00001111;

on pourrait utiliser la valeur décimale et écrire PORTD = 15; mais utiliser directement la valeur binaire rend le code bien plus lisible.
je ne vais pas rentrer sur l'explication de la notation binaire (un petit lien pour ceux qui ne sont pas très à l'aise avec le binaire https://openclassrooms.com/courses/du-decimal-au-binaire) mais ce qu'il faut retenir ici c'est que le bit de poids faible (le plus à droite) représente la broche 0 du port.

il faute noter que l'on gagne pas mal de temps d'exécution car l'instruction s'exécute en une seul fois, si on avait du faire 8x digitalWrite le programme aurait perdu pas mal de cycle d'horloge pour exécuter tout ça. c'est relatif mais dans certains cas ça peut être critique

changer l'état d'une ou plusieurs broches

Le problème avec l'exemple ci-dessus c'est que l'on change l'état de toute les broches du port D. en général ce que l'on cherche à faire c'est changer l'état de certaines broches sans toucher au reste.
pour ce faire on va utiliser des masque qui vont nous permettre de faire une opération binaire (algèbre de boole).
Je vais juste présenter ici les quelques bases qui vont nous servir concrètement.Sinon pour ceux qui veulent mieux comprendre l'algèbre de boole: http://www.siteduzero.com/informatique/tutoriels/l-algebre-de-boole

L'opérateur AND (&) et NAND(& -):

Il correspond à l'intersection de deux conditions. Par exemple : je souhaite acheter une voiture bleue ET climatisée. Les voitures correspondant à mon choix seront donc à la fois bleue et climatisée. l'opération sera vraie si les 2 conditions sont vraies
vrai ET vrai = vrai
mais vrai ET faux = faux
pour y voir plus clair on utilise une table de vérité. voici la table de vérité de l'opération AND:
a b a&b
0 0 0
1 0 0
0 1 0
1 1 1

opération NAND en une opération AND couplée à une opération NOT. voici la table de vérité de l'opération NAND:
a b a&-b
0 0 1
1 0 1
0 1 1
1 1 0

L'opérateur OR (|):

Il correspond à la réunion de deux conditions. Par exemple : je souhaite acheter une voiture bleue OU climatisée. Les voitures correspondant à mon choix seront donc soit bleue, soit climatisée, soit les deux à la fois. l'opération sera vraie si les une des condition est vraie
vrai OU faux = vrai

voici la table de vérité de l'opération OR:
a b a|b
0 0 0
1 0 1
0 1 1
1 1 1

mettre une ou plusieurs broches à l'état haut (OR)

maintenant que l'on sait comment ça marche voyons ce que ça donne avec sur des octets.
faisons une opération binaire OR en prenant 2 octets:
01010000
00011100
↓↓↓↓↓↓↓↓
01011100

on voit ici qu'en faisant un OR on peut mettre une ou plusieurs broches à l'état haut (HIGH) sans modifier l'état des autres broches.

voici ce que ça donnerait en code:

PORTD=PORTD | 0b00000110; //ici on passe PD1 et PD2 (le bit le plus à droite correspond à PD0) à l'état haut sans changer l'état des autres broches\\
PORTD |= 0b00000110; //même chose que ci-dessus mais avec une écriture condensé

mettre une ou plusieurs broches à l'état bas (NAND)

si faisons une opération binaire AND en prenant 2 octets:
01010000
11101111
↓↓↓↓↓↓↓↓
01000000

on voit ici qu'en faisant une opération AND on peut mettre une ou plusieurs broches à l'état bas (LOW) sans modifier l'état des autres broches.
ex:

PORTD &= 0b11011111; //ici on passe PD5 (le bit le plus à droite correspond à PD0) à l'état bas sans changer l'état des autres broches\\

on peut aussi coupler une opération AND avec une opération NOT (NAND).

PORTD &= -0b00100000; //ici on passe PD5 (le bit le plus à droite correspond à PD0) à l'état bas sans changer l'état des autres broches\\

je trouve qu'utiliser une opération NAND est plus claire mais c'est une histoire de goût. de toutes méthodes fonctionnent.


prog/digital_out.txt · Dernière modification: 2016/05/17 04:35 par admin_memo