logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

DS18B20 >> procedura sprawdzająca obecnosc na pinie

KanGu 07 Maj 2006 18:59 2103 13
  • #1 2602171
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Mam następujący problem:
    Napisałem w Bascom'ie program do odczytu 2 temperatur (na 2 różnych pinach) drugim zadaniem programu było przetwarzanie sygnałów odebranych z komputera i otwieranie odpowiednich wyjść jednak zauważyłem ze gdy brakuje jednego termometru następują błędy transmisji lub jest ona mocno opóźniona.
    Config 1wire = Portd.5
    1wreset
    1wwrite Skip_rom
    1wwrite Convert
    Waitms 800
    1wreset
    1wwrite Skip_rom
    1wwrite Read_sp
    Bd(1) = 1wread(9)
    1wreset
    Tmp = Bd(2) * 256
    Tmp = Tmp + Bd(1)
    Wynik = Tmp
    Wynik = Wynik / 16
    


    Tak wygląda odczyt czy ktoś zna procedura którą można umieścić przed tym żeby zanim dokona pomiaru sprawdziła czy jest tam DS a jeśli nie ma podała komunikat ERR.
  • #2 2602184
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Po 1wreset sprawdź zmienną Err.Dla Err=1 brak DS-a.
    Wszystko ;)

    Piotrek
  • #3 2604249
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Nawet jak sprawdzam zmienna err=1 i kaze wyswietlic tylko komunikat error na LCD nadal są problemy z transmisją jeżeli brak jednogo z DS'ow.

    
    1wreset
    if err=1 then
    lcd error 
    else 
    1wreset 
    1wwrite Skip_rom 
    1wwrite Convert 
    

    reszta analogicznie
  • #4 2604310
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    Hm
    a może wina nie leży w części programu odpowiadającej za odczyt ds'a tylko w częci komunikacji. ja odczytuje 2 termometry na 2 odrębnych pinach i na trzecim pinie pastylkę pamięci. nie mam najmniejszych problemów wyciągam termometr i mam napis Sensor 1 uszkodzony.. albo 2-gi zależy który wyciągnę, ale cała reszta programu chodzi idealnie. mogę ustawić zegarek, odczytać pastylkę , sprawdzić drugą temperature.... nic się nie dzieje żadnych opuźnień

    Dodano po 24 [minuty]:

    • Config 1wire = P3.6
      Tsensor Alias P3.7
      Tsensorout Alias P1.0
      Do
      Gosub Tsens
      gosub Ibutton
      If ....gosub Tsensout"...endif 'drugi sensor temperatury sparawdzam na żądanie
      Loop
      Tsens: 'odczyt termometru z portu P3.7 - Wewnętrzny
      1wreset Tsensor
      If Err = 1 Then
      Flagtsens = 0
      Return
      Else
      Flagtsens = 1
      1wwrite &HCC Tsensor 'skip rom
      1wwrite &H44 Tsensor 'dokonaj konwersji
      Waitms 750 'odczekaj na czas konwersji
      1wreset Tsensor 'reset
      1wwrite &HCC Tsensor 'skip rom
      1wwrite &HBE Tsensor 'rozkaz funkcyjny - polecenie odczytu DS1820
      Odczyt(1) = 1wread(2 , P3.7) 'odczytaj 2 pierwsze bajty
      T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8 'przesuń ten bajt w lewo na wyrzsze pozycje
      T = T + Odczyt(1) 'przepisz dodaj mlodszy bajt
      T1 = T / 2
      End If
      Return
      '===============================================
      Tsensout: 'odczyt termometru z portu P1.0 - Zewnętrzny
      1wreset Tsensorout
      If Err = 1 Then
      Return
      Else
      1wwrite &HCC Tsensorout 'skip rom
      1wwrite &H44 Tsensorout 'dokonaj konwersji
      Waitms 750 'odczekaj na czas konwersji
      1wreset Tsensorout 'reset
      1wwrite &HCC Tsensorout 'skip rom
      1wwrite &HBE Tsensorout 'rozkaz funkcyjny - polecenie odczytu DS1820
      Odczyt(1) = 1wread(2 , P1.0) 'odczytaj 2 pierwsze bajty
      T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8 'przesuń ten bajt w lewo na wyrzsze pozycje
      T = T + Odczyt(1) 'przepisz dodaj mlodszy bajt
      T1 = T / 2
      End If
      Return
      '============================================
      Ibutton:
      1wreset
      if err= 1 then : return
      else
      1wwrite &H33 'rozkaz odczytaj ROM
      For I = 1 To 8
      Ar(i) = 1wread() 'wpisz do tablicy (numer ID)
      Next
      return


    Dodano po 1 [minuty]:

    to u mnie działa tylko Sub Ibutton pisałem w skrócie
  • #5 2604497
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    KanGu:arrow: Jak zmieniasz pin magistrali 1wire , może poprzez Config 1wire=Portx.x :?: Jeśli tak , to ten numer nie przejdzie - trzeba tak , jak to pokazał polik80.

    Piotrek
  • #6 2604884
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Cytat:

    Config 1wire = P3.6
    Tsensor Alias P3.7
    Tsensorout Alias P1.0

    Powyżej widze że zmienna Tsensor została przypisana do portu 3.7 a Tsensorout do portu 1.0
    A pastylka pamięci została przypisana do portu 3.6
    Nie rozumiem tego troche czy mógłbys mi podwpowiedziec jak dokładnie to zastosować w moim przypadku bo rozumiem że chodzi tu o to żeby zamiast za każdym razem odwoływać się do portu odwołać się do zmiennej odpowiadającej danemu portowi
    Cytat:

    1wreset Tsensor
    If Err = 1 Then
    Flagtsens = 0
    Return
    Else
    Flagtsens = 1

    Co to za komenda Flag?

    Po pracy to przetestuje i od razu napisze czy pomogło.
  • #7 2605432
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    ta komenda flagtens to jest poprostu moja flaga cały program którego częś ci podałem jest durzo większy i ciągle w trakcie twożenia. Flagę tą ustawiam sobie żeby w innej części programu nie resetować już 1wira i nie sprawdzać go ponownie poprzez err. w części programu wywołującej alarmy na wyświetlacz sprawdzam sobie właśnie tą flagę. natomiast funkcja Alias jest wzięta z helpa BASCOMA 8051. Zerknij do przykładów podanych w helpie bo to jest dokładnie to co ja mam. trochę inaczej będzie to wyglądało w BASCOM AVR ale znajomy który bawił się atmegą uruchomił to też z funkcji podanej w helpie.

    Dodano po 2 [minuty]:

    Ps. sam nie wiem do końca jak ta funkcja działa ale działa :)
  • #8 2605869
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Przypisałem dla dwóch temperatur to zmienną poprzez alias i dodałem do procedury odczytującej nazwę tej zmiennej tak jak ty to zrobiłeś jednak teraz program nie chce mi się skompilować.
    Wyskakuje mi błąd
    Can't find HW-register

    Jakieś sugestie

    
    Const Skip_rom = &HCC
    Const Convert = &H44
    Const Read_sp = &HBE
    Const Write_sp = &H4E
    Const Copy_sp = &H48
    Const Recall_ee = &HB8
    Const Search_rom = &HF0
    Const Read_rom = &H33
    Const Match_rom = &H55
    Const Alarm = &HEC
    
    Dim Name As String * 10
    Dim Bd(9) As Byte
    Dim Tmp As Integer
    Dim Wynik As Single
    Dim Temp1 As String * 10
    '-------------------------------
    Sub Temperatura1
    Config 1wire = Portd.5
    1wreset
    If Err = 1 Then
    Locate 1 , 7
    Lcd "ERR   "
    Else
    1wwrite Skip_rom
    1wwrite Convert
    Waitms 800
    1wreset
    1wwrite Skip_rom
    1wwrite Read_sp
    Bd(1) = 1wread(9)
    1wreset
    Tmp = Bd(2) * 256
    Tmp = Tmp + Bd(1)
    Wynik = Tmp
    Wynik = Wynik / 16
    End If
    End Sub
    


    tak mam bez przeróbek w przeróbce dopisuje tylko
    
    Termometr1 Alias Portd.5
    '-------------------------------------
    'Analogicznie dopisuje tylko po poszczególnych procedurach typu
    ' wwrite,wreset nazwę działania i zmiennej Termometr1
    ' i usuwam Config 1wire = Portd.5
    1wreset termometr1
    
  • #9 2606430
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    KanGu napisał:

    
    Termometr1 Alias Portd.5
    '-------------------------------------
    'Analogicznie dopisuje tylko po poszczególnych procedurach typu
    ' wwrite,wreset nazwę działania i zmiennej Termometr1
    ' i usuwam Config 1wire = Portd.5
    1wreset termometr1
    

    Kurde , to nie możesz zajrzeć do pomocy :!:
    Składnia dla 1wreset jest 1wreset , Port , Numerbitu i dla każdej innej operacji 1wire z dowolnym pinem jest podobnie.
    Coś na osłodę - taki szkic poglądowy ;)
    
    $regfile = "m8def.dat"
    $framesize = 32
    $hwstack = 64
    $swstack = 64
    Const Skip_rom = &HCC
    '... itd.
    Const Alarm = &HEC
    
    Declare Function Get_temperature(byval Nr As Byte) As Integer
    Declare Function Set_convert(byval Nr As Byte) As Byte
    
    Ds Alias Portd       '2 x DS18x20 na jednym porcie - różnych pinach
    
    Nr1 Alias 0       'pind.0
    Nr2 Alias 5       'pind.5
    
    Dim Tmpr As Integer
    Dim Err1 As Byte , Err2 As Byte
    
    Do
       Err1 = Set_convert(nr1)
       Err2 = Set_convert(nr2)
       Wait 800                               ' po co 2 razy czekać ;)
       Tmpr = Get_temperature(nr1)
       If Err = 0 And Err1 = 0 Then
          Locate 1 , 1
          Lcd "DSnr1 " ; Tmpr ; " C";
       Else
          Lcd "err " ; Nr1;
       End If
    'j/w dla nr2 lub kolejna funkcja ;)
    Loop
    
    Function Set_convert(byval Nr As Byte) As Byte
       1wreset Ds , Nr
       If Err = 0 Then
          1wwrite Skip_rom , 1 , Ds , Nr
          1wwrite Convert , 1 , Ds , Nr
       End If
       Set_convert = Err
    End Function
    
    Function Get_temperature(byval Nr As Byte) As Integer
    Local Ttt As Integer
       1wreset Ds , Nr
       If Err = 1 Then Return
       1wwrite Skip_rom , 1 , Ds , Nr
       1wwrite Read_sp , 1 , Ds , Nr
       Ttt = 1wread(2 , Ds , Nr) / 16
       Ttt = Ttt / 16       'dla DS18b20 12bit - całkowita
       Get_temperature = Ttt
    End Function
    


    Piotrek
  • #10 2609973
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    
    Do
     Err1 = Set_convert(nr1)
     Err2 = Set_convert(nr2)
     Waitms 800
      Tmpr = Get_temperature(nr1)
       If Err = 0 And Err1 = 0 Then
          Locate 1 , 1
          Lcd "DSnr1 " ; Tmpr ; " C";
       Else
          Locate 1 , 1
          Lcd "err1"
       End If
    
      Tmpr2 = Get_temperature(nr2)
      If Err = 0 And Err2 = 0 Then
      Locate 2 , 1
      Lcd "DSnr2 " ; Tmpr2 ; " C";
      Else
      Locate 2 , 1
      Lcd "err2"
      End If
    


    Napisałem to w taki sposób reszte zostawiłem tak jak u ciebie i zamiast temperatury na LCD widze tylko err1 i na dole err2. Czemu moze to u mnie nie działać. Dodam że bascom u mnie nie rozpoznaje tych komend
    
    $hwstack = 64
    $swstack = 64
    
  • #11 2610052
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Aliasy do pinów dostosowałeś do swoich połączeń :?:
    Którą masz wersję Bascoma :?:
    Jaki to procek :?:

    Piotrek
  • #12 2610129
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Tak aliasy na pewno dobrze DS'y mam akurat na portach d4, d5, a mikrokontroler to atmega8 wiec prawie identycznie jak u ciebie wersja bascoma 1.11.7.4
  • #13 2613327
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    Może chodzi o zasilanie DS'ów bo obecnie zasilam je z pinu D a vcc mam zwarte z masą?
  • #14 2621635
    KanGu
    Poziom 13  
    Posty: 76
    Pomógł: 4
    Ocena: 1
    
    1wreset Pind , 5
    If Err = 1 Then
    Locate 1 , 7
    Lcd "ERR   "
    Else
    1wwrite &HCC , 1 , Pind , 5
    1wwrite &H44 , 1 , Pind , 5
    Waitms 800
    1wreset Pind , 5
    1wwrite &HCC , 1 , Pind , 5
    1wwrite &HBE , 1 , Pind , 5
    Bd(1) = 1wread(9 , Pind , 5)
    1wreset Pind , 5
    Tmp = Bd(2) * 256
    Tmp = Tmp + Bd(1)
    Wynik = Tmp
    Wynik = Wynik / 16


    Udało mi się dojśc ładu z więcej niż 1 urządzenim 1-Wire jednak nadal mam ten sam problem co wcześniej mianowicie jak jest brak dwóch termometrów nie moge nawiązać transmisji przez RS232 wczesniej wystepowało to juz przy braku jednego.

    
    Do
      Name = Inkey()
      If Err = 0 Then
      Call Odczyt
      End If
    
      Call Temperatura1
      Call Temperatura2
    Loop
    


    Tak wygląda pętla główna gdzie w odczycie mikrokontroler ma wykonać jakąs czynność po odebraniu odpowiednie znaku.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z odczytem temperatury z dwóch czujników DS18B20 podłączonych do różnych pinów mikrokontrolera w Bascomie. Głównym problemem jest występowanie błędów transmisji lub opóźnień, gdy jeden z termometrów jest odłączony. Proponowane rozwiązania obejmują sprawdzanie obecności czujnika za pomocą procedury 1wreset i zmiennej Err, która sygnalizuje brak urządzenia 1-Wire. Wskazano, że każda operacja 1-Wire powinna być wykonywana z podaniem portu i numeru pinu, co jest istotne dla poprawnej komunikacji. Użycie aliasów do przypisania pinów ułatwia zarządzanie wieloma urządzeniami na różnych portach. Zwrócono uwagę na konieczność poprawnego zasilania czujników oraz na prawidłową składnię komend 1-Wire w Bascomie. Przykładowe fragmenty kodu pokazują implementację funkcji Set_convert i Get_temperature z obsługą błędów, które pozwalają na wykrycie braku czujnika i wyświetlenie komunikatu ERR na LCD. Pomimo zastosowania tych metod, nadal występują problemy z transmisją RS232, gdy oba czujniki są nieobecne. Dyskusja podkreśla znaczenie prawidłowego przypisania pinów, konfiguracji 1-Wire oraz obsługi błędów w celu stabilnej pracy systemu z wieloma czujnikami DS18B20.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA