IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

integer 17 bits


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Par défaut integer 17 bits
    Bonjour,

    J'ai un sushi ! je pilote un gyroscope L3GD20H. Je récupère les valeurs de l'axe X dans 2 registres, H(msb) 8bits et L(lsb) 8bits. Dans mon code je fais un décalage de 8 pour les avoir dans la même variable OUT_X. A la fin j'envoie sur le port com du PC. Voici le programme en question:

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include "mbed.h"
     
    SPI spi(D11, D12, D13);
    DigitalOut cs(D10);
     
    Serial pc(USBTX, USBRX);
     
    Timer t_angle;
     
    int STATUS_GYRO = 0;
    int OUT_X_H = 0;
    int OUT_X_L = 0;
    int OUT_X = 0;
    int ANGLE_X = 0;
    int tn;
    int X[100];
    int zero = 0;
    int b = 0;
    int axe_x = 0;
     
    void spi_write(int registre, int data)
    {
        cs = 0;
        spi.write(registre);
        spi.write(data);
        cs=1;
    }
     
    int spi_read(int registre)
    {
        registre = registre + 0x80;
        cs = 0;
        spi.write(registre);
        int buffer = spi.write(0x00);
        cs=1;
        return buffer;
    }
     
    int main()
    {
        cs=1;
        spi.format(8,3);
        spi.frequency(900000);
        wait(1);
        spi_write(0x20, 0x0F);
        wait(1);
        int whoami = spi_read(0x0F);
        pc.printf("Who Am I = 0x%X\r\n", whoami);
        wait(0.1);
        spi_write(0x23, 0x80);
        while(1) {
            t_angle.start();
            STATUS_GYRO = spi_read(0x27);
            //pc.printf("STATUS = %-d \r\n", STATUS_GYRO);
     
            for (b=0; b<=9; b++) {
                OUT_X_L = spi_read(0x28);
                OUT_X_H = spi_read(0x29);
                OUT_X = (OUT_X_H << 8) + OUT_X_L;
                axe_x = axe_x + OUT_X;
            }
     
            axe_x = axe_x/10;
     
            tn = t_angle.read_ms();
            pc.printf("X = %-i, T = %-i \r\n", axe_x, tn);
            t_angle.stop();
            t_angle.reset();
     
        }
    }
    Cependant dans PuTTY il m'affiche X = 72000 ( c'est le moment où le gyro est immobile). le problème c'est que ce chiffre est sur 17 bits ! Donc je ne voie pas ce qui cloche !
    Pour info, le gyro envoie la valeur des axe directement en complément à 2.

    donc pour moi 72000 (dec) => 11940 (hex) => 10001100101000000 (bin) donc le msb 1 est l'indicateur du - .

    des idées? merci !
    NI3

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu ne réinitialises pas axe_x à zéro en début de corps de boucle, j'imagine donc que ses valeurs peuvent s'accumuler jusqu'à outrepasser 65535...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Par défaut
    C'est trés fustrant de bloquer sur des choses aussi simple ... merci !!

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Plus c'est frustrant, plus tu apprends (et moins tu recommenceras...)

  5. #5
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Accessoirement ce genre de faute d'inattention est plus facile à repérer si tu déclares tes variables le plus tard possible, C99-style. Encore faut-il évidemment que le compilateur le permette et en embarqué c'est pas sûr.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Existe-t'il un type Integer > 64 bits non signé
    Par colorid dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2012, 07h05
  2. array byte short 16 bit signed integer
    Par ouiouioui dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2010, 15h51
  3. [Pointer integer different size] 64 bits ?
    Par earl29 dans le forum Débuter
    Réponses: 10
    Dernier message: 06/09/2008, 11h22
  4. Réponses: 8
    Dernier message: 06/04/2008, 16h32
  5. Stockage de bits dans un Integer
    Par Mayamok dans le forum Access
    Réponses: 17
    Dernier message: 15/12/2006, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo