aries

LM75 procedury uzupełnień do 2

Konwersja 2 bajtów temperatury na wartość typu float

Parametrami funkcji są 2 wskaźniki: char *p_buf wskazujący na bufor ze starszym i młodszym bajtem temperatury i float *p_temp wskazujący na bufor przeznaczony na wartość otrzymaną po konwersji. Stałe TEMP_MIN i TEMP_MAX służą do sprawdzania czy otrzymany po konwersji wynik mieści się w dopuszczalnym zakresie. Jeżeli wszystko się zgadza funkcja zwraca wartość true.

		
char Konwersja_odczyt_temp(char *p_buf, float *p_temp)
{
uint16_t liczba;
float temp;

liczba =*p_buf <<1;
if ((*(p_buf+1) & 0x80) !=0) liczba =liczba+1;
if ((liczba & 0x100) !=0)
{
	//temperatura ujemna
	liczba =(~liczba &0xff)+1;
	temp =liczba;
	temp =0 -temp;
}
else temp =liczba;
temp =temp /2;
//sprawdzanie czy odczytana temperatura mieści się w dopuszczalnym zakresie
if (temp < TEMP_MIN || temp > TEMP_MAX) return false;

*p_temp =temp;
return true;
}	
		
		

Konwersja wartości typu float na 2 bajty temperatury

Wartość umieszczona w buforze wskazywanym przez float *p_temp zostaje zamieniona na 2 bajty temperatury w formacie dopełnienia do 2. Procedura sprawdza czy temperatura do konwersji mieści się w dopuszczalnym zakresie. Jeżeli tak, następuje zamiana temperatury na 2 bajty zapisywane w buforze char *p_buf.

		
char Konwersja_zapis_temp(char *p_buf, float *p_temp)
{
float temp;
char temperatura_ujemna;
uint16_t temp_16;
char ulamek_05;

temp =*p_temp;
//sprawdzanie czy temperatura do konwersji mieści się w dopuszczalnym zakresie
if (temp < TEMP_MIN || temp > TEMP_MAX) return false;
if (temp<0)
{
	temperatura_ujemna =true;
	temp =0 - temp;//zmiana na wartość absolutną
}
else temperatura_ujemna =false;

temp_16 =temp;		//temperatura w stopniach
if ((temp-temp_16)>=0.5) ulamek_05 =true;
else ulamek_05 =false;
temp_16 =temp_16<<1;//temperatura w 0,5 stopnia
if (ulamek_05 ==true) temp_16++;
if (temperatura_ujemna ==true)
{
	temp_16 =~temp_16 +1;
}
temp_16 =temp_16 & 0x1ff;

//formowanie 2 bajtów w dopełnieniu do 2
temp_16 =(temp_16<<7);
*p_buf =(temp_16>>8);//H bajt
*(p_buf+1) =0xff & temp_16;
return true;
}