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
222
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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
222
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
222
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
222
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
222
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
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
8
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é....)