Probleme avec la conversion bit à bit d'une librairie adafruit

Salut, je souhaite utiliser un MMA8451 dans un projet avec une carte Z-uno. (specs)
Il y a une librairie avec mais celle ci ne marche pas correctement avec cette carte. Les valeurs récupérées ne sont pas bonne... Sur un mega ou un nano pas de soucis.

La partie du code posant problème est la suivante:

  Wire.requestFrom(_i2caddr, 6);
  x = Wire.read(); x <<= 8; x |= Wire.read(); x >>= 2;
  y = Wire.read(); y <<= 8; y |= Wire.read(); y >>= 2;
  z = Wire.read(); z <<= 8; z |= Wire.read(); z >>= 2;

La conversion bit à bit ne rends pas les valeurs correctement.
Comme c'est un truc assez hard à comprendre, j'ai eu du mal a analyser ce morceau de code. Mais je ne comprends pas pourquoi ça ne marche pas.

Si quelqu'un à une idée ou une piste pour m'aider :slight_smile:

Merci

Bonjour

Informations très insuffisantes;

Quel microconrolleur tourne sur cette carte Z-Uno ? (8 , 16, 32 bits ? variété de microcontrolleur ARM ?)
Comment sont déclarées les variables x, y et z ? (-> ne pas donner un 'bout de code')
Quel est le résultat d conversion attendu et quel est le résultat obtenu ?

+1 sur cette question

D'après la doc du module que j'ai trouvée en suivant le lien donné ce serait ça:

Key Hardware Features
Programming in C/C++ language:
Optimized 8051 CPU Core
30 kB (6 kB with S2) Flash
2 kB (2kB with S2) RAM

Il y a ça aussi

Z-Uno Module compiler (called Z-Uno uCXX) accepts C and slightly limited C++ programming language. All peripherals are accessible via special functions or libraries in Arduino style. Some Arduino libraries are compatible with Z-Uno, others might require porting. User code should be compiled with special Z-Uno Core Libraries.

Donc la compatibilité n'est pas garantie.

Il faudrait regarder s'il n'y a pas une inversion octet de poids fort et octet de poids faible.

je ne pense pas, c'est envoyé par l'accéléromètre en standard dans cet ordre.

il faudrait tout le code et comme le compilateur est SDCC, on peut s'attendre à quelques différences par rapport à GCC. La bibliothèque Wire peut aussi être bugguée...

Bonjour a tous. En voulant vous répondre avec le code du github de la librairie, j'ai remarqué qu'elle avait était mise a jour vers une nouvelle version et celle ci n'utilise plus la librairie Wire mais BusIO comme décrit dans la realease 1.2.0

Je vais devoir tester pour savoir si mon problème est résolue grâce aux updates mais je doute.

Pour l'histoire de la déclaration de X,Y,Z c'est dans le fichier .h,

voici le code :
int16_t x, y, z; (ligne 131)

pour le reste du code voir ici : GitHub - adafruit/Adafruit_MMA8451_Library: Arduino library for the MMA8451 Accelerometer sensors in the Adafruit shop

Comme la dit fdufnews, la compatibilité n'est pas garantie, j'ai déjà porté deux trois librairies dont les modifs étaient mineurs mais la avec les bit à bit, je cale.

Toujours pour fdufnews, comment vérifier le problème mentionné ?

J-M-L, de quoi avait vous besoin comme code ? Pour la librairie Wire, c'est effectivement une librairie Wire modifiée si je ne me trompe pas, en tout cas elle fait partie des fichiers du core de la librairie de la carte (Z-Uno-Core/Wire.cpp at master · Z-Wave-Me/Z-Uno-Core · GitHub)

Merci pour votre aide !

C’était tout votre code dont je parlais

Mais il se peut aussi que le souci vienne de la compatibilité des bibliothèques utilisées avec cet autre compilateur

Bon j'ai essayé avec la nouvelle lib et en fait rien ne change, le fonctionnement reste le même au final.

Pour fdufnews, comment avoir la réponse a votre interrogation ? Car quand je laisse la librairie faire, j'arrive a obtenir un valeur sur y qui semble cohérente(et suit le mouvement, avec passage en négatif etc...) alors que les autres restent bloquées ou bouge peut autour d'une seul valeur... Ca marche mais pas complétement en gros...

Du coup personne pour me filer un coup de main ? même pas pour m'aiguiller un poil ?

Je ne pense pas qu’il y ait beaucoup d’utilisateurs de SDCC ici

Bonjour

échanges sur SDCC : https://sourceforge.net/p/sdcc/discussion/1864/

Effectivement, si le soucis vient du compilateur, je ne suis peut être pas a la bonne place...

Merci al1fch pour le liens que je vais aller lire :wink: