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

bascom termostat atmega8 ds18b20

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

    
    $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
    
  • REKLAMA
  • Pomocny post
    #2 7388495
    Menuet
    Poziom 19  
    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.
  • REKLAMA
  • #3 7388983
    misiek1994
    Poziom 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.
    
    $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 7389419
    Menuet
    Poziom 19  
    Jeszcze nie jest do końca dobrze, bo tutaj porównujesz temperaturę, ale nie masz jej w "temp" tylko w "t":
    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.
  • REKLAMA
  • #5 7389473
    misiek1994
    Poziom 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???
  • REKLAMA
  • Pomocny post
    #6 7389583
    Menuet
    Poziom 19  
    Jasne, że się da :) np tak:
    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 7389761
    misiek1994
    Poziom 17  
    Jeszcze raz wielkie dzięki, dobry człowieku. Jestem twoim dłużnikiem.
REKLAMA