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

[ATMEGA168][BASCOM][HISTEREZA]

zerolinux 29 Lip 2010 15:48 2044 6
REKLAMA
  • #1 8344023
    zerolinux
    Poziom 12  
    Witam.

    Mam problem z następującym kodem /fragment:

    
    Do
    
       Call Wezczas
    
    
       If Menu = 0 Then                                         'glowny program
    
          Call Wyswczas
    
          Waitms 300
    
          If Przeszlo = 0 Then
             1wreset                                            'reset
             1wwrite &HCC                                       'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
             1wwrite &H44
          End If
    
          Incr Przeszlo
          If Przeszlo > 3 Then
             1wreset                                            'reset
             1wwrite &HCC                                       'rozkaz adresowy SKIP ROM
             1wwrite &HBE                                       'rozkaz funkcyjny - polecenie odczytu DS18x20
             Odczyt(1) = 1wread(2)                              'odczytaj dwa pierwsze bajty
             T = Odczyt(2)                                      'przepisz starszy bajt do zmiennej typu Integer
             Shift T , Left , 8                                 'przesuń ten bajt w lewo na wyższe pozycje
             T = T + Odczyt(1)                                  'przepisz - dodaj młodszy bajt
    
             T1 = T * 0.0625
                                                          'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
             Napis = Fusing(t1 , "#.#")
    
             Locate 1 , 11 : Lcd Napis ; Chr(1) ; "C"
             Przeszlo = 0
          End If
    
          'sprawdzanie warunków   temperatura
    
    
          If Pora = 1 Then
             Jaka_temp = Jaka_temp - 0.2
             If Jaka_temp >= T1 Then
                Grzanie = 1
                Reset Grzalka
             End If
    
             Jaka_temp = Jaka_temp + 0.4
             If Jaka_temp <= T1 Then
                Grzanie = 0
                Set Grzalka
             End If
             Jaka_temp = Jaka_temp - 0.2
           Else
             Jaka_tempn = Jaka_tempn - 0.2
             If Jaka_tempn >= T1 Then
                Grzanie = 1
                Reset Grzalka
             End If
    
             Jaka_tempn = Jaka_tempn + 0.4
             If Jaka_tempn <= T1 Then
                Grzanie = 0
                Set Grzalka
             End If
             Jaka_tempn = Jaka_tempn - 0.2
           End If
    
    
    
    
    
    
    
    
          If Grzanie = 1 Then
             Locate 2 , 11 : Lcd "GRZANIE"
          Else
             Locate 2 , 11 : Lcd "       "
          End If
    
    
          Waitms 10
    
       End If
    
    Loop
    
    
    


    Czasem (zazwyczaj około 12 przestaje działać regulacja temperatury - zostaje cały czas na grzaniu.

    Na wyświetlaczu też wyświetla napis "GRZANIE", czas się zmienia, prawidłowo wyświetla temperaturę.

    Zmienna Pora typu Byte zmieniana jest o 6.00 i 21.00.
    Zmienne Jaka_temp i Jaka_tempn to single.

    Procesor na wewnętrznym oscylatorze 8MHz.

    Co jest nie tak?

    Rafał
  • REKLAMA
  • #2 8346393
    FastProject
    Poziom 28  
    Jeśli to jest uzależnione od godziny, to wina prawdopodobnie leży w części odczytującej i weryfikującej czas. Pokaż ten fragment kodu-jaki masz zegar RTC?
  • REKLAMA
  • #3 8346443
    zerolinux
    Poziom 12  
    Proszę oto ta procedura:
    
    Sub Wezczas
    
    I2cstart                                                    'odczyt czasu
       I2cwbyte &HA0
       I2cwbyte 2
    
       I2cstart
       I2cwbyte &HA1
       I2crbyte S , Ack
       I2crbyte M , Ack
       I2crbyte H , Nack
       I2cstop
    
       S = Makedec(s)
       M = Makedec(m)
       H = Makedec(h)
    End Sub
    


    RTC to PCF8583, ale kontrolowana temperatura w porze 1 jest najwyższa. W porze 0 jest niższa i nie zauważyłem takiego zachowania.
    W dodatku wyświetlana jest temeratura rzeczywista (kontrolowałem termometrem).
    Dzisiaj jeszcze spróbuję poobserwować co się dzieje.
  • REKLAMA
  • #4 8346806
    FastProject
    Poziom 28  
    No dobrze a od czego zależy wartość zmiennej "Pora"? Gdzie jest frkagmen odpowiedzialny za jej ustawianie?
  • #5 8347000
    piotr5000
    Poziom 21  
    zakładam że TempN = 20 st

    jeżeli T1 = 19 grzanie = 1 bo mniejsze od TempN- 0,2 czyli 19,8
    T1 rośnie do 19,9 i grzanie nie jest wyłączone , bo wyłączenie następuje dopiero przy 20,4 st
    Nie napisałeś jaka jest T1 i TempN w chwili gdy jest grzanie a nie powinno być ( w/g Ciebie bo program jak zwykle robi to co programista kazał )
  • REKLAMA
  • #6 8347050
    zerolinux
    Poziom 12  
    Jaka_temp=25 stopni, jaka_tempn=23 stopnie (tak przynalmniej jest ustawione), na wyświetlaczu w chwili zauważenia problemu było już 26,8 stopnia. Wystarczyło wejść do menu i było ok.

    W załaczniku cały kod programu. Uwaga może wywołać nieoczekiwane odruchy (wymioty, zawały itp) u co lepszych programistów.
  • #7 9742258
    zerolinux
    Poziom 12  
    Po wymianie grzałki problem samoistnie ustąpił
REKLAMA