Define pour un Binaire incomplet

Bonjour,

Autant y aller direct ! Je cherche à initialisé une variable de carte sur le bus I2C. J'ai pensé naturellement au #define tel que
#define carteBtn B0111000

Il manque 1 bit et c'est logique car j'utilise plus bas ceci:
Wire.requestFrom(B0111000, 1); //Appel de la carte en lecture

En théorie, j'aurais du employé le système 0x?? Sauf qu'avec un bit en moins, je voie pas trop comment faire la conversion. Existe-t-il une autre solution?

J'ai du mal à saisir ... Ou bloques-tu ?? 0x c'est juste une notation pour le compilateur pour dire que c'est de l'hexadécimal, comme B... veut dire binaire et rien du tout veut dire décimal.

Je saisie pas ta réponse.

Si je fais:
#define test B0111000

puis:
Wire.requestFrom(test, 1);

A priori, ma carte n'est pas appeler. En revanche si je met Wire.requestFrom(B0111000, 1); ma carte est appelé.

C'est peut-être plus clair ainsi !

Peut être :

byte test=B111000;

Déjà testé !

Si je met 111000 ça ne correspond plus non plus à ma carte en I2C. La carte s'apelle 0111000 puis 0 en écriture ou 1 en lecture.

Geeks:
Si je fais:
#define test B0111000

puis:
Wire.requestFrom(test, 1);

A priori, ma carte n'est pas appeler. En revanche si je met Wire.requestFrom(B0111000, 1); ma carte est appelé.

Dans le contexte ci-dessus, les 2 écritures sont 100% identiques.
#define est une méthode du préprocesseur qui est appellé avant le compilateur. Il fait un chercher/remplacer dans le texte de la chaine "test" par la chaine définie.
Je répète, cela est fait au niveau texte du fichier source avant la compilation
Si tu as écrit exactement dans ton code ce que tu as écrit ci-dessus, quand le code arrive au compilo c'est la même chose.
Donc si ça ne fait pas la même chose, c'est que tu n'as pas écrit comme ci-dessus.

Ne redéfinis tu pas test ailleurs plusieurs fois

En plus j'utilise couramment la forme byte addr=Bxxxxxxx et je n'ai aucun problème.

Ok, j'ai trouver !

Il manquais un "1" dans le binarie !

Problème résolu :grin:

Bonjour,

Concernant le bit de R/W en I2C la librairie Wire le gère en interne.
Il faut juste lui fournir l'adresse "brute" sur 7 bits.

Si tu as une adresse avec le bit de R/W il suffit de supprimer le bit de point faible en décalant la valeur d'un bit vers la droite.

En version define ça donne ça (juste pour comprendre le truc) :

#define ADDR_BRUTE B10101010
#define ADDR_WIRE (ADDR_BRUTE >> 1)

B@tto:
J'ai du mal à saisir ... Ou bloques-tu ?? 0x c'est juste une notation pour le compilateur pour dire que c'est de l'hexadécimal, comme B... veut dire binaire et rien du tout veut dire décimal.

0x... -> notation hexa pour le compilateur, ok
0.... -> notation octal
0b.. -> notation binaire

B.... c'est juste une série de #define dégueulasse que la team arduino à cacher sous le tapis dans binary.h :wink:
Allez un petit extrait juste pour le fun :

#define B0 0
#define B00 0
#define B000 0
#define B0000 0
#define B00000 0
#define B000000 0http://arduino.cc/forum/Smileys/arduinoWide/smiley-wink.png
#define B0000000 0
#define B00000000 0
#define B1 1
#define B01 1
#define B001 1
#define B0001 1
#define B00001 1
#define B000001 1
#define B0000001 1
#define B00000001 1

(tout ça pour pas avoir à dire que la notation 0b... existe :roll_eyes:)

Lol !

En effet, bel exemple...

Bon, ceci dit, chu pas encore totalement à l'aise avec tout le système Arduino. C'est que ça me manquerais presque l'ASM XD
(Je déconne)...

Bon, voila, donc pour le moment, prends pas peut mais ça ressemble à ça ma déclaration sur ma télécommande.

