OBTENIR L'ETAT DES BITS QUI COMPOSENT UN OCTET (CONVERSION XX->BINAIRE)

TanKu Messages postés 3 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 14 décembre 2005 - 14 déc. 2005 à 23:52
Melodie_Nelson Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 17 mai 2006 - 17 mai 2006 à 09:48
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35098-obtenir-l-etat-des-bits-qui-composent-un-octet-conversion-xx-binaire

Melodie_Nelson Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 17 mai 2006
17 mai 2006 à 09:48
OK,
Mais en fait c'est bon j'ai réussi à régler ce problème. Mais j'en ai d'autres du coup maintenant.
Je vais donc aller voir sur jelectronique, merci
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
16 mai 2006 à 11:39
On en chie tous le c est un anti language. Il doit rester réservé à des élus. On passe tellement de temps à apprendre à l'utiliser qu'aprés... une fois qu'on est dans le clan on refuse les autres outils avec dédain. je te dis ça j'ai commencer à programmer en hexa (et oui) puis en assembleur puis en basic (le vieu truc pourris) puis en gw basic. Et d'un coup j'ai commencé à respirer avec le pascal en enfin visual basic. Maintenant je suis punis et doit rétrograder au c.

Pour ton pb : si tu envoies le mot (qqs sa base) sur le port, ça devrait marcher sans pb. Ton compilateur s'en charge.Je ne connait pas le lpc2138 ni le compilateur que tu utilise mais bon je n'en connait pas pour lesquels ça ne marche pas.

Ceci dit j'interviens aussi sur un autre forum, plus dédié à ce type d'utilisation du c. L'avantage c'est que la bas tout le monde est électronicien et donc tu auras des réponses rapides et pointus.

Je te met l'adresse : http://forums.jelectronique.com/
Melodie_Nelson Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 17 mai 2006
15 mai 2006 à 16:00
Merci.
Pfffou, j'en chie.
Tant qu'on y est j'ai une autre question ( enfin j'en ai des millions mais bon ).
Euh, comment dire, donc je commande mon LCD à partir d'un LPC2138. Et je ne sais pas comment assigner mes 8 bits de data du LCD. Je vais les commander en hexa.
Par ex : lcd_data(0x38)
donc ensuite ma procédure lcd_data(infodata) doit transformer ce code hexa pour assigner les 8 bits.
J'ai un peu du mal à expliquer parce que je ne comprends pas le problème.
Voici en gros mon programme :

union IO_PORT
{
u16 W;
u32 DW;
struct
{
u08 LSB;
u08 MLSB;
u08 MMSB;
u08 MSB;
} B2DW;
//etc

//l'afficheur est câblé sur les ports P0.16 à 23, ce qui correspond à B2DW.MMSB

//et on trouve aussi ça dans le fichier LPC_io.h :
#define IDE_PORT_L IO_IO1PIN->B2DW.MMSB


//ensuite :

void init_aff(void) /*faire l'init de l'afficheur*/
{
int i,j=0 ;
for(i=0;i<3;i++)
{
lcd_data(0x38);
delay(20000);
}

lcd_data (0x0C) ;
delay(20000);

//etc
}

void lcd_data (char infodata)
{

IO0CLR = LCD_RS ; //mode instruction du LCD
IO0CLR = LCD_RW ; //mode écriture du LCD

IO0DIR = 0xFEFFB705; // D0 à D7 en sortie

IDE_PORT_L = infodata ;
enable(80); // validation pendant tant de ns
}

Où est le problème ? Pourquoi ça ne marche pas ?
C'est peut-être un problème au niveau du lcd, je respecte peut-ête mal les procédures d'envoie de données. Voici sa doc http://www.spezial.de/doc/cctech/cmc216-01.pdf
Enfin je pense que c'est ma définition IDE_PORT_L qui n'est pas bonne.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 mai 2006 à 15:38
Va bon.
Melodie_Nelson Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 17 mai 2006
15 mai 2006 à 15:31
bien, merci mais je pense faire autrement finalement

sinon j'ai une autre question, qui n'a rien à voir certes.

c'est pour obtenir le nombre de caractère d'un mot. sachant que je n'ai pas les librairies telle stdio ou string.

est-ce correct comme ça ??

int n=0;
while(word[n]!=0)
n++ ;  //n est donc le nombre de caractère de word
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
15 mai 2006 à 10:36
est-ce que c'est corect comme ça ?

oui
Melodie_Nelson Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 17 mai 2006
15 mai 2006 à 10:19
A Oui ?

Mais oui quoi ?
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
12 mai 2006 à 15:09
Oui
Melodie_Nelson Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 17 mai 2006
11 mai 2006 à 11:37
bonjour,
je dois commander un LCD en parallèle à partir d'un LPC. il y'a donc 8 bits de Data à gérer ainsi que 3 bits d'instructions.
et donc je commande mon paramètre Data en hexa, ke je dois donc ensuite transformer pour avoir l'état de mes 8 bits. si j'ai compris le truc, est-ce que c'est corect comme ça ?


void data (void) //transformer une valeur hexa en 8 bits pour DO à D7

{
typedef struct
{
unsigned char LCD0 : 1,
LCD1 : 1,
LCD2 : 1,
LCD3 : 1,
LCD4 : 1,
LCD5 : 1,
LCD6 : 1,
LCD7 : 1;
} LCD_bit;

#define Bit(octet) (*(volatile LCD_bit *) (&(octet)))


}

donc si j'ai compris ça doit être ça. et donc "octet" est ma variable data ?
bon je suis assez septik en fait, j'ai peur de rien comprendre
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
9 mai 2006 à 10:07
Voilà une intéressante démarche.
zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008
8 mai 2006 à 18:00
Pour information, j'ai fais quelques tests de compilation avec Visual Studio (VC++.NET 2003 v7.1.3088)

Le grand classique avec masque : bit = variable & 8;
donne en code machine :
mov eax,dword ptr [variable]
and eax,8
mov dword ptr [bit],eax

Ma solution, qui est plus lisible dans le code source : bit = Bit(variable).bit3;
mov al,byte ptr [variable]
shr al,3
and al,1
movzx ecx,al
mov dword ptr [bit],ecx

Le code résultant est plus volumineux, et ce sans raison que je comprenne. Conclusion : il vaut mieux utiliser un masque :(

(en écriture de bit, les deux codes "Bit(variable).bit3 = 1;" et "variable |= 8;" donnent e même code machine, ce qui est bien plus logique).

Je vous encourage à tester avec d'autres compilos ... (j'ai actuellement un soucis avec mon GCC, si j'y pense je vous communiquerai les résultats)
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
8 mai 2006 à 17:07
pourquoi faire simple quand on peut faire compliqué hein ?
personnelement j'ai beaucoup plus simple :

int main() {
unsigned char valeur;
printf("saisir une valeur (de -128 à +127):");
scanf("%d", &valeur);

printf("Etat b0: %d\n", (valeur & 1) ? 1 : 0);
printf("Etat b1: %d\n", (valeur & 2) ? 1 : 0);
printf("Etat b2: %d\n", (valeur & 4) ? 1 : 0);
printf("Etat b3: %d\n", (valeur & 8) ? 1 : 0);
printf("Etat b4: %d\n", (valeur & 16) ? 1 : 0);
printf("Etat b5: %d\n", (valeur & 32) ? 1 : 0);
printf("Etat b6: %d\n", (valeur & 64) ? 1 : 0);
printf("Etat b7: %d\n", (valeur & 128) ? 1 : 0);

return 0;
}


Je n'appel pas ça plus simple. En plus le code qu'a rapporté Zeratul est destiné à la programmation sur des µC, il est donc simple et Zen (je veux dire peux couteux en ressources). Il permet l'accés au bit des ports et registre quand le compilateur ne le permet pas.
CyberP Messages postés 283 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 4 juillet 2007 2
19 déc. 2005 à 16:45
euh d'après moi ça fonctionne pas ce truc
n'importe quel nombre où tu fais "or 0xFE" suivi de "and 0x01" sera nul parce que le or met le premier bit à 0 et le and ne garde que le premier bit
(maintenant faudrait voir l'ordre de priorité des opérateurs, peut être que le or s'exécute avant le décalage de bits et là ça donnerait un truc encore plus buggé)

il suffit de supprimer le or
bit = (octet >> num) & 1
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
19 déc. 2005 à 12:20
perso ce que je fais c'est de shifter le registre vers la droite jusqu'a ce que le bit qui m'intéresse soit de poids faible et en 2 masques c'est réglé

char ORmask =(char)0xFE;
char ANDmask=(char)0x01;
bit=((octet>>num_bit|ORmask)&ANDmask;
CyberP Messages postés 283 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 4 juillet 2007 2
19 déc. 2005 à 08:12
pourquoi faire simple quand on peut faire compliqué hein ?
personnelement j'ai beaucoup plus simple :

int main() {
unsigned char valeur;
printf("saisir une valeur (de -128 à +127):");
scanf("%d", &valeur);

printf("Etat b0: %d\n", (valeur & 1) ? 1 : 0);
printf("Etat b1: %d\n", (valeur & 2) ? 1 : 0);
printf("Etat b2: %d\n", (valeur & 4) ? 1 : 0);
printf("Etat b3: %d\n", (valeur & 8) ? 1 : 0);
printf("Etat b4: %d\n", (valeur & 16) ? 1 : 0);
printf("Etat b5: %d\n", (valeur & 32) ? 1 : 0);
printf("Etat b6: %d\n", (valeur & 64) ? 1 : 0);
printf("Etat b7: %d\n", (valeur & 128) ? 1 : 0);

return 0;
}

comme tu expliques les struct et les unions, je vais aussi expliquer ce que je fais :

c'est comme ce que dit neria plus haut (sauf qu'il s'agit du bit numéro 2, dans toutes les docs techniques tu trouveras que le premier bit est le numéro 0)
si la valeur est 52 par exemple (ce qui fait 110100 en binaire)
on fait par exemple 52 & 16 :
00110100
00010000 // ça c'est 16
00010000 // ça c'est le résultat
en effet, le & met un 1 là où les bits des deux nombres (des deux opérandes) sont tous les deux égaux à 1 et de même poids (au même rang), sinon il met 0

donc 52 & 16 donne 16
en fait le résultat ne peut être que 16 ou 0 (si on y réfléchit un peu), c'est-à-dire que si le résultat du & est 16, le bit numéro 4 (le bit le plus à droite est le numéro 0) sera égal à 1, sinon à 0
donc je fais tout simplement (52 & 16) ? 1 : 0 ce qui fait que si 52 & 16 vaut 0, le résultat final sera 0, sinon le résultat final sera 1

on pourrait aussi faire des décalages de bits pour ramener la valeur à 1
ou même diviser par 16 tout simplement (un 0 donnerait toujours 0 et un 16 donnerait 1)
le plus rapide reste le décalage de bits :
(52 & 16) >> 4
zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008
15 déc. 2005 à 20:40
Une utilisation intéressante, lorsque vous ne maitrisez pas l'octet dont vous voulez manipuler les bits (que vous ne pouvez pas directement le déclarer comme étant un union):

typedef struct
{
unsigned char bit0 : 1,
bit1 : 1,
bit2 : 1,
bit3 : 1,
bit4 : 1,
bit5 : 1,
bit6 : 1,
bit7 : 1;
} bit_field;

#define Bit(octet) (*(volatile bit_field *) (&(octet)))

SOURCE : http://anyedit.free.fr/
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 déc. 2005 à 13:18
C'est dans tous les cas ce que le compilo mettra en code, il n'y a aucun autre moyen car la plus petite entité adressable est l'octet, le bit est seulement manipulable.
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
15 déc. 2005 à 13:11
Pour obtenir l'état des bits, on peux aussi faire un masque. Par exemple pour obtenir l'état du bit 3 (en partant de la droite) il faut faire :
variable & 4
Car 4 en binaire c'est 00000100b

@+
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 déc. 2005 à 11:44
Les bases du langage C sont à considérer comme acquises.
struct, union etc... se trouvent dans les 1ers chapitres de tout bouquin correct.
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
15 déc. 2005 à 11:20
Pour information, autre source en relation :
http://www.cppfrance.com/code.aspx?ID=10065
TanKu Messages postés 3 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 14 décembre 2005
14 déc. 2005 à 23:52
Désolé pour le schéma de la mémoire je voulais que sa donne cela :

structure.......union
|-----------| |-----------|
|...........| |...........|
|.....a.....| |...a et b..|
|...........| |...........|
|-----------| |-----------|
|.....b.....|
|-----------|
(j'ignore se que sa va donné....)
Rejoignez-nous