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