/*
Télécommande sur 433 Mhz bi-directionnelle

Auteur : Alexandre LAB
Aide DVP : Ragmaxone, sevyc64, Winjerome, Bousk
Aide Arduino.cc : barbudor, SesechXP, skywodd
Création : le 30 octobre 2012
Dernière modification : le 16 janvier 2013
Version 1.0

Pins utilisés
TX1 -> Modem 433Mhz
RX1 <- Modem 433Mhz
SDA <-> Data I2C
SCL <-> Horloge I2C

SPI <-> Carte Ethernet / SD Card
04 (PWM) -> Ethernet CS

10 (PWM) -> Ethernet Librairie
50 (Digit) -> Ethernet Librairie
51 (Digit) -> Ethernet Librairie
52 (Digit) -> Ethernet Librairie
53 (Digit) -> Ethernet Librairie

AN0 -> Voie 1
AN1 -> Voie 2
AN2 -> Voie 3
AN3 -> Voie 4

22 (Digit) -> Voie 5 = Btn On/Off/On 1
23 (Digit) -> Voie 5 = Btn On/Off/On 1
24 (Digit) -> Voie 6 = Btn On/Off/On 2
25 (Digit) -> Voie 6 = Btn On/Off/On 2

Pour infos:

  • Les voies analogiques sont reliée chacune à leur potar.

  • 22 et 23 Corresponde à un potar à 3 positions.

  • 00 = Milieu

  • 10 = Haut

  • 01 = Bas

  • 24 et 25 Corresponde à un potar à 3 positions.

  • 00 = Milieu

  • 10 = Haut

  • 01 = Bas
    */

/* INC */
#include <Wire.h>
#include <SD.h>

/* DEFINITIONS CARTES I2C */
#define adresseLcd 0x63 //Ecran LCD
#define carteBtn B0111000 //Carte boutons

/* DEFINITIONS AUTRES */
#define SIZE_VOIES 10 //Nombre de voies

#define SIZE_BUFFER 32 //Nombre de case du buffer
#define SIZE_CMDE 10 //Nombre de commandes

#define potarVoie1 0 //Manche gauche haut/bas
#define potarVoie2 1 //Manche gauche droite/gauche
#define potarVoie3 2 //Manche droite haut/bas
#define potarVoie4 3 //Manche droite droite/gauche

int btnVoie5Up = 22; //Bouton voie 5 Haut
int btnVoie5Do = 23; //Bouton voie 5 Bas
int btnVoie6Up = 24; //Bouton voie 6 Haut
int btnVoie6Do = 25; //Bouton voie 6 Bas

/* VARIABLES GLOBALES */
int tensionVoie1, tensionVoie2, tensionVoie3, tensionVoie4; //Tensions aux bornes des entrées analogiques
byte voies[SIZE_VOIES]; //Initialise le tableau des voies

int mixVoie1, mixVoie2; //Valeur de mixage

String trame; //Trame d'émission

//char bufferRx[SIZE_BUFFER];

File myFile; //Fichier
String tblFicMdle[SIZE_CMDE]; //Le tableau des noms des fichiers modèles
String tblFicSvg[SIZE_CMDE]; //Le tableau des noms des fichiers de sauvegardes
int nbFichierMdle; //Nombre de fichier

char tblConfSvg[SIZE_CMDE][SIZE_BUFFER]; //Le tableau des configuration du fichier de sauvegarde
char tblConfMdle[SIZE_CMDE][SIZE_BUFFER]; //Le tableau des configurations du fichier de modèle

//Configuration pour un modèle
String confNom, confType;
boolean confMix_V1V2, confMix_V3V4;
boolean etatVoie07, etatVoie08, etatVoie09, etatVoie10;

byte etatBtnI2c;
int ecran = 1;
int cmptPassage = 0, passageMax = 5;

Et en dessous, ben, il y a le setup()...

On notera quand même que je prends soint dès le début de commenter mes pin(s). Normal si c'est une sortie "->" c'est pas pour y recevoir un signal, sauf si c'est bi-directionnel "<->". Enfin, bon, vous m'aurez, ou pas, compris :wink: