manipulation de champs de bits
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:
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:
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:
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 ?