Vous êtes sur la page 1sur 11
Université de Bla ~ Département d'électronique (2022/2023 Annexe TP1 Opérateurs "bit & bit” (Bitwise Operations) La manipulation de bits individuels est l'un des concepts les plus importants et les plus fondamentaux comprendre lors de la programmation des microcontréleurs. La manipulation des bits est nécessaire pour : - Lire l'état des composants, - Définir les paramétres - Modifier l'état des broches de sortie d’un microcontréleur. Ilest important de savoir comment changer individuellement les états de certains bits tout en laissant les autres inchangés. Dans ce qui suit, nous allons voir comment utiliser ces opérateurs binaires en langage C et montrer comment ils sont utilisés pour effectuer certaines opérations avec un microcontréleur de la famille AVR. Fondamentalement, il existe six types d'opérateurs binaires : ‘© Opérateur bit 8 bit ET (Bitwise AND) ~ noté par‘ &’ ‘+ Opérateur bit & bit OU (Bitwise OR) —noté par ‘|’ ‘© Opérateur bit & bit Ou exclusif (Bitwise XOR) ~ noté par by ‘4? + Opérateur bit a bit NON (Bitwise NOT) — noté par‘ ~ ’ © Opérateur de décalage de bits & droite (Bitwise Right Shift) —noté par ‘>>’ ‘+ Opérateur de décalage de bits & gauche (Bitwise Left Shift)~noté par ‘<<’ Table des conversions des valeurs decimales, binires et hexadecimales: Binaire Hexadécimale Décimale 0000 0 o 0001 1 1 0010 2 2 oott 3 3 ‘0100 4 4 101 5 5 o110 6 6 O11 7 7 1000 8 a 1001 9 9 1010 A 10 1011 B tL 1100 c 12 1101 D B 1110 E 4 iit F 15 ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wisccantrleas Vai Université de Bla ~ Département d'électronique (2022/2023 1 Opérateur bit & bit ET (&) (AND) lest représenté par le caractére :&, et réalise lopération « ET » entre chaque bit des deux opérandes aA lB A&B 1 [0 0 a [a 1 o [o 0 ofa 0 Exemple : inta= 92; //en binaire : 0000000001011100 intb=101; — // en binaire : 0000000001100101 intc=a&b; //résultat: 0000000001000100, ou 68 en décimal. Une des utilisations les plus communes de l'opérateur ET bit & bit est de sélectionner un bit (ou des bits) particulier(s) d'une valeur entiére, par une opération de masquage: int x=0b00101100 ; int mask = 010000000 ; // sélection du bit 7 (b7) int y=x & mask; —_// permet de déterminer Ia valeur du bit7 de x (b7=0 si y=0, b7=1 sinon) // Tous les bits autres que b7 ont été mosqués. 2- Opérateur bit a bit OU (|) (OR) lest représenté par le caractére : |, ils'applique a deux opérandes placés de part et d'autre de 'opérateur cet réalise l'opération « OU » entre chaque bit des deux opérandes olole|el> RlolHlolm Blolele [=| Exemple : inta= 92; // en binaire :0000000001011100 int b= 101; // en binaire : 0000000001100101 int c=2 | b; //résulat: 0000000001111101, ou 125 en décimal. ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wisccantrleas Vai Université de Bla ~ Département d'électronique (2022/2023 une des utilisations les plus courantes de l'opérateur « OU » est la mise a 1 d'un (ou plusieurs) bit(s) d'une variable sans toucher aux autres, par une opération de masquage. x =x | 0x18; // permet de mettre @ 1 les bits 3 et 4 de la variable x 3+ Opérateur "bit a bit” OU EXCLUSIF (4) (XOR) Uopérateur “bit & bit" OU EXCLUSIF est écrit en utilisant le symbole *. Cet opérateur est tres semblable 3 Vopérateur |, 8 la différence qu'il renvoie la valeur 0 sir les deux bits d'entrée sont 8 1 ANB ofolnlHl> rlolHlole nlolelH|> Une autre facon de voir 'opérateur OU EXCLUSIF est que le bit de résultat vaut 1 si (et seulement si) les entrées sont différentes, ou 0 sielles sont identiques. Exemple : intx=12; //binaire: 1100 // binaire: 1010 y; // binaire: 0110, ou 6 en décimal intz Uopérateur * est souvent utilisé pour inverser (c8d changer les 0 en 1 et les 1 en 0) de quelques bits d'une expression entire, Dans une opération bit a bit OU EXCLUSIF, s'il ya un 1 dans le bit de masque, ce bit sera inversé; siil y a un O, le bit n'est pas inversé et reste le méme. x =x A418; //inverse les bits 1 et 4 de fa variable x 4- Opérateur “bit bit" NON (~) Ulopérateur bit & bit NON est appliqué & une seule expression numérique entire & sa droite. L’opérateur “bit & bit” NON change chaque bit en son opposé : O devient 1 et 1 devient 0. Ainsi : Alva 0 1 1 Exemple int a= 103; //binair intb=~a; //binaire : 0000000001100111 1111111110011000 = -104 5+ Les opérateurs de décalage des bits: lly a deux opérateurs de décalage: ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wisccantrleas Vai Université de Bla ~ Département d'électronique (2022/2023 ~décalage & gauche représenté par lescaractéres : << ~décalage a droite représenté par lescaractéres: | >> Ces opérateurs entrainent le décalage des bits vers la droite ou vers la gauche de I'expression entiére située & gauche de l'opérateur d'un nombre de positions spécifié par I'expression numérique entiére de droite. Syntaxe : © x< décale x de y bits @ gauche + x>>y > décale xde y bits 8 droite Table de vérité pour le décalage & gauche utilisant une variable & bits 0x01<<0 = 0b00000001 0x01<<1 = 000000010 (0x01<<2 = 000000100 0x01<<3 = 0b00001000 (0x01<<4 = 000010000 0x01<<5 = 000100000 0x01<<6 = 0b01000000 0x01<<7 = 0b10000000 Table de vérité pour le décalage 4 droite utilisant une variable 8 bits 0x80>>1 = 0b01000000 0x80>>2 = 0b00100000 (0x80>>3 = 0b00010000 0x80>>4 = 0b00001000 (0x80>>5 = 0b00000100 0x80>>6 = 0b00000010 0x80>>7 = 0b00000001 Exemples int // binaire: 0000000000000101 int b=a<<3; //binaire: 0000000000101000, ou 40 en décimal int c= >> 3; // binaire: 0000000000000101, ou ou décalage vers ia droite Lorsque vous décalez une valeur x de y bits (x<>n»: les n bits de x les plus & droite (18) qui vont sortir, seront définitivement perdus le remplacement des n bits vacants de gauche dépend du type de la variable x: six est non signé, des '0' sontrentrés six est signé, le bit de signe est propagé (c-d-d : '0' six>0 ou '1'six>3; // bingire: 1111111111111110 ou int x =-16; // binoire: 1111111111110000 inty=unsigned{(x)>> 3; //binoire: 0001111111111110 Important : Pour écrire un nombre ayant seulement le bit dordre n a 1, Ilsuffit d’écrire (1<>=b équivaut 8a=a>>b Notion de masque de bits En général, le masquage est un processus dans lequel nous cachons les informations (bits) qui ne sont pas nécessaires. Un masque de bits est un nombre binaire dans lequel les bits souhaités sont & un et les autres sont & 0. Un masque de bits est utilisé pour accéder & des bits spécifiques dans un octet de données, Nous pouvons utiliser opérateur << pour créer des masques de bits 1/ Pour construire un masque de bits avec bit 1 defini (0x01 << 1) 1/ Pour eréer un masque de bits avecle bit § défin! (oxo1 <<5) J/ Pour créer un masque de bits avec les bits 1 et 5 définis (0x01 << 1 | 0x01 << 5) ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wisccantrleas Vai Université de Bla ~ Département d'électronique (2022/2023 Le masque de bits va servir a l'aide d'un opérateur binaire (ET, OU, XOR,..) a lire, positioner, ou tester des bits Individuels. Exemple : Nous avons huit commutateurs connactés au PORTB de notre micracontréleur, un commutateur a chaque broche de PORTS, si hous voulons lire uniquement PB2 et PBS, dans ce cas, nous utiliserions le processus de masquage pour masquer nos Informations restantes. Un moyen simple d'y parvenir serait d’ utiliser le masque avec Vopérateur binaire ET PB7 | PBS | PBS | PBA | PBS | PB? | PBI | PEO | PORTE o fo [a [fo [fo [a [o [0 |Masqueer o lo Jresfo Jo |rszfo [o [pine amasque Remarque : Ici, nous avons effectué une opération ET au niveau du bit sur la sortie que nous avons initialement recue via la commande PINB Les bits qui ne nous intéresse pas ont été caché par Fopérateur ET (0 dans le masque}, et les bits qui nous intéressent (PB2 et PBS) ont été conservé par le masque ET (1 dans le masque). 6- Utilisation pratique des opérateurs logiques avec les microcontréleurs. Une utilisation courante des opérateurs bit a bit ET et OU est d’agir sur les ports d’un microcontréleur. Soit en lecture ou en écriture. Sur un microcontréleur, un port est souvent un registre 8 8 bits qui représente l'état des broches. Ecrire sur un port contréle toutes les broches d'un coup. Par exemple, le PORTD est une constante prédéfinie du langage Arduino qui se réfere & du port D, les broches 0 8 7 d'une carte Arduino. Pour chaque bit qui est & 1, la broche est au niveau HAUT. (Les broches doivent bien stir étre configurées en sortie en mettant les valeurs appropriées dans le registre DDRD (équivalent 8 l'utilisation de la fonction pinMode()). rat des broches 6.1- Set bit Soit un registre REG, pour mettre un bit 8 la valeur 1, le probleme se pose de la maniére suivante : Le registre REG contient les valeurs : x7 | x6 | x5 | xa | x3 | x2] x1] x0 Les valeurs de ces bits sont 2 priori inconnues. Aprés l'opération Set Bit sur le bit 6, on souhaite obtenir les valeurs suivantes : x7 | a] xs [x4] x3 [x2 | x1] x0 dans le registre REG. Les lois de I'algebre de Boole nous affirment les égalités suivantes : ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wisccantrleas Vai Université de Bla ~ Département d'électronique (2022/2023 A.0=0 ALL (Lest 'élément neutre du ET A+ 0=A (Oest I'élément neutre du OU) Asi=1 ‘On remarque rapidement que la fonction OU va nous permettre de réaliser la mise & 1 d'un bit: x7 | x6 | x5 | x4 | x3 x2 x1 x0 01000000 Vopérateur OU s'appliquant 8 un champ de bits s‘écrit | en C. II ne faut pas le confondre avec l'opérateur || qui s'applique a deux valeurs vues comme des booléens (la valeur 0 correspondant a faux et toute valeur différente de zéro correspondant a vrai). Uopération Set Bit s'écrit donc, dans notre exemple REG = REG | 0601000000 ; ou de fagon compacte _(puisque 01000000- REG |= (1<<6) Le bit 6 est mis 1 sans toucher aux autres bits du registre 1<<6)) ‘On peut noter les valeurs directement en binaire, ou en hexa-décimal, ou encore en décimal, rend les programmes peu lisibles. Exemple avec le PORTD d'un microcontréleur AVR PORTD |= (1<> 3; 2&me Méthode EXVAL= (REG >> 3) & 1111; 6.7 Surveillance (Monitoring) d’un bit La surveillance de l'état d’un bit est trés importante dans la programmation des microcontrdleurs car nous avons souvent besoin de vérifier ou de surveiller l'état de certains bits dans un registre d'un microcontrdleur. Par exemple, les bits d'indicateur d'interruption, qui sont généralement définis par le matériel, doivent étre surveillés et procéder a l'exécution de IISR. Deux cas de figures se présentent : 6.8 Détecter un changement de 01 Par exemple, si nous voulons surveiller le 4*"* bit pour un changement de 0 a 1, nous pouvons utiliser le code suivant. while (REG & (1 << 4) } f } Détecter un un changement de 1.40 De la méme maniére, si nous voulons surveiller le 4** bit pour un changement de 1 2 0, nous pouvons utiliser le code suivant. while ( “(REG & (1<< 4)}) Utilisation du #define Pour rendre encore plus lisible un programme, on utilisera trés souvent la définition de constantes en C par un #ldefine. Il s‘agit plus exactement d’un ordre de traduction donné au préprocesseur. Voici un exemple: Exemple H#define RedLedOn P1OUT |= (1<<0} // allumer la LED rouge #tdefine RedLedOff PLOUT &=~(1<<0) // éteindre la LED rouge Hidefine RedLedToggle POUT *= (1<<0} // inverser l'état de la LED rouge ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wisccantrleas Vai Université de Bla ~ Département d'électronique (2022/2023 Exemple : int j, int j void setup(}{ DDRD = DDRD | B11111100; // initialise la direction des bits 2 a 7, laissant les bits 0 et 1 inchangés (xx | 00 om) //identique a pinMode(pin, OUTPUT) pour les broches 2.87 Setial.begin(9600); //initialise connexion série } void loop(}{ for (i=0; i<64; i++}{ PORTD = PORTD & 800000011; // met 30 les broches 28 7, laissant les broches 0 et 1 inchangées (xx & 11 ==) j= (ise 2); // décale la variable des broches 2-7 - pour avoir les broches Oet 1 PORTD=PORTD |j; _// combine la nouvelle information avec celle des broches de LED Serial.printin(?ORTD, BIN); // envoi série pour montrer le masquage delay(100); t } ‘Waser 1 ESE, Daw Bide, Dep Hecronigue TP Wieracontrleus Var

Vous aimerez peut-être aussi