Witam.
Składam sobie zegar z termometrem na Attiny2313 i DS18B20 lecz mam problem z ujemną temperaturą. Do odczytu temperatury używam programu kolegi "Elektrooonik" ponieważ zajmuje najmniej kodu co jest tu dla mnie ważne i z 1-Wire styczność mam pierwszy raz więc wpierw wolę mieć jakiś przykład.
Program Oryginalny do pomiaru temperatury wygląda tak:
Ten program odczytuje od 0 do 99st C a ja potrzebuję również ujemnych temperatur przy czym kod musi zajmować jak najmniej miejsca.
Próbowałem już kilkadziesiąt różnych sposobów ale nic to nie dało.
Obsługa wyświetlacza musi zostać taka gdyż oba timery mam zajęte.
Proszę o szybką pomoc i z góry dziękuję.
Składam sobie zegar z termometrem na Attiny2313 i DS18B20 lecz mam problem z ujemną temperaturą. Do odczytu temperatury używam programu kolegi "Elektrooonik" ponieważ zajmuje najmniej kodu co jest tu dla mnie ważne i z 1-Wire styczność mam pierwszy raz więc wpierw wolę mieć jakiś przykład.
Program Oryginalny do pomiaru temperatury wygląda tak:
Code:
Config Portb = Output
Config Portd = Output
Portb = 255
Portd = 127
Dim Zmienna As Byte
Dim Liczba As Byte
Dim Jednosci As Byte
Dim Dziesiatki As Byte
Dim Temp As Byte
Dim 1cyfra As Byte
Dim 2cyfra As Byte
Dim A As Byte
Dim Odczyt(2) As Byte
Dim T As Integer
Portd.0 = 1
Portd.1 = 0
Config 1wire = Portd.0
Liczba = 77
Do
1wreset : 1wwrite &HCC : 1wwrite &HBE 'polecenie odczytu DS18x20
Odczyt(1) = 1wread(2) 'odczytaj dwa pierwsze bajty - temperaturę
T = Odczyt(2) ' starszy bajt temperatury
Shift T , Left , 8 'przesuń w lewo o 8 miejsc
T = T + Odczyt(1) 'w zmiennej Integer jest dziwna "ułamkowa" wartość
Shift T , Right , 4 'zamiast dzielić przez 16 przesuń w prawo
' Shift T , Right , 1 'dla kostek DS18S20, DS1820 przesuń o 1 bit
1wreset ' dopiero teraz daj polecenie konwersji:
1wwrite &HCC 'polecenie SKIP ROM, bo pojedyncza kostka
1wwrite &H44 ' dokonaj konwersji - zmierz temperaturę
'po cyklu pracy poczekaj
Liczba = T
Gosub Wyswietlanie
Loop
Wyswietlanie:
Portd.1 = 1
Gosub Oblicz
For A = 0 To 125
Dziesiatki:
If Dziesiatki = 0 Then
Portd.6 = 1
Goto Jednosci
End If
Portb = 1cyfra
Portd.6 = 0
Waitms 3
Jednosci:
Portb = 2cyfra
Portd.6 = 1
Portb.0 = 0
Waitms 3
Next A
A = 0
Portd.1 = 0
Return
Oblicz:
Temp = Makebcd(liczba)
Jednosci = Temp And &B00001111
Shift Temp , Right , 4
Dziesiatki = Temp
1cyfra = Lookup(dziesiatki , Tabela)
2cyfra = Lookup(jednosci , Tabela)
'Dziesiatki = Liczba / 10
'Jednosci = Dziesiatki * 10
'Jednosci = Liczba - jednosci
Return
End
Tabela:
Data 3 , 111 , 133 , 37 , 105 , 49 , 17 , 99 , 1 , 33
Ten program odczytuje od 0 do 99st C a ja potrzebuję również ujemnych temperatur przy czym kod musi zajmować jak najmniej miejsca.
Próbowałem już kilkadziesiąt różnych sposobów ale nic to nie dało.
Obsługa wyświetlacza musi zostać taka gdyż oba timery mam zajęte.
Proszę o szybką pomoc i z góry dziękuję.