Temperatura jako dwa rejestry w pierwszym temperatura, w drugim reszta temperatury po przecinku
Kod:
void przelicz_temperature(uint8_t *dane_tablica, temperatura *czujnik_temperatury){
uint8_t a=*dane_tablica;
dane_tablica++;
uint8_t b=*dane_tablica;
if((b)&(1<<7)){//temperatura ujemna
//temperatura ujemna
czujnik_temperatury->znak='-';
a=~a; //negacja
b=~b;
a+=1; //lsb + 1
czujnik_temperatury->temperatura=(b<<4)+(a>>4);
}else{//temperatura dodatnia
czujnik_temperatury->znak='+';
czujnik_temperatury->temperatura= b*16+(a>>4);
}
//po przecinku zostaje
czujnik_temperatury->po_przecinku=a&0x0F;
czujnik_temperatury->po_przecinku=(czujnik_temperatury->po_przecinku*6)/10;
}//funkcja
A tutaj temperatura w jednym rejestrze uint16_t np: wartość 356 w rejestrze odpowiada temperaturze 35,6 - przeliczenie i wyświetlenie to już najmniejszy problem.
Kod:
uint8_t pomocnicza = 0;
if (ds_tablica[1] & 1 << 7) {
//temperatura ujemna
znak_temperatury = '-';
ds_tablica[0] = ~ds_tablica[0]; //negacja
ds_tablica[1] = ~ds_tablica[1];
ds_tablica[0] += 1; //lsb + 1
temperatura = (ds_tablica[1] << 4) + (ds_tablica[0] >> 4);
//obliczenie calkowitej
} else {//temperatura dodatnia
znak_temperatury = 0;
temperatura = (ds_tablica[1]) * 16 + (ds_tablica[0] >> 4);
} //temperatura dodatnia
//po przecinku
pomocnicza = ds_tablica[0] & 0x0F;
pomocnicza = (pomocnicza * 6) / 10;
//temperatura
temperatura = (temperatura * 10) + pomocnicza;
A tutaj temperatura w jednym rejestrze uint16_t np: wartość 356 w rejestrze odpowiada temperaturze 35,6 - przeliczenie i wyświetlenie to już najmniejszy problem.