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 }
Partager