Aller au contenu

Utiliser les PIC 16F et 18F/Exercices/Introduction au langage C

Leçons de niveau 15
Une page de Wikiversité, la communauté pédagogique libre.
Introduction au langage C
Image logo représentative de la faculté
Exercices no5
Leçon : Utiliser les PIC 16F et 18F
Chapitre du cours : Introduction au langage C

Exercices de niveau 15.

Exo préc. :Les sous-programmes en assembleur
Exo suiv. :Les ports et le langage C
En raison de limitations techniques, la typographie souhaitable du titre, « Exercice : Introduction au langage C
Utiliser les PIC 16F et 18F/Exercices/Introduction au langage C
 », n'a pu être restituée correctement ci-dessus.




Enlever les parenthèses des expressions suivantes lorsqu'elles peuvent être retirées.

a = (25 * 12) + b;
if ((a>4) &&(b==18)) { }
((a>=6)&&(b<18))||(c!=18)
c = (a = (b+10));

Évaluer ces expressions pour a=6, b=18 et c=24.

Si une variable p1 de type signed char (8 bits signés) est déclarée écrire les expressions en C permettant de :

  • mettre à 1 le bit b2
  • mettre à 1 le bit b3 et b6
  • mettre à 0 le bit b0
  • mettre à 0 le bit b4 et b5
  • inverser le bit b3 (se fait facilement avec un ou exclusif)
  • mettre à 1 le bit b2 et à 0 le bit b0
  • mettre à 1 les bits b0 et b7 et à 0 les bits b3 et b4

On donne le sous-programme suivant (tiré d'un ancien projet inter-semestre) :

void conversion(char nb,char result[8]){
  char i;
  for(i=7;i>=0;i--) 
    if ((nb & (1<<i)) == (1<<i)) 
      result[i]=1; 
    else result[i]=0;
}

dont l'objectif est de convertir du décimal en binaire.

1) Peut-on retirer des parenthèses dans l’expression booléenne du if ?

2) Peut-on écrire (nb & (1<<i)) au lieu de ((nb & (1<<i)) == (1<<i))?

3) Construire l’expression booléenne qui permettrait l'écriture

 
for(i=7;i>=0;i--) if (E.B.?????) result[i]=0; 
                    else result[i]=1;

en donnant toujours le même le même résultat de conversion.

4) Modifier le programme pour qu’il fasse une conversion d'entier (16 bits) vers le binaire.

5) Est-ce que l'algorithme suivant donne le même résultat de conversion :

 
  for(i=7;i>=;i--) { 
	result[i]=nb%(2);
	nb = nb / 2;
  }

Soit une variable :

char nb;

Écrire les expressions permettant de calculer les centaines, les dizaines et les unité de cette variable.

Différence entre && et & Évaluer les expressions :

  • a & b
  • a && b

pour a= 0xF0 et b=0x0F

En déduire les valeurs booléennes correspondantes (si ces expressions étaient utilisées dans un if par exemple). Construire des expressions booléennes sur les tests suivants

expression vraie si :

  • le bit b6 est à 1
  • le bit b3 est à 0
  • le bit b2 est à 1 et le bit b4 est à 0
  • le bit b2 est à 1 ou le bit b7 est à 0
  • le bit b6 est l'inverse du bit b3 (sans utiliser de décalages)

Quelle opération arithmétique est réalisée par un décalage ? Évaluer pour cela les expressions suivantes (avec a=12 et b=23) :

  • a = a >> 1 (ou a >>= 1)
  • a = a >> 2 (ou a >>= 2)
  • b = b << 1 (ou b <<=1)
  • b = b << 2 (ou b <<=2)

Généralisation.

Construire une vraie expression booléenne avec opérateur de décalage, & et ^ qui reprend le test de l'exercice précédent : le bit b6 est l'inverse du bit b3

Soit le programme suivant :

#include <stdio.h>
main() {
  int n=10,p=5,q=10,r;
  r= n == (p = q);
  printf("A : n = %d p = %d q= %d r = %d\n",n,p,q,r);
  n = p = q = 5;
  n += p += q;
  printf("B : n = %d p = %d q= %d\n",n,p,q);
  q = n++<p || p++ != 3;
  printf("C : n = %d p = %d q= %d\n",n,p,q);
  q = ++n == 3 && ++p == 3;
  printf("D : n = %d p = %d q= %d\n",n,p,q);
  return 0;
}

Que donnera-t-il comme affichage sur l'écran ?