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 :

Récupération MSB et LSB


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut Récupération MSB et LSB
    Bonjour à tous, tout d'abord j'espère que je poste dans la bonne partie du forum et que je vais réussir à bien me faire comprendre!

    Je vous expose mon sujet :
    En gros je dois récupérer des commandes analogique que j'ai numérisé préalablement, les valeurs varient de -2048 à +2048 .

    Mon problème est le suivant, on me demande d'envoyer des trames de commandes dans lesquelles je dois transformer mes valeurs numérisées en hexa mais aussi les "scinder" en MSB et LSB

    Un exemple vaut mieux qu'un long discourt :
    imaginons que ma valeur numérisée soit -1539 soit 603 en hexa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                    bit7   bit6   bit5   bit4   bit3   bit2   bit1   bit0
    Mon MSB sera :   0      0       0      0      1       1      1       1
     
    Soit 0E ( le bit3 étant à 1 pour le signe - )
     
                    bit7   bit6   bit5   bit4   bit3   bit2   bit1   bit0
    mon LSB sera :   0      0       0      0      0       0      1       1    
     
    Soit 03
    Ma question est comment puis-je réaliser cette conversion sachant que mes valeurs numérisées sont dans des float.

    Autre question : Comment puis-je effectuer cette conversion pour -2048 qui est codé sur 12bits également mais le bit3 du MSB ne pouvant servir au signe puisque 2048 vaut 800 en hexa...

    Voila j'espère que quelqu'un pourra éclairer ma lanterne!!!
    Merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - Si je comprend, d'après ton exemple, tu as numérisé des valeurs en un code signe (bit 11) + valeur absolue (bits 0 à 10). Tu ne peux donc avoir la valeur -2048, tes valeurs étant comprises entre -2047 et 2047. Par contre tu as un +0 et -0 .
    ...sachant que mes valeurs numérisées sont dans des float.
    Là, je ne comprend pas ce que viennent faire des floats avec le code que tu as décrit et qui concerne des valeurs entieres

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par anny0 Voir le message
    En gros je dois récupérer des commandes analogique que j'ai numérisé préalablement, les valeurs varient de -2048 à +2048 .
    Comment sont codées ces valeurs ? Quel est le code de 2048, quel est le code de 0, quel est le code de -2048 ? Et le tout, sur combien de bits ?
    Mon problème est le suivant, on me demande d'envoyer des trames de commandes dans lesquelles je dois transformer mes valeurs numérisées en hexa mais aussi les "scinder" en MSB et LSB
    Ca n'a pas de sens. Soit on convertit la valeur en sa représentation textuelle sous forme hexadécimale et on la transmet caractères par caractères, soit on transmet la forme binaire sous la forme de 2 octets consécutifs, l'un portant les LSB et l'autre les MSB. Ce qui compte alors c'est de savoir :
    • Quel est le type utilisé (entier, flottants etc.)
    • Quel est le codage
    • Quel octet est transmis en premier (MSB, la règle générale, ou LSB ?)

    imaginons que ma valeur numérisée soit -1539 soit 603 en hexa
    euh, par quel miracle ? -1539 donne F9FD en 16-bit, complément à 2.

    Bref, pour le moment, les éléments que tu as donné sont flous et contradictoires. Il faut que tu précise mieux ce que tu veux. Il faut que ce soit d'abord clair dans ta tête.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Pour moi c'est bien clair, c'est la demande de mon tuteur de stage qui est flou!!

    Je vous explique tout le déroulement dans le détails :

    J'ai par exemple un potentiomètre , afin de numériser ses valeurs ( je récupère les valeurs de tension ) j'effectue une calibration ( j'enregistre la butée haute qui devra avoir pour valeur 2048 je fais de même pour la butée basse qui devra elle être égale à -2048 )

    Ensuite je résoud un système de deux équation afin d'obtenir la pente et l'ordonnée à l'origine :
    2048 = a*Butée_Haute +b
    -2048 = a*Butée_Basse +b

    Les valeurs de a et de b obtenue je les appliques après aux valeurs de tension du potentiomètre que je récupère.. C'est donc ces valeurs là les valeurs numérisée et elle sont des INT je viens de modifier cette partie dans mon code il suffisait de caster au moment de la numérisation...

    Donc voila le calcul de point repère tel que la butée haute et la butée basse me sert à avoir un point milieu correcte .

    Par la suite je dois envoyer ces valeurs numérisées dans une trame comme je vous l'ai dit , les bits 0 à 7 noté LSB sont la représentation de la valeur absolue de la consigne numérisée et les bits 0 à 2 du champs MSB sont les bits 8 à 10 de la valeur absolu de la consigne numérisée et le bit trois représente le signe ( comment alors puis-je coder 2048 comme tu me l'a dit Emmanuel cela est impossible..) l


    Pour ce qui est de l'octet envoyé en premier il s'agit du MSB

    imaginons que ma valeur numérisée soit -1539 soit 603 en hexa
    euh, par quel miracle ? -1539 donne F9FD en 16-bit, complément à 2.
    J'ai cherché pendant un moment aussi, c'est l'exemple de ma spécif

    1539 = 6*256+0*16+3

    Donc voila je ne sais pas du tout comment faire pour, à partir de cette valeur de consigne en retirer le MSB et LSB...

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    ( oui une valeur numérisée en float c'est bizarre je veux bien l'avouer!!)
    Eclairci ce point, car l'exemple que tu donnes n'est pas un code de float mais d'un entier en signe+valeur absolue.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Bah je viens de retoucher à mon code, maintenant mes valeurs numérisées sont bien des entiers, en fait j'avais un warning me disant que je pouvait avoir une perte de précision ( au moment de l'application de mes coefficients a et b )

    Donc maintenant mes valeurs numérisées sont bien des entiers signés !!!

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par anny0 Voir le message
    Bah je viens de retoucher à mon code, maintenant mes valeurs numérisées sont bien des entiers, en fait j'avais un warning me disant que je pouvait avoir une perte de précision ( au moment de l'application de mes coefficients a et b )

    Donc maintenant mes valeurs numérisées sont bien des entiers signés !!!
    Sur 16-bit, je suppose. Donc :

    +2048 = 0x0800, soit 0000 1000 0000 0000
    -2048 = 0xF800, soit 1111 1000 0000 0000 (Complément à 2)

    Rappel du complément à 2 :
    0x0800 -> inversion = 1111 0111 1111 1111 = 0xF7FF
    + 1 -> 0xF800

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Exact maintenant que mes valeurs numérisées sont en int cela me permet la possibilité d'afficher ses valeurs sous forme hexadécimal, j'ai bien en butée haute 800 et en butée basse sont complément à 2 F800.

    Maintenant comment puis-je obtenir le MSB et le LSB comme dans l'exemple que je vous ai montré, en utilisant des masques?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par anny0 Voir le message
    Maintenant comment puis-je obtenir le MSB et le LSB comme dans l'exemple que je vous ai montré, en utilisant des masques?
    http://emmanuel-delahaye.developpez.com/bits.htm

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned data = 0xF800;
    unsigned msb = (data >> (8 * 1)) & 0xFF;
    unsigned lsb = (data >> (8 * 0)) & 0xFF;

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Merci pour ton aide Emmanuel je vais voir maintenant pour l'algo (récupération de ma valeur numérisée, passage en hexa [ça risque d'être coton ça..] et récupération du msb et lsb d'après ta méthode)

    Autre petit question :

    Au niveau de mon traitement si je me retrouve avec une valeur numérisée négative, ai-je le droit avant recherche du msb et du lsb d'utiliser l'opérateur unaire sur ma valeur numérisée et lui ajouter 1 de manière à obtenir la même valeur mais positive pour par la suite rajouter le bit de signe au msb??

    Parce que je viens de tester en affichage hexa : 1539 => ~(-1539)+1 c'est juste non?

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'avoue ne plus trop comprendre ce que tu veux.
    Tu nous dis ( post #1) que après numérisation sur 12 bits tu as un code entier signe + valeur absolue. Comment peux-tu obtenir + 2048 ou -2048 ?
    Parce que je viens de tester en affichage hexa : 1539 => ~(-1539)+1 c'est juste non?
    Si les entiers sur ta machine sont codés en complément à 2 (ce qui est probable) oui, mais ce code ne correspond pas au code de tes données. Si après lecture de tes données, tu obtiens le code du post #1 placé dans un entier, tu ne peux appliquer cette règle.

    Pour obtenir la représentation en hexa, sprintf peut faire ton affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       char tab[4];
       int ipos = 1539 ;         //  1539
       int ineg = 1539 |2048 ;   // - 1539 par mise du bit de signe à 1
       sprintf(tab,"%x", ipos);  // résultat tab = "603"
       sprintf(tab,"%x", ineg);  // résultat tab = "E03"
    Mais, j'ai peur de ne pas avoir bien compris ton problème.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    Bon voila je laisse de côté mon gros projet pour me consacrer entièrement à cette histoire de MSB et LSB qui est tout de même importante

    Voici un bout de code que je viens de faire avec toutes vos aides

    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
     
       unsigned char data2[7];
       int data, data_num=-1539;
       unsigned msb;
       unsigned lsb;
     
     
       if(data_num<0)
       {
            sprintf(data2,"0x%X",(-data_num)|2048);
            data = atoi(data2);
    /*La est le problème pour récupérer le msb et le lsb je dois travailler sur un
    entier non signé d'après ce que j'ai pu voir, or la fonction atoi() que j'ai testé
     ne me renvoi pas la valeur de data2, en gros là ce que je voudrais c'est que 
    data=0xE03...*/
     
    	msb = (data >> (8 * 1)) & 0xFF;
    	lsb = (data >> (8 * 0)) & 0xFF;
            printf("%s\r\nMSB : %X\n\rLSB : %X",data2,msb,lsb);
       }

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le code que j'ai donné donne le résultat attendu en supposant que tes entiers sont écrits en code sign (bit11) , valeur absolue.
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ineg = 1539 |2048 ;   // - 1539 par mise du bit de signe à 1
    sert uniquement à simuler la valeur -1539 dans ce code. Puisque ma machine est en complément à 2, je ne peux pas écrire simplement -1539
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            sprintf(data2,"0x%X",(-data_num)|2048);
    Ce code est faux :
    Deux conversions demandées et un argument fourni
    Pourquoi écrire -data_num ? data_num est en complément à 2 ?

    La question à résoudre avant toutes choses est le code utilisé par data_num.
    Pour une valeur de -1539, est-ce qu'il contient 0xE03 ou F9FD (avec éventuellement des F devant) donc en complément à 2 ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 25
    Par défaut
    En affichage Hexa -1539 s'affiche F9FD
    Voila pourquoi j'ai utilisé (-data_num)|2048 afin d'obtenir E03 en affichage Hexa

    EDIT :

    Bon voila j'ai réussi à faire ce que je voulais (enfin ce qu'on me demandais)
    Voila le code

    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
     
    #class auto
     
     
    void main()
    {
       int data_num;
    	unsigned data;
    	unsigned msb;
    	unsigned lsb;
     
       data_num=-2047;
     
       if(data_num<0)
       {
    		data=(-data_num)|2048;
    		msb = (data >> (8 * 1)) & 0xFF;
    		lsb = (data >> (8 * 0)) & 0xFF;
       }
       else
       {
          data=data_num;
    		msb = (data >> (8 * 1)) & 0xFF;
    		lsb = (data >> (8 * 0)) & 0xFF;
       }
     
       printf("%X\r\nMSB : %X\n\rLSB : %X",data,msb,lsb);
     
    }
    Pour info c'est un développement sous Dynamic C, les gens ayant utilisé du matériel de chez rabbitsemiconductor connaîtrons

    Encore merci à tous pour votre aide je met la balise Résolu

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

Discussions similaires

  1. Lire un fichier de LSB et MSB
    Par dreydrey dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2014, 08h22
  2. besoin d'un avis sur le calcul msb et lsb d'une trame
    Par thony76 dans le forum Visual C++
    Réponses: 10
    Dernier message: 03/08/2006, 13h20
  3. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  4. récupération d'images
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/08/2002, 18h36
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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