Witam,
przeglądnąłem prawie wszystkie posty dotyczące DS11820 (oj było ich trochę). Większośc przykładów jest bisana pod BASCOMa a je potrzebuje informacji i przykładowych kodów w C aby podglądnąc i rozwiązac moje problemy.
O co chodzi.
1. Temperatura wyświetlana na 4 z 8 wyświetlaczach 7-seg. LED.
2. Licze CRC i upraszczam sobe wyswietlajac wynik z dokładnościa 0.5C po przecinku.
3. Obsługa wyświetlaczy znajduje się w przerwaniu od TMER0. Działa bez zarzutu, więc jej nie skopiowałem do posta.
Wyswitlanie temp na wyswietlaczach:
Generalnie wszystko działa ale chciałbym ulepszenia, które nie daje mi spac.
A teraz problemy i prosba o pomoc w ich rozwiązaniu:
1. Jak zwiekszyc precyzję wyświetlania dziesiętnych stopni? Cel 0.1 a nie 0.5
Co tak naprawde daje w resultacie:
TEMPERATURE=TEMP_READ-0,25+ (COUNT_PER_C-COUNT_REMAIN)/COUNT_PER_C? Jak będzie wyglądała wartoś TEMPERATURE? Bedzie to np. 225 (22.5)?
Wg moich obliczen zawsze będzie to dokładnośc do 0.5st.
2. Mógłby któś zerknąc na funkcję DisplayValue () bo coś podejrzewam ze pow. 100 st nie spelnia ona swojego zadania.
3. Przejscie na DS18B20 nie wchodzi w rachube bo chce sie pozbyc starych czujnikow
Pozdrawiam
J_D
przeglądnąłem prawie wszystkie posty dotyczące DS11820 (oj było ich trochę). Większośc przykładów jest bisana pod BASCOMa a je potrzebuje informacji i przykładowych kodów w C aby podglądnąc i rozwiązac moje problemy.
O co chodzi.
1. Temperatura wyświetlana na 4 z 8 wyświetlaczach 7-seg. LED.
2. Licze CRC i upraszczam sobe wyswietlajac wynik z dokładnościa 0.5C po przecinku.
3. Obsługa wyświetlaczy znajduje się w przerwaniu od TMER0. Działa bez zarzutu, więc jej nie skopiowałem do posta.
while(1)
{ CRC = 0;
DS_Present=reset_1w();
if (DS_Present != 0)
{
temp_sign = 8;
temp_h = 8;
temp_l = 8;
temp_units = 8;
}
else
{
send_1w(0xCC);
send_1w(0x44);
_delay_ms(750);
reset_1w();
send_1w(0xCC);
send_1w(0xBE);
for (i=0; i<9; i++)
{
ds_map [i] = get_1w();
licz_CRC (ds_map [i], &CRC);
}
reset_1w();
if (CRC==0)
{
T_LSB = ds_map[0]; //temp
T_MSB = ds_map[1];
// wyswietlanie dziesiatek stopnia
if ((T_LSB & 0x01) == 0) temp_units = 0;
else temp_units = 5;
// Liczenie temperatury
if(T_MSB==0) // plus
{
temp_sign = 0;
T_LSB = T_LSB/2;
DisplayValue (T_LSB);
}
else
{
temp_sign = 10;
T_LSB = (256-T_LSB)/2;
temp_h = T_LSB/10;
k = temp_h*10;
temp_l=T_LSB - k;
}
}
}
Wyswitlanie temp na wyswietlaczach:
void DisplayValue (unsigned char Value)
{
// temp_sign - Display 0 - znak temp.
// temp_h - Display 1 - dziesiątki temp.
// temp_l - Display 2 - jednostki temp.
// temp_units - Display 3 - dziesietne częsci temp.
unsigned char i, j;
if (Value >= 125)
{
Value = 125;
temp_sign = 1;
temp_h = 2,
temp_l = 5;
}
if (Value >= 100 && Value < 125)
{
temp_sign = abs (Value/100);
i = Value - (temp_sign*100);
temp_h = i/10;
j = temp_h*10;
temp_l = i - j;
}
if (Value<100 && Value>9)
{
//temp_sign = 0;
temp_h = abs (Value/10);
temp_l = Value - (temp_h*10);
}
if (10 > Value)
{
temp_l = Value;
temp_h = 0;
//temp_sign = 0;
}
}Generalnie wszystko działa ale chciałbym ulepszenia, które nie daje mi spac.
A teraz problemy i prosba o pomoc w ich rozwiązaniu:
1. Jak zwiekszyc precyzję wyświetlania dziesiętnych stopni? Cel 0.1 a nie 0.5
Co tak naprawde daje w resultacie:
TEMPERATURE=TEMP_READ-0,25+ (COUNT_PER_C-COUNT_REMAIN)/COUNT_PER_C? Jak będzie wyglądała wartoś TEMPERATURE? Bedzie to np. 225 (22.5)?
Wg moich obliczen zawsze będzie to dokładnośc do 0.5st.
2. Mógłby któś zerknąc na funkcję DisplayValue () bo coś podejrzewam ze pow. 100 st nie spelnia ona swojego zadania.
3. Przejscie na DS18B20 nie wchodzi w rachube bo chce sie pozbyc starych czujnikow
Pozdrawiam
J_D