Witam Kolegów, zaczynam naukę programowania w środowisku Bascom, na warsztacie mam Attiny2313 i DS18B20, chciałem sprawdzić jak działa odczyt temperatury (wyświetlanie na LCD opanowałem wczoraj, pin'ologia LCD niezmieniona). DS18B20 podłączyłem następująco: 1 - Gnd, 2 - do pin'u wejściowego oraz przez R=4.7k do +5V, 3 - +5V. Całość jest zasilana przez programator USB ISP z portu USB komputera (stacjonarnego, napięcie zmierzone na Vcc to ok. 4.8V). Oto kod (lekko skróciłem jakiś przykład z tego forum, do jednego czujnika, bo cały soft nie mieścił się w tym procku), zmienione są pin'y podpięte do LCD (Attiny2313 nie ma portu C):
Tu są ustawienia fuse-biótw (hex wrzucam przez AVR STudio, z Bascom'a jeszcze nie potrafię, coś w ustawieniach programatora nie gra).
Efekt jest taki, najpierw wyświetla zero w pierwszym znaku górnej linii LCD, potem przez chwilę "Czujnik 1 OK", a potem "Temp: 0.0°C". Próbowałem podpinać Vcc czujnika do GND, wtedy nie działa wcale. Jeśli nie ma czujnika, mam komunikat "Brak czujnika". Używałem dwóch czujników (ale od jednego dostawcy). Układ jest zmontowany na płytce stykowej, działa ISP, działa LCD, mam tylko kłopot z tym DS18B20.
Docelowo chciałem zrobić jednoczujnikowy termostat ustawiany w zakresie 30-95°C, a już optymalnie użyłbym okrojonego kodu z Attiny13 do termostatu pilnującego zadanej na stałe w kodzie wartości temperatury (bez guzików, LCD, itd., tylko dwie diody: grzanie i gotowość, no i wyjście na optotriak i triak oczywiście).
Gdyby ktoś z Kolegów zechciał mi w starym roku nieco rozjaśnić moją jakże skromną wiedzę, będę zobowiązany
Pozdrawiam i życzę udanego Sylwestra i Szczęśliwego Nowego Roku !
====== Edit ======
Szukam dalej i z takim kodem wyświetla mi cały czas temperaturę 25.5 stopnia Celsjusza.
A następny kod (chyba błędny jest odczyt, bo DS18B20 powinien mieć odczyt w dwóch bajtach) daje niezmieniający się wynik -0.1 stopnia:
Wyświetlacz pokazuje też "-0.0625oC" po zapodaniu takiego kodu:
$regfile = "attiny2313.dat"
$Crystal=8000000
' DS18B20 został wpięty z podlaczeniem Vdd do +5V, DQ do wejścia PortB.0
' (DQ podciagniete przez R=4.7k do +5V), GND do masy
'Deklaracja portów od wyświetlacza LCD (działa z innymi programami szkoleniowymi)
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2
Cursor Off
'**** Termometr ****
Config 1wire = Portb.0
Dim I1 As Integer , Ss As String * 6
'Dim I2 As Integer
Dim Dsid1(8) As Byte
'Dim Dsid2(8) As Byte 'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte
Dim B As Byte 'deklaracja zmiennej do odczytu ilośc czujników
W = 1wirecount()
Cls
Locate 1 , 1
Lcd W
Wait 1
Cls
Dsid1(1) = 1wsearchfirst() 'Znajdź kolejny czujnik podpięty do portu
'Dsid2(1) = 1wsearchnext() 'Znajdź kolejny czujnik podpięty do portu
'*******************Odczyt numerów ID czujników temperatury*********************
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
Cls
Lcd " Czujnik 1 OK "
Waitms 100
End If
Cls
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
Do
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
I1 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
I1 = I1 * 10
I1 = I1 / 16
Ss = Str(i1)
Ss = Format(ss , " 0.0") 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
Locate 2 , 1
Lcd "Temp: " ; Ss ; Chr(0)
Loop
Tu są ustawienia fuse-biótw (hex wrzucam przez AVR STudio, z Bascom'a jeszcze nie potrafię, coś w ustawieniach programatora nie gra).
![[Bascom] Pomiar DS18B20 - wyświetla zero [Bascom] Pomiar DS18B20 - wyświetla zero](https://obrazki.elektroda.pl/7126456000_1325255776_thumb.jpg)
Efekt jest taki, najpierw wyświetla zero w pierwszym znaku górnej linii LCD, potem przez chwilę "Czujnik 1 OK", a potem "Temp: 0.0°C". Próbowałem podpinać Vcc czujnika do GND, wtedy nie działa wcale. Jeśli nie ma czujnika, mam komunikat "Brak czujnika". Używałem dwóch czujników (ale od jednego dostawcy). Układ jest zmontowany na płytce stykowej, działa ISP, działa LCD, mam tylko kłopot z tym DS18B20.
Docelowo chciałem zrobić jednoczujnikowy termostat ustawiany w zakresie 30-95°C, a już optymalnie użyłbym okrojonego kodu z Attiny13 do termostatu pilnującego zadanej na stałe w kodzie wartości temperatury (bez guzików, LCD, itd., tylko dwie diody: grzanie i gotowość, no i wyjście na optotriak i triak oczywiście).
Gdyby ktoś z Kolegów zechciał mi w starym roku nieco rozjaśnić moją jakże skromną wiedzę, będę zobowiązany

Pozdrawiam i życzę udanego Sylwestra i Szczęśliwego Nowego Roku !
====== Edit ======
Szukam dalej i z takim kodem wyświetla mi cały czas temperaturę 25.5 stopnia Celsjusza.
$regfile = "attiny2313.dat"
$crystal = 4000000
' DS18B20 został wpięty z podlaczeniem Vdd do +5V, DQ do wejścia PortB.0 (DQ podciagniete przez R=4.7k do +5V)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2
'**** Termometr **** NIE DZIAŁA, wyświetla cały czas 25.5 C
Config Portb = Output
Config Portd = Output
Portb = 127
Dim Odczyt(2) As Byte
Dim T As Integer
Dim Liczba As Byte
Dim L As String * 6
Portb.0 = 1
Portb.1 = 0
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
Config 1wire = Portb.0
'*******************Odczyt numerów ID czujników temperatury*********************
Liczba = 0
Cursor Off
Cls
Lcd "Czujnik v.07"
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
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
L = Str(liczba)
L = Format(l , " 0.0")
Locate 2 , 1
Lcd "Temp: " ; L ; Chr(0)
Loop
A następny kod (chyba błędny jest odczyt, bo DS18B20 powinien mieć odczyt w dwóch bajtach) daje niezmieniający się wynik -0.1 stopnia:
$regfile = "attiny2313.dat"
$crystal = 8000000
' Wyswietla "Temp:-0.1 C" - NIE DZIAŁA
Config Lcdbus = 4
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pd.2 , Db5 = Pd.3 , Db6 = Pd.4 , Db7 = Pd.5 , E = Pd.1 , Rs = Pd.0
Config 1wire = Portb.0 ' termometr ds18b20
Dim I As Integer 'zmienne do odczytu temp.
Dim S As Single
Dim T As String * 4
'Bardzo ladny znak stopnia - to skopiowac do swoich projektow
Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32 ' znak stopnia
Cursor Off
Cls
'pomiar temp. na termometrze ds18b20
Do
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
I = 1wread(2)
S = I / 16
T = Fusing(s , "##.#")
Locate 1 , 1
Lcd "Temp:" ; T ; Chr(0) ; "C"
Loop
Wyświetlacz pokazuje też "-0.0625oC" po zapodaniu takiego kodu:
$regfile = "attiny2313.dat"
$crystal = 8000000
' Wyswietla "Temp:-0.0625oC" - NIE DZIAŁA
'Config Lcdbus = 4
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pd.2 , Db5 = Pd.3 , Db6 = Pd.4 , Db7 = Pd.5 , E = Pd.1 , Rs = Pd.0
Config 1wire = Portb.0 ' + jumper J2 B-C
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single
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
'teraz w zmiennej T typu Integer jest dziwna "ułamkowa" wartość temperatury
T1 = T / 16 'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
' T1 = T / 2 'dla układów DS18S20 i DS1820
Cls : Lcd "Temp=" ; T1 ; "oC" 'wyświetl wynik ze z zmiennej Single
Loop : End