Exercice : Utilisation d'opérateurs logiques

Simulateur

Cet exercice est à réaliser avec le simulateur en ligne Wokwi

Nous utiliserons le schéma suivant :

Commande de deux LEDs à partir de deux interrupteurs à 2 positions (poussoirs)

Question

Il est demandé de réaliser le schéma ci-dessus sur le simulateur

Cahier des charges

Le fonctionnement souhaité est décrit par la vidéo suivante :

L'état de chaque interrupteur est signalé par la LED correspondante.

On rappelle que différentes variables permettent de gérer les ports d'entrées/sorties comme indiqué dans la documentation.

Dans cet exercice, seuls les bits de port 4 à 7 seront utilisés : il conviendra de ne pas perturber l'état des bits 0 à 3.

Rappels sur les opérations logiques à utiliser

On se propose dans un premier temps d'étudier les fonctions logiques à utiliser. On rappelle les tables de vérité des fonctions OU et ET :

a

b

a OU b

0

0

0

0

1

1

1

0

1

1

1

1

a

b

a ET b

0

0

0

0

1

0

1

0

0

1

1

1

Question

Quelle opération de logique permet de forcer des bits à 1 ?

Question

Quelle opération de logique permet de forcer des bits à 0 ?

Question

Imaginons qu'une variable \(x\) contient la valeur binaire 01001101 et qu'on souhaite forcer à 0 le bit 6 pour obtenir la valeur 00001101 : quelle opération binaire permettra cela ? En aucun cas les valeurs des autres bits ne doivent être modifiées.

Solution

1
x = B01001101;
2
  PORTD = x; //Ecriture de la valeur de x dans le port D
3
  delay(2000);            
4
  x = x & B10111111; //Forçage à 0 du bit 6
5
  PORTD = x; réécriture dans le port D
6
  delay(2000); 

Question

Si maintenant \(x\) contient la valeur 00001101 et qu'on souhaite forcer à 1 le bit 7 pour obtenir la valeur 10001101 : quelle opération binaire permettra cela ? En aucun cas les valeurs des autres bits ne doivent être modifiées.

Solution

1
x = B00001101;
2
  PORTD = x;
3
  delay(2000);            
4
  x = x | B10000000;
5
  PORTD = x;
6
  delay(2000)

Réglage de la variable DDRD

Il est conseillé de consulter la documentation.

Question

Quel est la valeur binaire à placer dans les bits 4 à 7 de la variable DDRD pour obtenir le réglage correspondant au schéma ?

Question

Quel séquence de programme va permettre de placer en entrée les bits 6 et 7 et en sortie les bits 4 et 5 sans que les bits 0 à 3 ne soient modifiés ?

Question

Implémentez et testez la séquence.

Écriture et lecture du port

La documentation indique que pour écrire dans le port, pour, par exemple, fixer l'état des LEDs, il faut utiliser la variable PORTD. Pour lire le port, il faut utiliser la variable PIND. L'algorithme qui va permettre de « recopier » l'état des poussoirs sur les deux LEDs est le suivant :

  1. lire le contenu du port dans une variable poussoirs

  2. « nettoyer » (c'est-à-dire mettre à 0 les bits inutilisés) le contenu de la variable poussoirs pour ne garder que l'état des bits 6 et 7 (l'état des autres bits étant imprévisible)

  3. décaler le contenu nettoyé de la variable poussoirs de deux bits vers la droite (pour s'aligner avec les bits correspondant aux LEDs)

  4. éteindre les deux LEDs (sans modifier les autres bits de port)

  5. allumer la ou les LEDs en fonction de l'état de poussoirs (sans modifier les autres bits) en utilisant la fonction logique adéquate.

Question

Implémentez et testez l'algorithme proposé

Solution

1
byte poussoirs;
2
void setup()
3
{
4
  //Il faut mettre à 0 les bits 6 et 7 et à 1 les bits 4 et 5 sans toucher aux autres bits 
5
  DDRD = DDRD & B00111111;
6
  DDRD = DDRD | B00110000;
7
  Serial.begin(9600);
8
}
9
10
void loop()
11
{
12
  poussoirs = PIND;//Lecture du port
13
  poussoirs = poussoirs & B11000000; //masque pour la récupération de l'état des deux interrupteurs
14
  poussoirs = poussoirs >> 2; //Décalage de deux bits vers la droite (pour préparer la commande les LEDs)
15
  PORTD = PORTD & B11001111; //On éteint les LEDs
16
  PORTD = PORTD | poussoirs; //un "OU" va permettre de n'allumer que ce qui est nécessaire
17
  Serial.print("Etat des poussoirs : ");
18
  Serial.println(poussoirs,BIN);
19
}
20