Bonjour,

Je programme sur un microcontrolleur 8 bit (PIC18 de chez microchip) et j'utilise le compilateur MCC18 (microchip).

J'ai défini des unions et des structures :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
typedef struct _Struct1 {
	unsigned int a;
	unsigned char b;
} Struct1;
 
 
typedef union _Union2 {
	unsigned int Val;
 
    struct
    {
        unsigned char ValL;
        unsigned char ValH;
    };
 
	struct {
		unsigned int a:8;	// bit0-7
 
		unsigned int b:8;			// bit8-15
	};
} Union2;
Union2 myVar2;
 
 
typedef union _Union3 {
	unsigned int Val;
 
    struct
    {
        unsigned char ValL;
        unsigned char ValH;
    };
 
	struct {
		unsigned int a:1;	// bit0
		unsigned int b:1;	// bit1
		unsigned int c:1;	// bit2
		unsigned int d:1;	// bit3
		unsigned int e:1;	// bit4
		unsigned int f:1;	// bit5
		unsigned int g:1;	// bit6
		unsigned int h:1;	// bit7
 
		unsigned int i:2;	// bit8-9
		unsigned int j:4;	// bit10-13
		unsigned int k:1;	// bit14
		unsigned int l:1;	// bit15
	};
} Union3;
Union3 myVar3;
et voici mon programme (myVar2 et myVar3 sont des variables globales) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Struct1 myVar1;
myVar1.a = (myVar2.a << 4);
myVar1.a |= myVar3.j;
=> ça ne fonctionne pas correctement, la valeur de myVar1.a n'est pas correcte : j'ai l'impression que j'ai des problème sur les opérations de décalage (ça décale sur toute la variable au lieu du champs. Est-ce que je peux avoir le même problème sur des opérations logique tel que OU, ET, NON ... ?)

par contre ce code "à l'air de fonctionner" correctement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Struct1 myVar1;
myVar1.a = ((unsigned int)myVar2.a << 4);
myVar1.a |= myVar3.j;

=> pouvez-vous me dire de quoi ça vient ? ... a priori l'utilisation de champs de bits pose des problèmes si on fait des opérations tel que des décalages.
Quels sont les méthodes à utiliser pour faire des décalages et des opération logique sur des champs de bits sans avoir de mauvaises surprises ?