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 :

Formater et manipuler des variables binaires


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut Formater et manipuler des variables binaires
    Bonjour,

    Je cherche à formater 2 nombres binaire afin d'obtenir un résultat en ascii.

    Mon but d'obtenir la lecture d'une température issue d'un capteur ( électronique embarquée )

    Je dispose donc de 2 variables constituant ma température :
    L'une est le MSB ( dizaine et unités ) et l'autre le LSB ( dixièmes après la virgule) du résultat.

    Je rencontre des difficultés à formater ces 2 variables car quelques subtilités sont imposées :

    Le Bit 7 de MSB représente en fait le signe du résultat final :
    si il est à 0, le résultat sera positif, si il est à 1 il sera négatif.

    Ensuite pour la variable contenant LSB, qui contient les dixièmes de degrés, chiffres après la virgule, seuls les 2 bits de poids fort (bit7 et 6)
    sont à lire les autres sont toujours à 0.
    Une fois les bit6 et 7 lus il est dit qu'il faut diviser ce résultat par 4 pour obtenir la fraction des dixièmes de degrés, cela donnera donc 3 possibilités : 0 - 0.25 - 0.75

    Par exemple, si MSB contient 00011001 et LSB 01xxxxxxxx alors la température sera de + 25.25°c

    bit 7 de MSB à 0 => +
    0011001 = 25

    et 01 de LSB = 1
    1 / 4 = 0.25

    J'ai écris ceci, mais ça ne fonctionne pas correctement, pourriez vous m'indiquer ou je fais erreur svp :
    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
     
    // Variables contenant la temperature
    unsigned char RTC_TEMP_MSB;
    unsigned char RTC_TEMP_LSB;
     
    ...
     
    void lecture_temperature(void)	
    {
     	unsigned char unites_dizaines[2];
    	unsigned char dixiemes[2];
    	unsigned char tmp;
    	unsigned char ascii_rtc_temp[6+1];					// Le resultat composé ainsi : xx.xx + \0
     
    	if (RTC_TEMP_MSB & (0 << 7)) ascii_rtc_temp[0]='+';	// Si le bit 7 de RTC_TEMP_MSB = 0 alors met le sign '+' dans ascii_rtc_temp sinon met le signe '-'
    	else ascii_rtc_temp[0]='-';
     
    	tmp = (RTC_TEMP_MSB & (0b01111111));				// On veut lire que des bits 0 à 6 ( on ne lit pas le bit 7 car il correspond au signe du resultat )
     
    	// Comment faire pour extraire de tmp, les 2 digits dizaines et unités
    	// et les mettre dans chaine de caractère qui composera le resultat ?
     
    	ascii_rtc_temp[3]=',';								// Affiche le caractère virgule dans la chaine composant le resultat
     
    	tmp = (RTC_TEMP_LSB & (0b11000000));				// Lecture des bits 6 et 7 de RTC_TEMP_LSB
    	tmp /= 4;											// Le resultat obtenu est une fraction de 0.25 qu'il faut multiplier pour obtenir les dixièmes de degrés
     
    	// Comment faire pour extraire de tmp, les 2 digits dizaines et unités
    	// et les mettre dans chaine de caractère qui composera le resultat ?;
     
    	ascii_rtc_temp[6]='\0';								// Termine la chaine				
    }

  2. #2
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour lcoulon

    cela fait quoi
    a mon avis, cela doit être proche de 0
    essaye plutot
    ce qui donnera 10000000


    ensuite je te donne une piste pour le RTC_TEMP_MSB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            // Comment faire pour extraire de tmp, les 2 digits dizaines et unités
    	// et les mettre dans chaine de caractère qui composera le resultat ?
        {
           char high = tmp/10;                 // 11001 = 25 en decimal, je prends donc la dizaine
    	   char low =  tmp %10;                // Puis les unités
     
           ascii_rtc_temp[1] = '0' + high;     // creation du caractère des dizaines
           ascii_rtc_temp[2] = '0' + low;      // creation du caractère des unitées
        }
    Essaye de comprendre comment j'ai fait et tu pourras l'appliquer pour la suite du traitement.
    Page sur Developpez : http://pbriand.developpez.com

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci pour la piste,

    Dans cette ligne pourquoi ajoutez vous le caractère '0' ?
    Quelle est son utilité ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ascii_rtc_temp[1] = '0' + high;
    Merci à vous,

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    Essaie donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
    for (i = 0; i < 10; ++i)
        printf("%c\n", '0' + i);
    ... ou cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
    for (i = 0; i < 26; ++i)
        printf("%c\n", 'A' + i);
    C'est plus clair ?

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    je ne peux pas faire de printf pour voir les resultats car c'est du C embarqué.

    Pouvez vous plutot m'expliquer car ecrit svp ?

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    '0' est le code ascii du caractère 0.
    Par conséquent '0' + n (avec n entre 0 et 9) et le code ascii du chiffre n.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci, grâce a vos conseils j'arrive à afficher ma température.

    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
     
    void lecture_temperature(void)	
    {
    	unsigned char unites;
     	unsigned char dizaines;
    	unsigned char dixiemes;
    	unsigned char centiemes;
     
    	if (RTC_TEMP_MSB & (1 << 7)) ascii_rtc_temp[0]='-';	// Si le bit 7 de RTC_TEMP_MSB = 0 alors met le sign '+' dans ascii_rtc_temp sinon met le signe '-'
    	else ascii_rtc_temp[0]='+';
     
    	tmp_temp = (RTC_TEMP_MSB & (0b01111111));			// On veut lire que des bits 0 à 6 (ceux masqué à '1') on ne lit pas le bit 7 car il correspond au signe du resultat
     
    	dizaines = tmp_temp/10;								// On obtient les dizaines 
    	unites = tmp_temp%10;								// On obtient les unités
    	ascii_rtc_temp[1] = '0' + dizaines;					// Creation du caractère des dizaines
    	ascii_rtc_temp[2] = '0' + unites;					// Creation du caractère des unités
     
    	ascii_rtc_temp[3]=',';								// Affiche le caractère virgule dans la chaine composant le resultat
     
    	// Gestion des digits après la virgule
    	tmp_temp = (RTC_TEMP_LSB & (0b11000000));			// Lecture des bits 6 et 7 de RTC_TEMP_LSB
    	tmp_temp >>= 6;										// Décale les bits 6 et 7 de 6 rangs vers la droite. Ex : 11000000 -> 00000011
    	tmp_temp *= 25;										// Le resultat obtenu doit est multiplié par 25 (voir datasheet : car 2 bits obtenus sont des fractions de 1/4 de degrés)
    														// 0b00 x 25 = 0 ; 0b01 x 25 = 25 ; 0b10 x 25 = 50 ; 0b11 x 25 = 75
     
    	dixiemes = tmp_temp/10;								// On obtient les dixiemes
    	centiemes = tmp_temp%10;							// On obtient les centiemes
     
    	ascii_rtc_temp[4] = '0' + dixiemes;					// Creation du caractère des dixiemes
    	ascii_rtc_temp[5] = '0' + centiemes;				// Creation du caractère des centiemes
     
    	ascii_rtc_temp[6]='\0';								// Termine la chaine				
    }
    Par contre, maintenant que mon code fonctionne, je cherche à réduire le nombre de variables pour gagner de la mémoire, car je suis en C embarqué

    J'ai essayé de supprimer une étape dans la génération des caractères ascii qui permettent l'affichage de la température, mais faire ce qui suit ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ascii_rtc_temp[1] = '0' + tmp_temp/10;
    Pourquoi faut il absolument passer par une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dizaines = tmp_temp/10;
    ascii_rtc_temp[1] = '0' + dizaines;
    Pouvez vous m'aider à optimiser svp ?
    Merci à vous,

  8. #8
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    J'ai essayé de supprimer une étape dans la génération des caractères ascii qui permettent l'affichage de la température, mais faire ce qui suit ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ascii_rtc_temp[1] = '0' + tmp_temp/10;
    Pourquoi faut il absolument passer par une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dizaines = tmp_temp/10;
    ascii_rtc_temp[1] = '0' + dizaines;
    Normalement, la variable temporaire n'est pas indispensable.
    De quelle manière le code « ne fonctionne pas » ?

    Le problème peut venir du type de tmp_temp, ou du type de l'expression tmp_temp/10.
    Il faut peut-être caster l'un des deux ou les deux en int ou en unsigned char, ou d'abord et unsigned char puis en int.
    Je ne sais pas si ça va changer quelque chose, il faut essayer...

Discussions similaires

  1. Manipulation des variables de callback
    Par Warno dans le forum jQuery
    Réponses: 3
    Dernier message: 24/02/2010, 09h53
  2. Comment manipuler des fichiers binaires ?
    Par yrejk dans le forum C++
    Réponses: 1
    Dernier message: 15/04/2008, 19h40
  3. Manipuler des fichiers binaires en csharp
    Par olibara dans le forum C#
    Réponses: 5
    Dernier message: 04/04/2008, 14h07
  4. Manipuler des variables/valeurs
    Par ttone dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2008, 17h13
  5. Manipulation des variables.
    Par fred61 dans le forum C
    Réponses: 12
    Dernier message: 22/04/2007, 19h35

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