Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

bascom termostat atmega8 ds18b20

misiek1994 14 Dec 2009 16:55 6268 6
  • #1
    misiek1994
    Level 17  
    Mógłby ktoś zerknąć na kod? Portami się nie przejmujcie. Z góry dzięki!

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    Config Portd = Output

    Config 1wire = Portb.0                                      ' termometr ds18b20
    Dim I As Integer                                            'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4
    Dim H As String * 4


    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"
       Lowerline "Ustaw.:" ; T1 ; Chr(0) ; "C"


       T1 = 20
       H = 3
       If Portd.1 = 1 & Portd. = 1 Then
          Lcd "Histereza:" ; H ; Chr(0) ; "C"
       If Portd.1 = 1 Then
       H = H + 1
       End If
       If Portd.2 = 1 Then
       H = H - 1
       End If
       Else If Portd.1 = 1 Then
       T1 = T1 + 1
       Else If Portd.2 = 1 Then
       T1 = T1 - 1
       End If

    A1 = T - H
    A2 = T + H


    If Temp <= A1 Then
    Portb.2 = 1
    Waitms 50
    Stan = 1
    End If

    If Temp >= A2 Then
    Waitms 50
    Portb.2 = 0
    Stan = 0
    End If

    Loop
  • Helpful post
    #2
    Menuet
    Level 18  
    Witam,
    Nie wiem za bardzo co można sprawdzić w tym listingu, bo nie wiadomo co ma do końca robić, ale się nie kompiluje z kilku powodów:

    -niezadeklarowana zmienna "T1"
    -zmiennej typu String "H" nie można zwiększać ani zmniejszać jak zwykłej zmiennej, także nie można jej porównywać ze zmienną liczbową
    -polecenie "Lowerline" nie jest równoznaczne z jednoczesnym wyświetleniem tego co występuje po nim na lcd, służy tylko do ustawienia kursora na dolnej linijce
    -sprawdzanie stanu pinów nie wykonuje się sprawdzając stan rejestru PORT tylko rejestru PIN.

    To tyle co można na pierwszy rzut oka powiedzieć jak będzie wiadomo jak program ma dokładnie działać to będzie można coś więcej powiedzieć o nim.

    Pozdrawiam, Menuet.
  • #3
    misiek1994
    Level 17  
    Pisze w temacie, że chodzi o termostat oparty na ds18b20 oraz medze8. Serdeczne dzięki za odpowiedź. Jestem w temacie bascoma nie najlepszy. Poprawiłem delikatnie kod i wygląda na to, że już się kompiluje w miare. Za jakiekolwiek inne sugestie będe niezmiernie wdzięczny.
    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    Config Portd = Output

    Config 1wire = Portb.0                                      ' termometr ds18b20
    Dim I As Integer                                            'zmienne do odczytu temp.
    Dim S As Single
    Dim T As String * 4
    Dim T1 As Single
    Dim H As Single
    Dim A1 As Single
    Dim A2 As Single


    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"
       Lowerline
       Lcd "Ustaw.:" ; T1 ; Chr(0) ; "C"


       T1 = 20
       H = 3
       If Pind.1 = 1 And Pind.2 = 1 Then
       Goto Hist
       End If
       If Pind.1 = 1 Then
       T1 = T1 + 1
       End If
       If Pind.2 = 1 Then
       T1 = T1 - 1
       End If

    A1 = T1 - H
    A2 = T1 + H


    If Temp <= A1 Then
    Portb.1 = 1
    Waitms 50
    End If

    If Temp >= A2 Then
    Waitms 50
    Portb.1 = 0
    End If

    Loop

    Hist:
          Lcd "Histereza:" ; H ; Chr(0) ; "C"
       Waitms 1000
       If Pind.1 = 1 Then
       H = H + 1
       End If
       If Pind.2 = 1 Then
       H = H - 1
       End If
       Waitms 50
       Return
       End


    EDIT: H - histereza, T-temperatura zczytana T1-temp. nastawiona, A1,A2-zmienne pomocnicze.
  • #4
    Menuet
    Level 18  
    Jeszcze nie jest do końca dobrze, bo tutaj porównujesz temperaturę, ale nie masz jej w "temp" tylko w "t":
    Code:
    If Temp <= A1 Then
    
    Portb.1 = 1
    Waitms 50
    End If

    If Temp >= A2 Then
    Waitms 50
    Portb.1 = 0
    End If


    w tym kodzie co zacytowałem, to wyrzuciłbym te opóźnienia, bo nie są potrzebne.
    A tak ogólnie to w Twoim programie nie da się w ogóle ustawić ani temperatury ani histerezy, bo co pomiar ustalasz je na wartości domyślne, daj je przed pętlą i będzie ok.
    i jeszcze jak użyjesz goto to to jest skok bez śladu na stosie, czyli program Ci się zakończy i tyle, jakbyś użył gosub i na końcu tego "hist" dał return to będzie działać, ale tak poza tym to ten podprogram nie jest tak bardzo potrzebny, bo możesz go i tak wykonać w głównej pętli, a nie używasz go kilka razy, więc na kodzie nie zaoszczędzisz :)

    Pozdrawiam, Menuet.
  • #5
    misiek1994
    Level 17  
    To powiedz mi jeszcze, czy dałoby się zrobić taki podprogramik do ustawiania histerezy: naciśniesz 2 klawisze naraz wchodzisz i siedzisz tam, zmieniasz +/-, jak powtórnie zewrzesz 2 przyciski to wyłazisz stamtąd???
  • Helpful post
    #6
    Menuet
    Level 18  
    Jasne, że się da :) np tak:
    Code:
    If Pind.1 = 1 And Pind.2 = 1 Then
    
       Waitms 500                                               'oczekiwanie żeby odrazu nie wyjść z pętli
       Do                                                       'nieskończona pętla
          Lowerline                                             'ustawienie kursora
          Lcd "Histereza:" ; H ; Chr(0) ; "C"                   'wyświetlenie histerezy
          If Pind.1 = 1 Then                                    'jeśli guzik wciśnięty to zwiększ
             H = H + 1
             Waitms 200                                         'odczekaj chwile, żeby było wolniej
          End If
          If Pind.2 = 1 Then                                    'a tutaj zmniejsz jak trzeba
             H = H - 1
             Waitms 200
          End If
          If Pind.1 = 1 And Pind.2 = 1 Then                     'sprawdzenie czy dwa guziki wciśnięte
             Exit Do
          End If
       Loop
    End If       


    można to oczywiście inaczej rozwiązać...
    mam nadzieje, że pomogłem :)
  • #7
    misiek1994
    Level 17  
    Jeszcze raz wielkie dzięki, dobry człowieku. Jestem twoim dłużnikiem.