Pour donner un nom à chaque bits d'une variable en langage C sur du microcontrôleur PIC, j'utilise la syntaxe:
unsigned int TimeBase; // 0 to 9999 every 10s
bit Tb0 @ (unsigned)& TimeBase *8+0;
bit Tb1 @ (unsigned)& TimeBase *8+1;
bit Tb2 @ (unsigned)& TimeBase *8+2;
...
Il possible alors de mettre dans une INT Timer;
if (++TimeBase>9999){TimeBase=0;} // 0 to 9999 every 10s
Et n'importe ou:
Led1=Tb8;
Ainsi la Led1 clignote à la cadence du bit 8 de TimeBase.
Comment faire cette "Double" déclaration sous Arduino? Apres 4h de recherche totalement infructueuse j'appelle a l'aide.
Merci c'est début de solution. Autre exemple car j'ai aussi besoin de changer l'état des bits et de tester leur variable globale.
unsigned long InputMemory; //short long 32bits
bit I0 @ (unsigned)& InputMemory *8+0;
bit I1 @ (unsigned)& InputMemory *8+1;
bit I2 @ (unsigned)& InputMemory *8+2;
...
unsigned long RuInputMemory; //short long 32bits Rise Up Inputs
bit RuI0 @ (unsigned)& RuInputMemory *8+0;
bit RuI1 @ (unsigned)& RuInputMemory *8+1;
bit RuI2 @ (unsigned)& RuInputMemory *8+2;
...
Il est possible d'ecrire:
I0=BooleenQuelquonque;
Ou:
BooleenQuelquonque=I0;
Mais aussi: (VInput etant l'etat electrique d'entrees)
RuInputMemory=(InputMemory^VInputs)&VInputs; // Set Edge Up bits of inputs change
InputMemory = VInputs;
En 3 lignes je recupère les bits qui ont subit un front montant et il sont facilement consultable.
if(RuI0){ Action sur front montant de l'entree; }
En fait je porte des appli en PIC C vers Arduino mais cette grosse partie semble compromettre les choses.
J'utilise beacucoup les bits de variable d'ou le besoin de déclarations ou define qui permette une syntaxe légère dans le code.
Peu importe la methode, declaration define ou macro. La seule chose qui m'importe est de pourvoir; lire, changer, tester, un bit de variable par son nom. Et de faire pareil avec la variable qui les contient.
Dans les librairies Arduino, il y a les fonctions de manipulation de bits:
http://www.arduino.cc/en/Reference/BitRead
http://www.arduino.cc/en/Reference/BitWrite
http://www.arduino.cc/en/Reference/BitSet
http://www.arduino.cc/en/Reference/BitClear
Autrement le C prévoit l'utilisation des structures pour déclarer des champs de bits le portage d'une cible à l'autre est quelques fois hasardeux, à cause du problème lié au little/big endian. Mais une fois ce problème réglé cela fonctionne bien.
pepe Grand merci, ça fonctionne parfaitement, sur un Teensy 3.1
Je viens de tester cela avec success:
unsigned long InputMemory=0x5555;
#define I0 (((bitField32_t *)(&InputMemory))->b0)
#define I1 (((bitField32_t *)(&InputMemory))->b1)
#define I2 (((bitField32_t *)(&InputMemory))->b2)
#define I3 (((bitField32_t *)(&InputMemory))->b3)
#define I4 (((bitField32_t *)(&InputMemory))->b4)
#define I5 (((bitField32_t *)(&InputMemory))->b5)
#define I6 (((bitField32_t *)(&InputMemory))->b6)
#define I7 (((bitField32_t *)(&InputMemory))->b7)
...
typedef struct {
uint8_t b0 : 1;
uint8_t b1 : 1;
uint8_t b2 : 1;
uint8_t b3 : 1;
uint8_t b4 : 1;
uint8_t b5 : 1;
uint8_t b6 : 1;
uint8_t b7 : 1;
uint8_t b8 : 1;
uint8_t b9 : 1;
uint8_t b10 : 1;
uint8_t b11 : 1;
uint8_t b12 : 1;
uint8_t b13 : 1;
uint8_t b14 : 1;
uint8_t b15 : 1;
uint8_t b16 : 1;
uint8_t b17 : 1;
uint8_t b18 : 1;
uint8_t b19 : 1;
uint8_t b20 : 1;
uint8_t b21 : 1;
uint8_t b22 : 1;
uint8_t b23 : 1;
uint8_t b24 : 1;
uint8_t b25 : 1;
uint8_t b26 : 1;
uint8_t b27 : 1;
uint8_t b28 : 1;
uint8_t b29 : 1;
uint8_t b30 : 1;
uint8_t b31 : 1;
} bitField32_t;
//Une function appelée périodiquement, le terminal me prouve que çà fonctionne.
void TestBitVar(){
I0=!I0;
I1=!I0;
I6=!I6;
I7=!I6;
Serial.println(InputMemory,BIN);
}
Extrait du Log:
101010101010101
101010110010110
101010101010101
101010110010110
101010101010101