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

Termostat na 89C4051 w Bascom51 - brak porównania temperatury DS18B20

Spięcie 24 Mar 2007 21:49 1404 2
REKLAMA
  • #1 3715769
    Spięcie
    Poziom 12  
    Posty: 88
    Pomógł: 2
    Ocena: 1
    Witam ,jestem początkujący w tej dziedzinie, posiadam program termostatu, niestety program nie porównuje temperatury, nie wiem w czym problem
    już zmieniałem porównanie wartości Us z T1, obecnie zmieniłem na Tmp, ale niestety nadal nic się zmieniło nadal na wyjściu układu czyli P3.2 jest stan "0"


    oto program napisany w Bascomie51":

    'cyfrowy termostat

    'program obslugi termometru DS18B20
    '

    'P3.7 - magistrala 1wire ( do termometru )
    'P3.5 - przycisk zwiekszajacy temperature
    'P3.4 - przycisk zmniejszajacy temperature
    'P3.2 wyjscie termostatu ( np. do sterowania grzejnikiem )

    'uwaga: ustawiamy temperature tylko w wartosciach dodatnich



    $large
    Config 1wire = P3.7
    'konfiguracja magistrali 1wire
    Config Lcd = 20 * 2 'konfiguracja wyswietlacza
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte , R As Byte , Us As Byte
    Dim Tmp As String * 6
    Dim Znak As String * 1
    R = &HFF
    Us = 21
    Declare Sub 1wr 'podprogram resetujacy magistrale 1w
    Cursor Off
    Cls
    P3.5 = 1
    P3.4 = 1
    Do
    1wr 'podprogram 1wr
    1wwrite &HCC 'komenda skip ROM
    1wwrite &H44 'komenda convert T
    Wait 1
    1wr 'podprogram 1wr
    1wwrite &HCC 'komenda skip ROM
    1wwrite &HBE 'komenda read

    B1 = 1wread() 'odczyt z termometru
    B2 = 1wread()

    1wr 'podprogram 1wr

    If B2 >= 248 Then 'w przypadku temperatur ujemnych
    B1 = R - B1 'Od 255 Odejmujemy B1
    B2 = R - B2 'od 255 odejmujemy B2
    Znak = "-"
    Else
    Znak = "+"
    End If
    T1 = B1 / 16 'Przesuniecie w pawo o 4 bajty
    T2 = B2 * 16 'przesuniecie w lewo o 4 bajty
    T1 = T1 + T2

    Tmp = Fusing(t1 , ###.&)
    If P3.5 = 0 And Us < 126 Then 'sprawdzanie nacisnieci przycisku w gore
    Incr Us 'zwiekszanie temperatury
    End If
    If P3.4 = 0 And Us > 1 Then 'sprawdzanie nacisniecia przycisku w dol
    Decr Us 'zmniejszanie temperatury
    End If



    Locate 1 , 1 'ustawienie kursora w pierwszej lini i pierwszy znak
    Lcd Znak ; Tmp ; Chr(1) ; "C " 'wyswietlenie zmierzonej temperatury
    Locate 2 , 2 'ustawienie kursora w drugiej lini drugi znak
    Lcd Us ; ".0" ; Chr(1) ; "C " 'wyswietlenie temperatury ustawionej
    Waitms 250

    If Us > Tmp Then 'porownanie temperatur
    P3.2 = 1 'ustawienie stanow wyjsciowych dla
    'temperatury otoczenia nizszej od ustawionej
    Else
    P3.2 = 0 'a tu odwrotnie
    'ustawienie stanow wyjsciowych dla temperatury wyzszej od ustawionej
    End If


    Loop

    Sub 1wr 'podprogram resetujacy magistrale
    1wreset
    End Sub
  • REKLAMA
  • #2 3716897
    Spięcie
    Poziom 12  
    Posty: 88
    Pomógł: 2
    Ocena: 1
    Nikt nie jest w stanie mi pomóc?
    nie wie wiem dla czego kontroler nie porównuje wartości
  • Pomocny post
    #3 3717300
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    Spięcie napisał:
    Nikt nie jest w stanie mi pomóc?
    nie wie wiem dla czego kontroler nie porównuje wartości

    Rozumiem że jesteś początkujący , ale nawet Ty powinieneś wiedzieć , że nie porównuje się zmiennej binarnej(Us) ze stringiem (Tmp) :(
    To tak , jak byś porównywał kilogram z czerwonym :D
    Poza tym , ten program jest niezwykle pamięciożerny(Fusing,Single).
    Jeśli ten termostat będzie pracował wyłącznie w temperaturach dodatnich , to możesz "oprzeć się" na poniższym(nie sprawdzonym) przykładzie:
    
    'program obslugi termometru DS18B20
    '
    $regfile = "89c4051.dat"
    'P3.7 - magistrala 1wire ( do termometru )
    'P3.5 - przycisk zwiekszajacy temperature
    'P3.4 - przycisk zmniejszajacy temperature
    'P3.2 wyjscie termostatu ( np. do sterowania grzejnikiem )
    
    'uwaga: ustawiamy temperature tylko w wartosciach dodatnich
    '$large
    Const Dif = 4
    Const Digits = 3
    
    Config 1wire = P3.7
    Config Lcd = 20 * 2       'konfiguracja wyswietlacza
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32       'znak stopnia
    
    Dim Tt As Byte , Xpos As Byte , Ypos As Byte
    Dim T1 As Byte , St1 As String * 4 , Spaces As Byte
    Dim B1 As Byte , B2 As Byte , T2 As Byte
    Dim Us As Byte , Lop As Byte
    
    Declare Sub Display_t(tt As Byte , Xpos As Byte , Ypos As Byte)
    
    Us = 21
    Cursor Off
    Cls
    P3.5 = 1
    P3.4 = 1
    Do
       1wreset       'podprogram 1wr
       1wwrite &HCC       'komenda skip ROM
       1wwrite &H44       'komenda convert T
       For Lop = 0 To 40
          Gosub Scan_keys
          Waitms 20
       Next
       1wreset       'podprogram 1wr
       1wwrite &HCC       'komenda skip ROM
       1wwrite &HBE       'komenda read
       B1 = 1wread()       'odczyt z termometru
       B2 = 1wread()
       B1 = B1 / 16         ,obliczenia wyłącznie...
       B2 = B2 * 16         , dla temperatur dodatnich.
       T1 = B1 + B2
       Call Display_t(t1 , 1 , 1)
       If Us > T1 Then       'porownanie temperatur
          P3.2 = 1       'ustawienie stanow wyjsciowych dla
          'temperatury otoczenia nizszej od ustawionej
       Elseif Us < T1 Then
          P3.2 = 0       'a tu odwrotnie
          'ustawienie stanow wyjsciowych dla temperatury wyzszej od ustawionej
       End If
    Loop
    
    Scan_keys:
       If P3.5 = 0 And Us < 125 Then       'sprawdzanie nacisnieci przycisku w gore
          Incr Us       'zwiekszanie temperatury
       End If
       If P3.4 = 0 And Us > 1 Then       'sprawdzanie nacisniecia przycisku w dol
          Decr Us       'zmniejszanie temperatury
       End If
       Call Display_t(us , 2 , 2)
    Return
    
    
    Sub Display_t(tt As Byte , Xpos As Byte , Ypos As Byte)
       St1 = Str(tt)
       Spaces = Digits - Len(st1)
       If Spaces > 0 Then Lcd Spc(spaces)
       Lcd St1 ; Chr(1) ; "C "
    End Sub
    


    Zauważ różnice w wielkości kodu wynikowego - 1kB drogą nie chodzi ;)

    Piotrek
REKLAMA