Go Down

Topic: Lire un bit d'une variable ? (Read 992 times) previous topic - next topic

Forhorse

Bonjour à tous,
(désolé si je post dans la mauvaise section, mais je pense que la réponse peut servir à d'autres)

Je suis tout nouveau dans le monde de l'Arduino, du C et des AVR. Habituellement je développe en BASIC sur des PIC avec Proton+
Je cherche à faire un truc qui me semble tout bête en BASIC mais je ne trouve pas l'équivalent en C
Admetons que j'ai une variable quelconque, un int par exemple, et que je veuille lire 1 seul bit de cette variable pour l'attribuer à un boolean ou même directement à une sortie.

En BASIC j'écrirais ça ainsi
Code: [Select]

dim mavariable as word
dim bitvar as bit

mavariable = 5891
bitvar = mavariable.0 'lit le bit 0 de la variable (LSB)
bitvar = mavariable.15 'lit le bit 15 de la variable (MSB)

portB.1 = mavariable.8 'met la sortie 1 du port B à 1 si le premier bit du deuxième octet est à 1


voyez c'est tout simple et c'est comme ça qu'on fait en BASIC. Sauf que je ne trouve pas l'équivalent en C, même en passant par des opérateur logique genre & et | pour n'extraire qu'un seul bit, je ne trouve cependant pas comment passer d'un byte ou d'un int vers un boolean !
Merci d'avance.

Jean-François

#1
Dec 28, 2012, 01:01 pm Last Edit: Dec 28, 2012, 01:09 pm by Jean-François Reason: 1

désolé si je post dans la mauvaise section, mais je pense que la réponse peut servir à d'autres



Sauf que ce n'est pas un cours, ni un tutoriel, mais une simple question, donc je le déplace dans la catégorie généraliste du forum  XD
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

B@tto

#2
Dec 28, 2012, 01:04 pm Last Edit: Dec 28, 2012, 01:12 pm by B@tto Reason: 1
En effet mauvaise section ^^' pas grave le grand chef est pas loin pour le déplacer ;)

Pour ce genre de manipulation on peut utiliser les bitwise : http://www.arduino.cc/en/Reference/Bitwise
Par exemple pour récuperer le LSB tu peux faire :
Code: [Select]

int mavariable=4;
mavariable &= 1; // 100 & 001 = 000
mavariable=5;
mavariable &= 1; // 101 & 001 = 001

Tu peux aussi utiliser ça : http://arduino.cc/en/Reference/BitRead

Après tu peut manipuler les pin par port : http://www.arduino.cc/en/Reference/PortManipulation
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Forhorse

Merci pour le déplacement, j'avais pas vu qu'il y avait une section généraliste (a cause de la dimension de la fenêtre de mon navigateur je ne voyais que les sous-sections et j'ai pas trouvé celle qui était le plus adapté  :smiley-red:)

bitRead semble effectivement le plus proche de ce que je cherche à faire, et répond exactement au problème, merci !
la technique du bitwise (que l'on peut aussi faire en BASIC) ne correspond pas, parce qu'au final on se retrouve quand même avec une variable du type de départ (qui ne contient que 0 ou 1 c'est vrai) et pas un boolean

B@tto

Bin la j'ai travaillé sur mavariable, rien n'empêche de jouer avec un boolean :

int mavariable=4;
boolean i;
i = mavariable & 1; // 100 & 001 = 0
mavariable=5;
i = mavariable & 1; // 101 & 001 = 1
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

skywodd


bitRead semble effectivement le plus proche de ce que je cherche à faire, et répond exactement au problème, merci !
la technique du bitwise (que l'on peut aussi faire en BASIC) ne correspond pas, parce qu'au final on se retrouve quand même avec une variable du type de départ (qui ne contient que 0 ou 1 c'est vrai) et pas un boolean

Toutes valeurs autre que 0 est vrai (true) en C/C++ ;)

Tu peut donc faire sans problème des tests logiques sur du bitwise, exemple :
Code: [Select]
if (variable & (1 << 2)) {
    // le bit 3 (ou 2 en partant de 0) de "variable" est à "1"
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up