Witam
Wczoraj zakupiłem sobie czujnik ds18b20 miał być ds1820 o czym dowiedziałem się dopiero w domu po nieudanej probie odczytu temperatury. Kod który użyłem pochodził z książki M. Wiązani. (niżej go zamieszczam). i tak po połączeniu wszystkiego wg. schematu dostałem odczyt temperatury -52 st. C co jest absurdem bo powinno być ok. 20 - 21 st. C i tak zacząłem szukać na forum jak by odczytać temp. z tego czujnika i znalazłem kod przerobiłem oryginalny i otrzymałem prawdo podobnie prawidłowy wynik 21.00 st. C niestety podczas próby z suszarką do włosów (chciałem sprawdzić czy da radę mierzyć wysokie temp.) stało się coś dziwnego otóż po dojściu do 35 st. C skala zmieniła się na ujemna i tak oto temp. zaczęła spadać... to też chciałem się zapytać co mogło być spowodowane nagłą zmianą skali? kod oryginalny z książki i przerobiony prze zemnie zamieszczam niżej
oraz proszę o wskazanie błędu w mojej wersji
Oryginalny:
Przerobiony (z błędem):
Pozdrawiam
Rav
Dodano po 2 [godziny] 12 [minuty]:
Już sobie poradziłem
wklejam prawidłowy (moim zdaniem) kod:
Wczoraj zakupiłem sobie czujnik ds18b20 miał być ds1820 o czym dowiedziałem się dopiero w domu po nieudanej probie odczytu temperatury. Kod który użyłem pochodził z książki M. Wiązani. (niżej go zamieszczam). i tak po połączeniu wszystkiego wg. schematu dostałem odczyt temperatury -52 st. C co jest absurdem bo powinno być ok. 20 - 21 st. C i tak zacząłem szukać na forum jak by odczytać temp. z tego czujnika i znalazłem kod przerobiłem oryginalny i otrzymałem prawdo podobnie prawidłowy wynik 21.00 st. C niestety podczas próby z suszarką do włosów (chciałem sprawdzić czy da radę mierzyć wysokie temp.) stało się coś dziwnego otóż po dojściu do 35 st. C skala zmieniła się na ujemna i tak oto temp. zaczęła spadać... to też chciałem się zapytać co mogło być spowodowane nagłą zmianą skali? kod oryginalny z książki i przerobiony prze zemnie zamieszczam niżej
Oryginalny:
'Program obsługi jednego układu DS1820 dołączonego
'do magistrali 1-Wire
$regfile = "m8def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Lcd = 16 * 2 'konfiguracja typu wyświetlacza
'LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 'konfiguracja linii
'mikrokontrolera‚ do których
'dołączono wyświetlacz
'LCD
Config 1wire = Portb.0 'konfiguracja linii magistrali
'1-Wire
Declare Sub Odcz_temp 'procedura odczytu temperatury
'z układu DS1820
Dim Temperatura(2) As Byte 'tablica dwóch zmiennych typu
'Byte do pamiętania wartości
'temperatury
'definicja znaku stopnia
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Do 'początek pętli programu
Call Odcz_temp 'wywołanie procedury pomiaru
'temperatury
Cls 'czyszczenie ekranu LCD
If Temperatura(2) = 0 Then 'jeśli wartość Temperatura(2)=
'=0, to temperatura dodatnia
'wyświetla temperatury dodatnie
Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
Else 'w przeciwnym razie
'wyświetla temperatury ujemne
Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
End If
Loop 'koniec pętli Do...Loop
End 'koniec programu
Sub Odcz_temp 'definicja procedury pomiaru
'temperatury
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &H44 'start pomiaru temperatury
Waitms 750 'opóźnienie na czas pomiaru
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &HBE 'komenda odczytu zmierzonej
'temperatury
Temperatura(1) = 1wread(2) 'odczyt zmierzonej temperatury
'do tablicy Temperatura
1wreset 'reset magistrali 1-Wire
If Err = 1 Then 'jeśli układ dołączony do
'magistrali nie odpowiada, to
Cls 'czyszczenie LCD
Lcd "Brak ukladu" 'wyświetlenie komunikatu o braku
'dołączonego układu
Do 'nieskończona pętla w celu
'wstrzymania działania programu
Loop
End If
If Temperatura(2) > 0 Then 'jeśli zmienna Temperatura(2)
'> 0, to temperatura ujemna
'przeliczenie temperatury
'ujemnej
Temperatura(1) = 256 - Temperatura(1)
End If 'koniec warunku
Temperatura(1) = Temperatura(1) / 2
'dalsze przeliczenie odczytanej
'temperatury dodatniej jak
'i ujemnej
End Sub
Przerobiony (z błędem):
'Program obsługi jednego układu DS1820 dołączonego
'do magistrali 1-Wire przerobiony przez rav1989
informuje kompilator o pliku dyrektyw mikrokontrolera
$regfile = "m8def.dat"
'informuje kompilator o częstotliwości oscylatora taktującego mikrokontroler
$crystal = 8000000
'konfiguracja typu wyświetlacza LCD
Config Lcd = 16 * 1a
'brak kursora
Cursor Off
'konfiguracja linii mikrokontrolera do których dołączono wyświetlacz LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
'konfiguracja linii magistrali 1-Wire
Config 1wire = Portb.0
'procedura odczytu temperatury z układu DS1820
Declare Sub Odcz_temp
'definicje
Dim Temperatura(2) As Byte
Dim Odczyt As Single
Dim Temp As String * 5
'definicja znaku stopnia
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Do 'początek pętli programu
Call Odcz_temp 'wywołanie procedury pomiaru temperatury
Cls 'czyszczenie ekranu LCD
If Temperatura(2) = 1 Then 'jeśli wartość Temperatura(2)=
'=1, to temperatura dodatnia
'wyświetla temperatury dodatnie
Lcd "Temp: " ; Temp ; Chr(0) ; "C"
Else 'w przeciwnym razie
'wyświetla temperatury ujemne
Lcd "Temp: -" ; Temp ; Chr(0) ; "C"
End If
Loop 'koniec pętli Do...Loop
End 'koniec programu
Sub Odcz_temp 'definicja procedury pomiaru
'temperatury
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &H44 'start pomiaru temperatury
Waitms 750 'opóźnienie na czas pomiaru
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &HBE 'komenda odczytu zmierzonej
'temperatury
Temperatura(1) = 1wread(2) 'odczyt zmierzonej temperatury
'do tablicy Temperatura
1wreset 'reset magistrali 1-Wire
If Err = 1 Then 'jeśli układ dołączony do
'magistrali nie odpowiada, to
Cls 'czyszczenie LCD
Lcd "Brak ukladu" 'wyświetlenie komunikatu o braku
'dołączonego układu
Do 'nieskończona pętla w celu
'wstrzymania działania programu
Loop
End If
If Temperatura(2) < 1 Then 'jeśli zmienna Temperatura(2)
'> 0, to temperatura ujemna
'przeliczenie temperatury
'ujemnej
Temperatura(1) = 256 - Temperatura(1)
End If 'koniec warunku
Odczyt = Temperatura(1) / 8 'dalsze przeliczenie odczytanej
'temperatury dodatniej jak
'i ujemnej
Temp = Fusing(odczyt , "##.##") 'formatowanie do postaci 00.00
End SubPozdrawiam
Rav
Dodano po 2 [godziny] 12 [minuty]:
Już sobie poradziłem
'Program obsługi jednego układu DS18B20 dołączonego
'do magistrali 1-Wire przerobiony przez rav1989
$regfile = "m8def.dat"
'informuje kompilator o częstotliwości oscylatora taktującego mikrokontroler
$crystal = 8000000
'konfiguracja typu wyświetlacza LCD
Config Lcd = 16 * 1a
'brak kursora
Cursor Off
'konfiguracja linii mikrokontrolera do których dołączono wyświetlacz LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
'konfiguracja linii magistrali 1-Wire
Config 1wire = Portb.0
'procedura odczytu temperatury z układu DS1820
Declare Sub Odcz_temp
'definicje
Dim Lsb As Byte
Dim Msb As Byte
Dim Tempstr As String * 5
Dim Temp As Single
Dim Tempa As Integer
Dim Minus As Bit
Dim Bukl As Bit
'definicja znaku stopnia
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Do
Call Odcz_temp 'wywołanie procedury pomiaru temperatury
Cls
If Bukl = 0 Then
If Minus = 0 Then
'wyświetla temperatury dodatnie
Lcd "Temp: " ; Tempstr ; Chr(0) ; "C"
Else
'wyświetla temperatury ujemne
Lcd "Temp: -" ; Tempstr ; Chr(0) ; "C"
End If
Else
Lcd "Brak ukladu"
End If
Loop 'koniec pętli Do...Loop
End 'koniec programu
Sub Odcz_temp 'definicja procedury pomiaru temperatury
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &H44 'start pomiaru temperatury
Waitms 750 'opóźnienie na czas pomiaru
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &HBE 'komenda odczytu zmierzonej
Lsb = 1wread():
Msb = 1wread():
1wreset
Reset Bukl
Reset Minus
If Err = 0 Then
Tempa = Msb * 256
Tempa = Tempa + Lsb
If Msb.7 = 0 Then
Temp = Tempa / 16
Else
Set Minus
Tempa = Not Tempa
Tempa = Tempa + 1
Temp = Tempa / 16
End If
Tempstr = Fusing(temp , "###.##") 'formatowanie do postaci 000.00
Else
Set Bukl
End If
End Sub
