Witam,
Mam czujnik DS18B20
i taki kod do niego:
Oczywiście wszystko w realu działa
Chciałbym teraz za symulować ten układ.
Ustalmy sobie na początek temperaturę np.10.125C
czyli (0000 0000 1010 0010)Bin
(162)DEC
Robimy drobne poprawki w kodzie:
Teraz wyjaśnię moje zmiany w kodzie :
Oryginalnie do zmiennej Odczyt(1) szedł kod z czujnika BCD18B20,
Natomiast ja podałem mu tam wartość 401, czyli w kodzie binarnym dokładnie:
0000 0001 1001 0001, z tabelki można odczytać, że to powinno wynieść +25.0625C,
Po przeleceniu kodu na końcu mamy PRINT NAPIS: czyli printowanie naszej temperatury.
Niestety zamiast spodziewanego 25.625 dostaję wynik 9.1
Mógłby ktoś mi wyjaśnić dlaczego tak jest?
Mam czujnik DS18B20
i taki kod do niego:
'Jednopunktowy termometr z czujnikiem DS18B20
'www.portalnaukowy.edu.pl
'Program na podstawie kursu z ksiażki "Mikrokontrolery dla Poczatkujacych" Pana Piotra Góreckiego
$crystal = 4000000 'deklaracja częstotliwosci pracy kwarcu
$regfile "attiny2313.dat" 'model procesora dla którego jest ten program
Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 ' definicja znaki stopnia
Config 1wire = Portd.5 ' konfiguracja portu PD.5 jako wescia magistrali 1-wire
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
Do
1wreset 'reset
1wwrite &HCC 'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
1wwrite &H44 'dokonaj konwersji
Waitms 750 'przeczekaj czas konwersji
1wreset 'reset
1wwrite &HCC 'rozkaz adresowy SKIP ROM
1wwrite &HBE 'rozkaz funkcyjny - polecenie odczytu DS18x20
Odczyt(1) = 1wread(2) 'odczytaj dwa pierwsze bajty
T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
Shift T , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
T = T + Odczyt(1) 'przepisz - dodaj młodszy bajt
T1 = T * 0.0625 'wyraz w stopniach Celsjusza, wynik wpisz do zmiennej Single
Napis = Fusing(t1 , "#.#")
Cls : Cursor Off : Lcd "* Temperatura *"
Lowerline
Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C" 'wyswietl wynik ze zmiennej Single
Loop : End
'PowodzeniaOczywiście wszystko w realu działa
Chciałbym teraz za symulować ten układ.
Ustalmy sobie na początek temperaturę np.10.125C
czyli (0000 0000 1010 0010)Bin
(162)DEC
Robimy drobne poprawki w kodzie:
$sim
$regfile = "attiny2313.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portd.2 , Rs = Portd.0
Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 ' definicja znaki stopnia
Config 1wire = Portd.5 ' konfiguracja portu PD.5 jako wescia magistrali 1-wire
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5 , NowaTemp As Integer
'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
Nowatemp = 401 ' !!!ZMIANA!!!
Print Bin(nowatemp) ' !!!ZMIANA !!!!printuje 0000 0001 1001 0001
Do
' 1wreset 'reset
' 1wwrite &HCC 'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
' 1wwrite &H44 'dokonaj konwersji
' Waitms 750 'przeczekaj czas konwersji
' 1wreset 'reset
' 1wwrite &HCC 'rozkaz adresowy SKIP ROM
' 1wwrite &HBE 'rozkaz funkcyjny - polecenie odczytu DS18x20
Odczyt(1) = Nowatemp '!!! ZMIANA !!!odczytaj dwa pierwsze bajty
T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
Shift T , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
T = T + Odczyt(1) 'przepisz - dodaj młodszy bajt
T1 = T * 0.0625 'wyraz w stopniach Celsjusza, wynik wpisz do zmiennej Single
Napis = Fusing(t1 , "#.#")
Cls : Cursor Off : Lcd "* Temperatura *"
Lowerline
Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C"
Print Napis '!!!! ZMIANA !!!!wyswietl temperature 9,1 CZEMU?
Loop : End
Teraz wyjaśnię moje zmiany w kodzie :
Oryginalnie do zmiennej Odczyt(1) szedł kod z czujnika BCD18B20,
Natomiast ja podałem mu tam wartość 401, czyli w kodzie binarnym dokładnie:
0000 0001 1001 0001, z tabelki można odczytać, że to powinno wynieść +25.0625C,
Po przeleceniu kodu na końcu mamy PRINT NAPIS: czyli printowanie naszej temperatury.
Niestety zamiast spodziewanego 25.625 dostaję wynik 9.1
Mógłby ktoś mi wyjaśnić dlaczego tak jest?