Termometr 2x DS18B20* Atmega 8


Witam serdecznie
Moja znajomość bascoma jest na etapie początkującym, więc cały czas się uczę. Próbuję napisać program do obsługi dwóch czujników. zamieszczam program, niestety nie działa, może ktoś mi podpowie co źle robię.
Pozdrawiam

$regfile = "m8def.DAT"
$crystal = 8000000
$lib "I2C.LBX"
 
 
Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5
Config Lcd = 16 * 2
 
Config 1wire = Portd.7                                      'port 1wire czujnika temperatury ds18b20
 
 
Config Int1 = Low Level
Enable Interrupts
 
 
 
Dim Temp1 As Integer , Ss1 As String * 6
Dim Temp2 As Integer , Ss2 As String * 6
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim T1 As Integer
Dim T2 As Integer
Dim W As Byte
Dim B As Byte
 
 
 
Dim X As Integer
 
 
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            'znak stopnia Celcjusza
 
 
 
Declare Sub Poczatek
Declare Sub Sprawdzenie
Declare Sub Temp
 
 
 
Cls : Cursor Off
 
 
 
 
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 200
Locate 2 , 8
Lcd W
Wait 2
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
 
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 1 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Waitms 200
Cls
 
If Dsid2(8) = Crc8(dsid2(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 2 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Waitms 200
Cls
 
Cursor Off
 
'-----------------PROGRAM GŁÓWNY---------------------------------------------------------------
 
Poczatek:
Cls
Do
 
 
Call Temp
 
 
Locate 1 , 11 : Lcd ; "in" ; Ss1 ; Chr(0)
 
Locate 2 , 11 : Lcd ; "out" ; Ss2 ; Chr(0)
Cls                                                    'bez nie potrzebnego uzywania cls czyszczenia ekranu, :nie mrugal wyswietlacz
 
Loop
 
'--------------------------------------------------------------------------------
'odczyt temperatury
Temp:
 
 1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   Temp1 = 1wread(2)
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
   1wwrite &HBE
   Temp2 = 1wread(2)
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
 
 Waitms 750
 
   Temp1 = Temp1 * 10
   Temp1 = Temp1 / 16
   T1 = Temp1 + 5
   T1 = Temp1 - 5
   Ss1 = Str(t1)
   Ss1 = Format(ss1 , "0.0")
 
   Temp2 = Temp2 * 10
   Temp2 = Temp2 / 16
   T2 = Temp2 + 5
   T2 = Temp2 - 5
   Ss2 = Str(t2)
   Ss2 = Format(ss2 , "0.0")
 
Return
'--------------------------------------------------------------------------------




Portret użytkownika EDC

Odp. Termometr 2x DS18B20* Atmega 8

Zmieniłeś kod zanim zdażyłem odpowiedzieć.. teraz musze popatrzeć jeszcze raz bo się zmienił

...wiesz co. w obydwu sa takie błedy że dobrze będzie jak przeczytasz ten artykuł Mirleja http://mirley.firlej.org/obsluga_ds18x20

i połaczysz te wykrywanie adresów które miałes w poprzednik kodzie z tym kodem Mirleja na końcu. Po prostu zamiast na sztywno wpisanych danych dodaj te wykrywanie które miałeś

W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 200
Locate 2 , 8
Lcd W
Wait 1
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
 
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 1 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Wait 1
Cls
 
If Dsid2(8) = Crc8(dsid2(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 2 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 1
Cls

tylko tu się potem nazywaja dsid1 i dsid2 a w Mirlejowym kodzie DS1 i DS2 sobie pozmieniasz i się nauczysz czytając

Jeszcze jedno. Config 1wire mozesz mieć tylko jedno w kodzie jeśli wszystkie czujniki mają pracowac na jednej lini/magistrali. Wtedy jednak musisz znac ich adresy. Jesli jednak każdy czujnik jest na osobnej linii/pinie procesora to adresy sa niepotrzebne i Config 1wire, ale potrzebujesz dwóch pinów i musisz pisać którego ma uzyć w danym momencie ( który czujnik).

-

BARTek
Moja strona

Portret użytkownika demsy1

termometr

Zmieniłem na poprzedni kod
oto kod po przeróbce:

[/$regfile = "m8def.DAT"
$crystal = 8000000
$lib "I2C.LBX"
 
Config Portb = 255
Portb = 255
Config Portc = 255
Portc = 255
Config Portd = 255
Portd = 255
 
 
Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5
Config Lcd = 16 * 2
 
Config 1wire = Portd.7                                      'port 1wire czujnika temperatury ds18b20
 
 
Config Int1 = Low Level
Enable Interrupts
 
 
 
Dim Lsb As Byte
Dim Msb As Byte
Dim Temp As Single
Dim Tempa As Integer
Dim Ds1(8) As Byte , Ds2(8) As Byte
Dim Tekst1 As String * 10
Dim Tekst2 As String * 10
Dim W As Byte
Dim B As Byte
 
Dim X As Integer
 
 
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            'znak stopnia Celcjusza
 
 
 
' Declare Sub Poczatek
'Declare Sub Temp
 
 
 
Cls : Cursor Off
 
 
 
 
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 200
Locate 2 , 8
Lcd W
Wait 2
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Ds1(1) = 1wsearchfirst()
Ds2(1) = 1wsearchnext()                                     'Znajdź kolejny czujnik podpięty do portu
 
If Ds1(8) = Crc8(ds1(1) , 7) Then                           'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 1 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(ds1(b))
 Next
End If
Waitms 200
Cls
 
If Ds2(8) = Crc8(ds2(1) , 7) Then                           'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 2 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(ds2(b))
 Next
End If
Waitms 200
Cls
 
Cursor Off
 
'-----------------PROGRAM GŁÓWNY---------------------------------------------------------------
 
Poczatek:
Cls
Do
 
Tempa = Msb * 256
Tempa = Tempa + Lsb
 
If Msb.7 = 0 Then
   Temp = Tempa / 16
Else
  Tempa = Not Tempa
  Tempa = Tempa +1
  Temp = Tempa / 16
  Temp = 0 - Temp
End If
  1wreset
 
  1wwrite &HCC
  1wwrite &H44
  Waitms 250
  Waitms 250
 
  1wreset
 
  1wwrite &H55
  1wwrite Ds2(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Msb * 256
  Tempa = Tempa + Lsb
  Tempa = Tempa / 16
  Tekst1 = Fusing(tempa , "#.##")
 
 
  1wreset
 
  1wwrite &H55
  1wwrite Ds1(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Lsb / 2
  Tekst2 = Fusing(tempa , "#.##")
 
  Cls
  Lcd "IN " ; Tekst1
  Lowerline
  Lcd "OUT" ; Tekst2
 
Loop

z tym że wyskakuje mi błąd w dwóch linijkach

Tekst1 = Fusing(tempa , "#.##") 

Tekst2 = Fusing(tempa , "#.##") 

może przez to że zmienna tempa jest typu integer

Portret użytkownika EDC

Odp. Termometr

Nie bardzo chce mi się analizować cały kod ale napewno tempa musi być typu single. W instrukcji do polecenia Fusing pisze że musi to być Single.
Wszystko zależy od tego jak się podchodzi do sprawy przecinka. Zmienne typu single potrafi zapisac przecinek i to że zmienna jest ujemna. Integer potrafi tylko to że zmienna jest ujemna. Obliczenia na Single kosztują jednak więcej mocy i czasu. Dla małych projektów to nieistotne. W innych rozwiązaniach mnoży się przed obliczeniami na przykład x10 co powoduje że przecinka nie ma. zamiast 23,4 będzie 234. Na końcu wynik to odpowiednio wartość 234/10 dorysowany przecinek i wartośc reszty z dzielenia przez 10 czyli 234 MOD 10

Wiesz co... po namyśle troche posprzątałem

$regfile = "m8def.DAT"
$crystal = 8000000
 
 
Config Portb = &B00000000 : Portb = 11111111                'cały port jest wejściem : stany ustalone na wysokie
Config Portc = &B00000000 : Portc = 11111111                '                -//-
Config Portd = &B01111111 : Portd = 11111111                ' wejscie na 1Wire-PD7 reszta wyświetlacz
 
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5
Config Lcd = 16 * 2
Cursor Off : Cls
 
Config 1wire = Portd.7                                      'port 1wire czujnika temperatury ds18b20
 
Dim Lsb As Byte
Dim Msb As Byte
Dim Tempa As Single
Dim Ds1(8) As Byte , Ds2(8) As Byte
Dim Tekst1 As String * 10
Dim Tekst2 As String * 10
Dim W As Byte
Dim B As Byte
 
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 200
Locate 2 , 8
Lcd W
Wait 1
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Ds1(1) = 1wsearchfirst()
Ds2(1) = 1wsearchnext()                                     'Znajdź kolejny czujnik podpięty do portu
 
If Ds1(8) = Crc8(ds1(1) , 7) Then                           'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 1 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(ds1(b))
 Next
End If
Wait 1
Cls
 
If Ds2(8) = Crc8(ds2(1) , 7) Then                           'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "CRC OK Czujnik 2 ID"
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(ds2(b))
 Next
End If
Wait 1
Cls
 
'-----------------PROGRAM GŁÓWNY---------------------------------------------------------------
Do
'żądanie konwersji (przygotowania odczytu)
1wreset
  1wwrite &HCC
  1wwrite &H44
  'oczekiwanie
  Waitms 250
  Waitms 250
 
'odczyt pierwszego
1wreset
  1wwrite &H55
  1wwrite Ds2(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Msb * 256
  Tempa = Tempa + Lsb
  Tempa = Tempa / 16
  Tekst1 = Fusing(tempa , "#.##")
 
'odczyt drugiego
1wreset
  1wwrite &H55
  1wwrite Ds1(1) , 8
  1wwrite &HBE
 
  Lsb = 1wread():
  Msb = 1wread():
 
  Tempa = Lsb / 2
  Tekst2 = Fusing(tempa , "#.##")
 
'wyświetlenie wyniku
  Cls
  Lcd "IN " ; Tekst1 ; Chr(223) ; "C "                      'Chr(223) to znak stopnia
  Lowerline
  Lcd "OUT" ; Tekst2 ; Chr(223) ; "C "                      'odstep za C posprzata po dlużczyh
 
Loop

Musisz uważać i nie ustawiać portów jako wyjściowych jeśli to niepotrzebne bo można przypadkowo uszkodzić mikrokontroler.
Miłego dnia

-

BARTek
Moja strona

Portret użytkownika gosc

termometr

Wielkie dzieki Bartek, zaraz będę sprawdzał kod. Jeszcze jedno pytanie odnośnie minusowych tem. jaki będzie odczyt z DS?

Portret użytkownika EDC

Odp. Termometr

Prawdę powiedziawszy to nie wiem. Nie miałem czasu sprawdzić. Pracowałem nad zleconym projektem. Dekoduje sekwencje znaków jak SelCall (można o tym poczytać) Wykorzystywane w radio łączności morskiej i okazuje się w sterowaniu komputerami poprzez internet.
W tym Twoim termometrze to dużo jeszcze można by poprawić. Rzadko sie używa Cls w pętli. Lepiej było by przed pętlą
napisać IN i OUT.. a potem tylko odświeżać poprzez Locate wyniki..takiego migania można uniknąć.
Nie mówię że to działa. Może będziesz musiał coś poprawić.

Miłego testowania.

-

BARTek
Moja strona

Portret użytkownika demsy1

Termometr

Witam
Przepraszam że dopiero się odzywam, ale chwilowo nie mogłem nic napisać.
Dzięki Bartek za pomoc. Ten kod wyżej nie działał prawidłowo i jeszcze te mruganie wyświetlacza. Zmieniłem trochę kod:

' Termometr DS18B20
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = &B00000000 : Portb = 11111111                'cały port jest wejściem : stany ustalone na wysokie
Config Portc = &B00000000 : Portc = 11111111                '                -//-
Config Portd = &B00111111 : Portd = 11111111                ' wejscie na 1Wire-PD7 reszta wyświetlacz
 
Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5       'standard
Config Lcd = 16 * 2
Cursor Off Noblink
 
Config 1wire = Portd.6
 
Dim Id1(8) As Byte
Dim Id2(8) As Byte
 
Dim T As Word
Dim S As String * 4
Dim Minus As Bit
 
 
Display Off
Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' definicja symbolu stopnia
 
Id1(8) = 1wsearchfirst()                                    'znajdź czujnik
Id2(8) = 1wsearchnext()
   1wreset
   1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
   1wwrite &H44                                             'Konwersja temperatury
   Waitms 750
 
 
Display On
Cursor Off
Cls
 
Locate 1 , 1
Lcd "IN       OUT"
 
 
Do
 
 
   1wreset
   1wwrite &H55                                             'porównaj numer czujnika
   1wverify Id1(8)
   1wwrite &HBE                                             'komenda odczytania z czujnika
   T = 1wread(2)
 
   1wreset
   1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
   1wwrite &H44                                             'Konwersja temperatury
   Waitms 750
 
 
 
 
   If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
   T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
   Minus = 1
   Else
   Minus = 0
   End If
 
   T = T * 10
   T = T / 16
   S = Str(t)
   S = Format(s , "0.0")
 
   Locate 2 , 1
 
   If Minus = 1 Then
   Lcd "-"
   End If
 
   Lcd S ; Chr(0) ; "C "
 
 
 
  1wreset
   1wwrite &H55                                             'porównaj numer czujnika
   1wverify Id2(8)
   1wwrite &HBE                                             'komenda odczytania z czujnika
   T = 1wread(2)
 
   1wreset
   1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
   1wwrite &H44                                             'Konwersja temperatury
   Waitms 750
 
 
 
 
   If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
   T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
   Minus = 1
   Else
   Minus = 0
   End If
 
   T = T * 10
   T = T / 16
   S = Str(t)
   S = Format(s , "0.0")
 
   Locate 2 , 10
 
 
 
   If Minus = 1 Then
   Lcd "-"
   End If
 
   Lcd S ; Chr(0) ; "C "
 
 
Loop
End

Ten kod wyżej nie działa mi jeszcze prawidłowo, mianowicie po podłączeniu 1 czujnika wyświetla mi tem. w 2-uch pozycjach

Portret użytkownika demsy1

termometr

znalazłem błąd

1wreset
   1wwrite &H55                                             'porównaj numer czujnika
   1wverify Id2(8)- powinno być (1)
   1wwrite &HBE                                             'komenda odczytania z czujnika
   T = 1wread(2)
...................
   1wreset
   1wwrite &H55                                             'porównaj numer czujnika
   1wverify Id1(8)- tu tak samo
   1wwrite &HBE                                             'komenda odczytania z czujnika
   T = 1wread(2)

jeszcze jedno pytanie jak zrobić żeby w momencie kiedy uszkodzi się któryś czujnik lub przewód od tego czujnika wyświetlał się komunikat np "err"?

Portret użytkownika EDC

Termometr 2xDS18B20

Prosze. Tym razem potestowany bo miałem pod ręką.

'### PODWÓJNY TERMOMETR ###
Const Plytka_prototypowa = 1
 
#if Plytka_prototypowa = 1
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0       ', Wr = Portc.3
Config Lcd = 20 * 4
Config 1wire = Portc.5
#else
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5       'standard
Config Lcd = 16 * 2
Config 1wire = Portd.6
#endif
 
Cursor Off
Cls
 
Dim Dsid1(8) As Byte , Dsid2(8) As Byte
Dim N As Byte
Dim T As Integer
Dim S As String * 4
Const Blad = " ERROR " 'dla powtarzajacych sie tekstow warto wpisac je tylko raz
 
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
 
Lcd "  IN       OUT"
'*** START ***
Do
 
1wreset
 1wwrite &HCC
 1wwrite &H44
   Waitms 500
 
Locate 2 , 1
 
1wreset
 1wwrite &H55
 1wwrite Dsid1(1) , 8
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
 If T <> 0 Then
  S = Str(t)
  S = Format(s , "+0.0")
  Lcd S ; Chr(223) ; "C "
 Else
  Lcd Blad
 End If
 
1wreset
 1wwrite &HCC
 1wwrite &H44
   Waitms 500
 
Locate 2 , 10
 
1wreset
 1wwrite &H55
 1wwrite Dsid2(1) , 8
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
 If T <> 0 Then
  S = Str(t)
  S = Format(s , "+0.0")
  Lcd S ; Chr(223) ; "C "
 Else
  Lcd Blad
 End If
 
Loop
End

Wykrywa przerwy w obwodzie. Minus to to , że może ERROR pokazać przechodząc przez zero, ale to się zdarza rzadko by było równo 0.0 Jakoś nie chciało mi się tego sobie utrudniać :D
Można to też zapisać tak
1wreset
 1wwrite &H55
 1wverify Dsid2(1)
 If Err = 0 Then
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
  S = Str(t)
  S = Format(s , "+0.0")
  Lcd S ; Chr(223) ; "C "
 Else
  Lcd Blad
 End If

Zmienna Err jest systemową i zbiera rezultat ostatniej wykonywanej operacji. Jeśli operacja zakończy się sukcesem ma wartość 0.
W obydwu przypadkach jednak jeśli przy włączaniu urządzenia mamy tylko jeden czujnik to jego adres będzie przypisany do dwóch rejestrów. Jak zawsze wszystko można rozwiązać. Zależy co kto potrzebuje :D

-

BARTek
Moja strona

Portret użytkownika gosc

Termometr

Quote:

W obydwu przypadkach jednak jeśli przy włączaniu urządzenia mamy tylko jeden czujnik to jego adres będzie przypisany do dwóch rejestrów. Jak zawsze wszystko można rozwiązać. Zależy co kto potrzebuje :D

A jakby przypisał ID czujnika na stałe?

Portret użytkownika demsy1

termometr

Ten post wyżej to ja pisałem.Mam jeszcze jedno pytanie. Jak to jest z czujnikami DS18B20 że program odczytuje ID pierwszego czujnika jako pierwszy, a drugiego jako drugi? Zapewne procek wysyła zapytanie i czeka na odpowiedz DS i ten który pierwszy się odezwie to jest pierwszy. Od czego to zależy który pierwszy sie odezwie?

Portret użytkownika EDC

Odp. Termometr 2x DS18B20* Atmega 8

Proszę. Zapisuje do pamięci jeśli zwarta jest zworka lub naciśnięty przy uruchamianiu przycisk. Wprowadzając coś więcej można uczyć po jednym czujniku. Te procedury szukania i zapamiętywania adresów były by niepotrzebne gdyby dla każdego z czujników użyć osobnego pinu mikrokontrolera. Zawsze należy to rozważyć w zalezności jaki jest rozkład przewodów i zajętość wyprowadzeń mikrokontrolera. Piszę to jednak tak dla wprawy bo Dallas produkuje nie tylko te termometry hahahaha :D

'### PODWÓJNY TERMOMETR ###
$regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack = 128
$swstack = 64
$framesize = 64
 
Const Plytka_prototypowa = 1
 
#if Plytka_prototypowa = 1
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0       ', Wr = Portc.3
Config Lcd = 20 * 4
Config 1wire = Portc.5
#else
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5       'standard
Config Lcd = 16 * 2
Config 1wire = Portd.6
#endif
 
Cursor Off
Cls
 
Config Portc.2 = Input : Zworka Alias Pinc.2 : Set Zworka   'przycisk lub zworka
 
Dim Ee_dsid1(8) As Eram Byte At 1
Dim Ee_dsid2(8) As Eram Byte At 9
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim N As Byte
Dim T As Integer
Dim S As String * 4
Const Blad = " ERROR "
 
Waitms 10                                                   'na wszelki wypadek by ustalił sie stan na porcie
If Zworka = 0 Then                                          'jesli zworka zwiera do masy
Dsid1(1) = 1wsearchfirst()                                  'odczytaj ID czujnikow
Dsid2(1) = 1wsearchnext()
  For N = 1 To 8
   Ee_dsid1(n) = Dsid1(n)                                   'przepisz je do pamieci
   Ee_dsid2(n) = Dsid2(n)
  Next                                                      'jesli zworka rozwarta
Else
  For N = 1 To 8                                            'przepisz z pamieci do zmiennych
   Dsid1(n) = Ee_dsid1(n)
   Dsid2(n) = Ee_dsid2(n)
  Next
End If
 
Lcd "  IN       OUT"
'*** START ***
Do
 
1wreset
 1wwrite &HCC
 1wwrite &H44
   Waitms 500
 
Locate 2 , 1
 
1wreset
 1wwrite &H55
 1wverify Dsid1(1)                                          'sprawdz czy taki czujnik jest na szynie
 If Err = 0 Then                                            'jesli tak to odczyt
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
  S = Str(t)
  S = Format(s , "+0.0")
  Lcd S ; Chr(223) ; "C "
 Else                                                       'jesli czujnika nie ma wyswietl monit
  Lcd Blad
 End If
 
1wreset
 1wwrite &HCC
 1wwrite &H44
   Waitms 500
 
Locate 2 , 10
 
1wreset
 1wwrite &H55
 1wverify Dsid2(1)
 If Err = 0 Then
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
  S = Str(t)
  S = Format(s , "+0.0")
  Lcd S ; Chr(223) ; "C "
 Else
  Lcd Blad
 End If
 
Loop
End

Jeszcze jedno. Jeśli korzystasz z pamieci EEprom to radze zmienić FuseBit`y BODEN i BODLEVEL odpowiedzialne za to żeby procesor nie pracował jeśli zasilanie nie może zagwarantować poprawnej pracy. Bez tego po czasie w pamięci mogą pojawić się śmieci i trzeba będzie na nowo przyuczać czujniki.
Denerwująca tez może być ciągła konieczność uczenia po programowaniu. Spowodowane jest to tym, że pamieć EE jest czyszczona przy programowaniu. Można to wyłączyć programując bit EESAVE.

-

BARTek
Moja strona

Portret użytkownika maro

Termometr 4 x DS18B20

Witam.
Panowie widzę że kolega Bartek ma dużo wiedzy odnośnie bascoma. A ja chciałbym wykorzystać np 4 osobne porty do odczytu danych z DS...bo mam akurat dużo pinów na uC wolnych. Wiem że na początku nie piszę się config 1wire...

Config 1wire = Pinx.x

Myślałem o czymś takim, Jak na razie są tylko 2 ds

' Termometr DS18B20
$regfile = "m8def.dat"
$crystal = 8000000
 
Config Portb = &B00000000 : Portb = 11111111                'cały port jest wejściem : stany ustalone na wysokie
Config Portc = &B00000000 : Portc = 11111111                '                -//-
Config Portd = &B00111111 : Portd = 11111111                ' wejscie na 1Wire-PD7 reszta wyświetlacz
 
Config Lcdpin = Pind , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portd.5       'standard
Config Lcd = 16 * 2
Cursor Off Noblink
 
Dim Dsid1(8) As Byte , Dsid2(8) As Byte
Dim N As Byte
Dim T As Integer
Dim S As String * 4
 
Const Blad = " ERROR " 'dla powtarzajacych sie tekstow warto wpisac je tylko raz
 
 
'*** START ***
Do
Config 1wire = Portd.6
1wreset
 1wwrite &HCC
 1wwrite &H44
   Waitms 500
 
Locate 1 , 1
 
1wreset
 1wwrite &H55
 1wwrite Dsid1(1) , 8
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
 If T <> 0 Then
  S = Str(t)
  S = Format(s , "0.0")
  Lcd S ; Chr(223) ; "C "
 Else
  Lcd Blad
 End If
'****************************************
Config 1wire = Portd.7
1wreset
 1wwrite &HCC
 1wwrite &H44
   Waitms 500
 
Locate 1 , 10
 
1wreset
 1wwrite &H55
 1wwrite Dsid2(1) , 8
 1wwrite &HBE
 T = 1wread(2)
 T = T * 10
 T = T / 16
 If T <> 0 Then
  S = Str(t)
  S = Format(s , "0.0")
  Lcd S ; Chr(223) ; "C "
 Else
  Lcd Blad
 End If
 
Loop
End

Tyle że przy takim programie będzie wyświetlana temperatura mrugała

Portret użytkownika EDC

Odp. Termometr 4xDS18B20 + foto :)

No tak nie za bardzo ten Twój kodzik, ale wszystko przed Tobą :P
Programuję w różnych językach. Bardzo jednak cenię sobie kody Mirleja bo uczą matematycznego podejścia do niektórych spraw. Zmienne mogą być parametrem dla innych, a na parametrach jeszcze możesz działać. Poniżej kod dla czterech czujników, który gdyby się dobrze rozejrzeć tu na stronie każdy mógłby napisać :P

'### TERMOMETR 4xDS18B20 ###
$regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack = 128
$swstack = 64
$framesize = 64
 
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portc.0
Config Lcd = 20x4
Cursor Off
Cls
 
Dim N As Byte
Dim T As Integer
Dim S As String * 5
Dim Linia As Byte , Pozycja As Byte
 
Do
'jesli piny sa obok siebie to po kolei
For N = 4 To 7                                              'od numeru pinu w porcie do numeru pinu w porcie
 1wreset Pind , N                                           'dzialaj dla aktualnie ustawionego pinu
  1wwrite &HCC , 1 , Pind , N
  1wwrite &HBE , 1 , Pind , N
  T = 1wread(2 , Pind , N)
  T = T * 10
  T = T / 16
  S = Str(t)
  S = Format(s , "+0.0")
 
 Select Case N                                              'w zaleznosci od tego ktory to pin
  Case 4                                                    'ustaw kursor na wlasciwej pozycji
    Linia = 1
    Pozycja = 1
  Case 5
    Linia = 1
    Pozycja = 9
  Case 6
    Linia = 2
    Pozycja = 1
  Case 7
    Linia = 2
    Pozycja = 9
 End Select
 
  Locate Linia , Pozycja                                    'rysuj na wybranym miejscu
   Lcd S ; Chr(223) ; "C "
 
 1wreset Pind , N                                           'kaz przygotowac kolejny odczyt
  1wwrite &HCC , 1 , Pind , N
  1wwrite &H44 , 1 , Pind , N
Next
 
Wait 1
 
Loop
End

Hahaha miałem tylko dwa DS`y luzem :P

-

BARTek
Moja strona

Portret użytkownika maro

termometr 4xds18b20

Witam kolegę Bartka
Dobry kawałek roboty, wielkie dzięki, Nie wiem czy uda mi się sprawdzić kod jeszcze przed świętami, ale na pewno sprawdzę.

Wesołych świąt wszystkim życzę